【问题标题】:Rocket chip simulation shows unexpected instruction count火箭芯片模拟显示意外指令数
【发布时间】:2018-06-13 22:56:58
【问题描述】:

下面两个代码sn-ps 不同的只是加载到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 多条指令似乎很奇怪。无论我运行这两个程序多少次,这些结果总是相同的。

【问题讨论】:

  • 完整的反汇编看起来像什么,包括读取指令计数器的代码?
  • 0xff 情况下的反汇编:termbin.com/p713 和 0xffff 情况下的反汇编:termbin.com/mrj9。函数地址不同,所以 vimdiff 不是很有帮助,但是如果你寻找loop 符号,你就能找到上面的sn-ps。
  • 我忘了说读取指令计数器的代码就是csrr a5,minstret
  • 嗯,我明白你在说什么。我不记得他们是否开源了他们的逻辑,也许基于价值观的划分有一条捷径,但这也没有意义。希望这是简单的事情,比如对齐或轻微的构建差异。但情况似乎并非如此。
  • 你有没有就此与他们接触过?

标签: riscv chisel verilator rocket-chip


【解决方案1】:

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

为调试中断提供服务,这显然是由模拟用来了解基准测试是否已完成执行,导致指令计数的差异。 Verilator 生成的详细日志显示了在执行期间在不同点注入的调试地址范围(0x800 起)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多