CPU设计实战lab3---任务1 简单CPU参考设计调试

调试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的输出信号最高位为蓝线
在这里插入图片描述

庆幸自己还做了点笔记

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值