riscv - 火箭芯片仿真显示意外指令数
问题描述
以下两个代码片段仅在加载到 x23 寄存器中的值不同,但minstret
指令计数(由 Rocket 芯片的 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 条指令似乎很奇怪。无论我运行这两个程序多少次,这些结果总是相同的。
解决方案
该问题已在https://github.com/freechipsproject/rocket-chip/issues/1495解决。
服务调试中断(显然是模拟使用它来了解基准测试是否已完成执行)导致了指令计数的差异。Verilator 生成的详细日志显示了在执行期间在不同点注入的调试地址范围(0x800 起)。
推荐阅读
- python-3.x - 当用户尝试对已经完成的线程进行操作时,我应该使用 Python 的内置 ProcessLookupError 吗?
- laravel - Livewire 数据表无法访问公共财产
- python - 如何使用 aiohttp 发送文件?
- visual-studio-code - 禁用 workbench.editor.showTabs 时,如何在未聚焦的选项卡中显示面包屑?
- ansible - ansible vault 可以加密插件配置文件中的值吗?
- r - 从按 Special_ID 分组的大型数据集中采样唯一行/Normal_ID
- android - Uno Platform Android 和 UWP:如何将文件复制到本地文件夹?
- javascript - 如何在没有npm和es6的情况下在deckgl中使用FitBounds
- swiftui - 如何在不使用 Geometry Reader 的情况下获取 safeAreaInsets
- jquery - 空气日期选择器禁用日期样式在当月无效