Switch from VLM to VLE in VCPOP tests
Atm our VLM is broken. Use VLE with reinterpret for VCPOP tests.
Dedicated VLM/VSM tests will be added later.
Added fractional byte support so we can test VCPOP more thouroughly.
Change-Id: I531270db1fe23d380903fb96c4c8772cecf850b6
diff --git a/tests/cocotb/rvv/vcpop_test.cc b/tests/cocotb/rvv/vcpop_test.cc
index 0e3ac5f..a91826e 100644
--- a/tests/cocotb/rvv/vcpop_test.cc
+++ b/tests/cocotb/rvv/vcpop_test.cc
@@ -16,7 +16,7 @@
#include <stdint.h>
namespace {
-constexpr size_t buf_size = 128;
+constexpr size_t buf_size = 16;
}
size_t vl __attribute__((section(".data"))) = buf_size;
@@ -26,32 +26,38 @@
extern "C" {
__attribute__((used, retain)) void vcpop_m_b1() {
- auto data = __riscv_vlm_v_b1(in_buf, vl);
+ auto data =
+ __riscv_vreinterpret_v_u8m1_b1(__riscv_vle8_v_u8m1(in_buf, (vl + 7) / 8));
result = __riscv_vcpop_m_b1(data, vl);
}
__attribute__((used, retain)) void vcpop_m_b2() {
- auto data = __riscv_vlm_v_b2(in_buf, vl);
+ auto data =
+ __riscv_vreinterpret_v_u8m1_b2(__riscv_vle8_v_u8m1(in_buf, (vl + 7) / 8));
result = __riscv_vcpop_m_b2(data, vl);
}
__attribute__((used, retain)) void vcpop_m_b4() {
- auto data = __riscv_vlm_v_b4(in_buf, vl);
+ auto data =
+ __riscv_vreinterpret_v_u8m1_b4(__riscv_vle8_v_u8m1(in_buf, (vl + 7) / 8));
result = __riscv_vcpop_m_b4(data, vl);
}
__attribute__((used, retain)) void vcpop_m_b8() {
- auto data = __riscv_vlm_v_b8(in_buf, vl);
+ auto data =
+ __riscv_vreinterpret_v_u8m1_b8(__riscv_vle8_v_u8m1(in_buf, (vl + 7) / 8));
result = __riscv_vcpop_m_b8(data, vl);
}
__attribute__((used, retain)) void vcpop_m_b16() {
- auto data = __riscv_vlm_v_b16(in_buf, vl);
+ auto data = __riscv_vreinterpret_v_u8m1_b16(
+ __riscv_vle8_v_u8m1(in_buf, (vl + 7) / 8));
result = __riscv_vcpop_m_b16(data, vl);
}
__attribute__((used, retain)) void vcpop_m_b32() {
- auto data = __riscv_vlm_v_b32(in_buf, vl);
+ auto data = __riscv_vreinterpret_v_u8m1_b32(
+ __riscv_vle8_v_u8m1(in_buf, (vl + 7) / 8));
result = __riscv_vcpop_m_b32(data, vl);
}
}
diff --git a/tests/cocotb/rvv_assembly_cocotb_test.py b/tests/cocotb/rvv_assembly_cocotb_test.py
index ca7ee80..8af90c7 100644
--- a/tests/cocotb/rvv_assembly_cocotb_test.py
+++ b/tests/cocotb/rvv_assembly_cocotb_test.py
@@ -285,13 +285,22 @@
fixture = await Fixture.Create(dut)
r = runfiles.Create()
cases = [
- # lmul>1 currently fail
- # {'impl': 'vcpop_m_b1', 'vl': 1024},
- # {'impl': 'vcpop_m_b2', 'vl': 512},
- # {'impl': 'vcpop_m_b4', 'vl': 256},
- {'impl': 'vcpop_m_b8', 'vl': 128},
- {'impl': 'vcpop_m_b16', 'vl': 64},
- {'impl': 'vcpop_m_b32', 'vl': 32},
+ {'impl': 'vcpop_m_b1', 'vl': 128},
+ {'impl': 'vcpop_m_b1', 'vl': 121},
+ {'impl': 'vcpop_m_b1', 'vl': 120},
+ {'impl': 'vcpop_m_b2', 'vl': 64},
+ {'impl': 'vcpop_m_b2', 'vl': 57},
+ {'impl': 'vcpop_m_b2', 'vl': 56},
+ {'impl': 'vcpop_m_b4', 'vl': 32},
+ {'impl': 'vcpop_m_b4', 'vl': 25},
+ {'impl': 'vcpop_m_b4', 'vl': 24},
+ {'impl': 'vcpop_m_b8', 'vl': 16},
+ {'impl': 'vcpop_m_b8', 'vl': 9},
+ {'impl': 'vcpop_m_b8', 'vl': 8},
+ {'impl': 'vcpop_m_b16', 'vl': 8},
+ {'impl': 'vcpop_m_b16', 'vl': 1},
+ {'impl': 'vcpop_m_b32', 'vl': 4},
+ {'impl': 'vcpop_m_b32', 'vl': 1},
]
await fixture.load_elf_and_lookup_symbols(
r.Rlocation('kelvin_hw/tests/cocotb/rvv/vcpop_test.elf'),
@@ -301,12 +310,13 @@
for c in cases:
impl = c['impl']
vl = c['vl']
- # TODO(davidgao): test other vl. Need special handling of expected
- # output if not full bytes.
- in_bytes = vl // 8
+ in_bytes = (vl + 7) // 8
+ last_byte_mask = (1 << (vl % 8) - 1) if vl % 8 else 0xFF
input_data = rng.integers(
low=0, high=256, size=in_bytes, dtype=np.uint8)
+ input_data_trimmed = input_data
+ input_data_trimmed[-1] = input_data_trimmed[-1] & last_byte_mask
expected_output = np.sum(
np.bitwise_count(input_data), dtype=np.uint32)