${ROOTDIR}/sw/vec/softrvv/include
softrvv.h
repo sync
m renode_clean renode
m qemu_clean qemu
Go to the following spreadsheet and write or select one's name under the DRI - Unit Test
.
Now you've signed up to develop a unit test for this vector instruction :)
Side Note: The following pivot table is very useful for quickly scanning through the instructions available: DRI Pivot Table
${ROOTDIR}/sw/vec/softrvv/include
Add definition of the operation as a file softrvv_<op>h.h
in the following folder, where <op>
is your operation (e.g. vadd
, vor
, vmerge
, etc...):
${ROOTDIR}/sw/vec/softrvv/include
This test will contain the definition of the operation (e.g. vadd
operation below):
template <typename T> void vadd_vi(T *dest, T *src1, T src2, int32_t avl) { for (int32_t idx = 0; idx < avl; idx++) { dest[idx] = src1[idx] + src2; } }
See softrvv_vadd.h for a reference.
softrvv.h
Add the header file as an includes in the softrvv.h
:
#include "softrvv_vadd.h"
softrvv.h
is in the ${ROOTDIR}/sw/vec/softrvv/include
directory.
cd
into the following folder, and edit the CMakeLists.txt
file there
${ROOTDIR}/sw/vec/tests/CMakeLists.txt
Add an entry there with the opcode formats relavant to the operation:
vec_cc_generated_test( NAME vadd OPFMT OPIVV OPIVX OPIVI LINKOPTS -Xlinker --defsym=__itcm_length__=200K )
Note: this operation uses OPIVV, OPIVX, and OPIVI formats.
A range of tests will be be autogenerated for each one of the OPFMT's added.
The Mako templates for each OPFMT test can be found at ${ROOTDIR}/sw/vec/tests/templates
.
Note on __itcm_length__
: keeping this number low for each test helps our overall performance, most tests are good with 128K, some might need a little more memory (ctest
will let you know if you need to add more here).
Please also add a small manual test the new softvv instruction. Steps delineated as follows:
cd ${ROOTDIR}/sw/vec/softrvv/tests
Then add a test-file named softrvv_<op>_test.cpp
.
See other files in the same folder as references.
In this test-file you'll define a few simple test cases to run on the defined functions:
See for example this VV test from softrvv_vadd_test.cpp:
uint32_t src1[] = {1, 2, 3, 4, 5}; uint32_t src2[] = {1, 2, 3, 4, 5}; uint32_t ref_vv[] = {2, 4, 6, 8, 10}; TEST_F(SoftRvvVaddTest, VV) { softrvv::vadd_vv<uint32_t>(dest, src1, src2, AVL_CONST); ASSERT_EQ(memcmp(dest, ref_vv, sizeof(dest)), 0); }
Edit another CMakeLists.txt file (path below):
${ROOTDIR}/sw/vec/softrvv/tests/CMakeLists.txt
Add the subtest just created:
vec_cc_test( NAME softrvv_vadd SRCS softrvv_vadd_test.cpp DEPS softrvv LINKOPTS -Xlinker --defsym=__itcm_length__=128K
Tests must be run from the ${ROOTDIR}/out/springbok
directory.
cd ${ROOTDIR}/out/springbok
Next, using Regex in the quoted section, select qemu, renode, and/or other operations to include in a test run:
m springbok && ctest --verbose -R ".*vadd.*" --gtest_color=yes
Code for the main test was autogenerated, however by cd
'ing into the following directory, one can inspect the generated code.
${ROOTDIR}/out/springbok/tests/generated/
Note: at minimum, one's test should be expected to pass in Qemu. Since Renode vec support is WIP, a unit test failing may indicate problem in the Renode implementation.
On the unit test tracker:
At this point there are two commitable chunks:
These may be added as either one CL, or two CL's separating these two contributions.