


针对Linux环境下div指令测试异常的问题,结合分析结果提出以下解决方案:
测试用例错误:
rv32um-p-div 中,黄金参考值(golden_res)为 0x55555552,但实际计算结果 0xfffffffd(即 -3)才是正确的。div 指令的期望结果设置错误(黄金值计算有误),而非您的硬件实现问题。操作验证:
rs1 = 0xffffffec(-20),rs2 = 0x00000006(6)。-20 ÷ 6 = -3(商),十六进制表示为 0xfffffffd。0xfffffffd 符合预期,硬件行为正确。通过修改测试用例源码,将错误的黄金参考值替换为正确的值:
定位测试源码:
rv32um-p-div 测试用例的源码(通常是 .S 汇编文件)。例如,在 RISC-V 官方测试集(riscv-tests)中,路径可能为 isa/rv32um/div.S。修改源码:
0xffffffec(-20)和 0x00000006(6)的指令序列。0x55555552 替换为正确值 0xfffffffd(-3):# 修改前(错误)
li t0, 0xffffffec # rs1 = -20
li t1, 6 # rs2 = 6
div t2, t0, t1 # 执行 div 指令
li t3, 0x55555552 # 错误的黄金值
bne t2, t3, fail # 比对失败则跳转# 修改后(正确)
li t0, 0xffffffec
li t1, 6
div t2, t0, t1
li t3, 0xfffffffd # 修正为正确值 -3
bne t2, t3, fail重新编译并运行测试:
# 在测试集目录中重新编译
make clean
make
# 运行测试
./run_test.sh rv32um-p-div若无法修改测试源码,可在测试框架中添加豁免规则,跳过该错误检查:
rs1=0xffffffec, rs2=0x00000006 时跳过结果比对。if current_instruction == "div" and rs1 == 0xffffffec and rs2 == 0x00000006:
expected_result = 0xfffffffd # 覆盖黄金值
else:
expected_result = golden_res # 其他情况使用原黄金值若测试用例源自官方仓库,可能存在已知问题:
riscv-tests 仓库的 Issues 或提交记录,确认该问题是否已修复。cd riscv-tests
git pull origin master
make clean
make确保 divu(无符号除法)指令同样正确:
rs1 = 0xffffffec(4294967276),rs2 = 6。4294967276 ÷ 6 = 715827879(商),十六进制 0x2aaaaaa7。rv32um-p-divu 中是否存在类似错误,必要时同步修正黄金值。divu 测试用例,确保无符号除法测试正确。通过以上步骤,您将准确验证 div/divu 指令的功能,并解决测试异常问题。
举报
更多回帖