2025-10-19
nemu的srai似乎有问题,平台选择riscv-nemu时,程序执行到下面代码处
0x80000094: slli a0,a0,0x18
0x80000098: srai a0,a0,0x18
执行前$a0的值为0x61,按理说执行完毕后$a0的值应该是0x00000061,但是通过调试器发现执行结束后$a0的值为0。
发现问题了,是提取立即数的时候出了问题。对于立即数型移位指令,指令中的[31:25]位不参与运算,slli指令的[31:25]为全0,srli指令的[31:25]为全0,srai指令的[31:25]为0100000
这句话说得太有道理了,真的是浪费生命
所以还是需要把nemu中那些debug工具在npc里再实现一遍,当然有些代码是可以复用的。
今天最少要实现NPC的单步执行,打印寄存器,扫描内存
verilator想在cpp中调用verilog的函数并且函数涉及到verilog中的信号时需要做额外的设置,
const svScope scope = svGetScopeFromName("TOP.dut");
assert(scope);
svSetScope(scope);
这一点在Verilator的文档中有提到。