调试mycpu_verify中的bug
为了方便加波形,先设置一下simulation,后面添加波形就不用多次relaunch simulationle
1
第一次仿真,可以看到下面的波形,soc_lite下的debug_wb_pc没值,向上一级一级看哪里没传好
if把数据传给了id,但是id里面没有进行fs_to_ds_bus_r <= fs_to_ds_bus
去id模块,发现ds_valid没有被赋值,加上
2
继续添加波形,看到id模块的load_op没有被赋值
加上,
3
之后重新仿真,发现中间停了,trace对比出来具体指令出错了
(上面两个bug改后仿真才能停在trace对比出错的位置)
pc = 0xbfc0_0000对应的指令是0x2408_ffff
对比MIPS指令格式发现这是addiu指令,在ex阶段实例化传参出错
修改一下源操作数1
4
之后在仿真,trace对比新的报错点
PC对比出错,应该附近的转移指令没跳好
查看当前测试的MIPS汇编程序,发现b无条件转移指令应该跳到PC = 0xbfc0_038c,但是实际没有跳,直接顺序执行了
通过查看指令格式,发现b指令会被译码成特殊的beq指令,相等转移
查看波形,确实也被译码成beq指令,但是没有进行跳转
然后就发现正确的br_taken信号没有传过去,因为br_bus位宽不够
端口位宽用的头文件声明,去修改一下BR_BUS_WD位宽为33bit,重新仿真这个测试点就过了,这是第四处bug
5
重新仿真,发现控制台提示停在一个测试点上,跑不动了,但是也没有报错,不继续进行也不停止仿真,这种情况一般是逻辑没写好,写出来循环赋值,跳不出来
暂停仿真后,vivado自动指出来出错位置,alu模块出现循环赋值了
修改一下or_result的赋值语句,重新仿真就过了
6
重新仿真停在新的报错点,发现PC = 0xbfc8_8c90的指令在最后回写阶段要写的数据不正确
查看汇编程序,发现这是一个srl逻辑右移指令
波形找到对应指令,执行阶段要将0xadff_20c0逻辑右移0bit,移位结果不对,去检查alu
发现sr_result赋值的位宽不对劲,
更改为下面
重新仿真就通过了,没有报错了
下板也成了
好像没改够7个bug,书上虚晃一枪
7
时隔9个月,第7个bug:
仿真发现ID模块中decoder_6_64的输出信号最高位为蓝线
庆幸自己还做了点笔记