火箭芯片模拟显示意外的指令数
Rocket chip simulation shows unexpected instruction count
以下两个代码片段仅在加载到 x23 中的值不同
注册,但 minstret
指令计数(由 Verilator 报告
Rocket 芯片的仿真)大不相同。这是一个错误,还是我
做错了什么?
read_csr()
函数来自RISC-V前端服务器库(https://github.com/riscv/riscv-fesvr/blob/master/fesvr/encoding.h),其余代码[syscalls.c、crt.S、test.ld] 类似于 RISC-V 基准
(https://github.com/riscv/riscv-tests/tree/master/benchmarks/common).
我已经检查过编译的二进制文件包含完全相同的指令,除了操作数不同。
将 0x0fffffff 除以 0xff,重复 1024 次:3260 条指令.
size_t instrs = 0 - read_csr(minstret);
asm volatile (
"mv x20, zero;"
"li x21, 1024;"
"li x22, 0xfffffff;"
"li x23, 0xff;"
"loop:"
"div x24, x22, x23;"
"addi x20, x20, 1;"
"bleu x20, x21, loop;"
::: "x20", "x21", "x22", "x23", "x24", "cc"
);
instrs += read_csr(minstret);
将 0x0fffffff 除以 0xffff,重复 1024 次:3083 条指令.
size_t instrs = 0 - read_csr(minstret);
asm volatile (
"mv x20, zero;"
"li x21, 1024;"
"li x22, 0xfffffff;"
"li x23, 0xffff;"
"loop:"
"div x24, x22, x23;"
"addi x20, x20, 1;"
"bleu x20, x21, loop;"
::: "x20", "x21", "x22", "x23", "x24", "cc"
);
instrs += read_csr(minstret);
在这里,3083 条指令似乎是正确的 (1024 * 3 = 3072)。由于 minstret
计算退役指令,因此第一个示例多执行了 ~200 条指令似乎很奇怪。无论我 运行 这两个程序多少次,这些结果总是相同的。
问题已在 https://github.com/freechipsproject/rocket-chip/issues/1495 解决。
为调试中断提供服务,模拟显然使用该中断来了解基准测试是否已完成执行,这导致了指令计数的差异。 Verilator 生成的详细日志显示了在执行期间在不同点注入的调试地址范围(从 0x800 开始)。
以下两个代码片段仅在加载到 x23 中的值不同
注册,但 minstret
指令计数(由 Verilator 报告
Rocket 芯片的仿真)大不相同。这是一个错误,还是我
做错了什么?
read_csr()
函数来自RISC-V前端服务器库(https://github.com/riscv/riscv-fesvr/blob/master/fesvr/encoding.h),其余代码[syscalls.c、crt.S、test.ld] 类似于 RISC-V 基准
(https://github.com/riscv/riscv-tests/tree/master/benchmarks/common).
我已经检查过编译的二进制文件包含完全相同的指令,除了操作数不同。
将 0x0fffffff 除以 0xff,重复 1024 次:3260 条指令.
size_t instrs = 0 - read_csr(minstret);
asm volatile (
"mv x20, zero;"
"li x21, 1024;"
"li x22, 0xfffffff;"
"li x23, 0xff;"
"loop:"
"div x24, x22, x23;"
"addi x20, x20, 1;"
"bleu x20, x21, loop;"
::: "x20", "x21", "x22", "x23", "x24", "cc"
);
instrs += read_csr(minstret);
将 0x0fffffff 除以 0xffff,重复 1024 次:3083 条指令.
size_t instrs = 0 - read_csr(minstret);
asm volatile (
"mv x20, zero;"
"li x21, 1024;"
"li x22, 0xfffffff;"
"li x23, 0xffff;"
"loop:"
"div x24, x22, x23;"
"addi x20, x20, 1;"
"bleu x20, x21, loop;"
::: "x20", "x21", "x22", "x23", "x24", "cc"
);
instrs += read_csr(minstret);
在这里,3083 条指令似乎是正确的 (1024 * 3 = 3072)。由于 minstret
计算退役指令,因此第一个示例多执行了 ~200 条指令似乎很奇怪。无论我 运行 这两个程序多少次,这些结果总是相同的。
问题已在 https://github.com/freechipsproject/rocket-chip/issues/1495 解决。
为调试中断提供服务,模拟显然使用该中断来了解基准测试是否已完成执行,这导致了指令计数的差异。 Verilator 生成的详细日志显示了在执行期间在不同点注入的调试地址范围(从 0x800 开始)。