火箭芯片模拟显示意外的指令数

时间:2018-06-13 22:56:59

标签: riscv chisel verilator rocket-chip

以下两个代码段仅区别于加载到x23中的值 注册,但minstret指令计数(由Verilator报告 模拟火箭芯片)大不相同。这是一个错误,还是我 做错了什么?

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个指令似乎很奇怪。无论我运行这两个程序多少次,这些结果总是一样的。

1 个答案:

答案 0 :(得分:1)

问题已于https://github.com/freechipsproject/rocket-chip/issues/1495解决。

调试调试中断(模拟显然用于了解基准测试是否已完成执行)会导致指令计数的差异。 Verilator生成的详细日志显示在执行期间在不同点注入的调试地址范围(0x800以后)。