Rocket Chip RISC-V RTL仿真:存储指令无AXI写请求问题求助
先确认存储指令的目标地址范围
对照反汇编里sd/sw指令的目标地址,检查这个地址是不是被Testbench映射到AXI总线上的内存。如果地址属于片上SRAM或者寄存器空间,CPU会直接访问本地存储,不会发起AXI总线事务。比如反汇编里存到0x10000000,就得确认Testbench有没有把这个地址段挂到AXI slave上。检查存储指令是否真的被执行了
看反汇编里存储指令的上下文:如果存的是后续代码完全没用到的变量,编译器大概率会把这个指令优化掉。另外看仿真波形里的PC值,有没有走到这条存储指令的地址上——要是程序在执行到这之前就跳走或者结束了,自然不会有写操作。排查AXI总线的握手信号
盯着仿真波形里的AXI写通道信号:AWVALID有没有拉高?如果CPU发了写地址请求,但AWREADY一直是低,说明AXI slave没准备好接收,CPU会挂起写事务。还要看WVALID/WREADY、BVALID/BREADY这些握手对,有没有某一方没正确响应。确认机器码加载和PC初始化是否正确
检查Testbench把机器码写到的地址,是不是和CPU启动的初始PC一致。要是代码存在了错误的地址,CPU根本没跑这段带存储指令的代码,自然不会有AXI写操作。另外也得确认存储指令对应的机器码有没有完整写入内存,别出现截断或者比特错误。考虑CPU的缓存/写缓冲机制
如果是带D-cache的RISC-V CPU,要是存储地址在缓存命中范围内,CPU会先写缓存,只有缓存回写的时候才会发起AXI写事务。可以在存储指令后面加一条fence指令强制缓存刷新,再仿真看看有没有AXI写动作。还有些CPU带写缓冲,要是缓冲没被触发刷新,写事务会延迟,甚至直到程序结束才会执行。
内容的提问来源于stack exchange,提问作者paopaopoo

