北航计组-P4课下
前言
P4课下其实就只需要对着P3的电路翻译即可,具体的实现就不多说了,这里只讲讲一些细节和可优化的地方
正文
顶层模块
我们要尽量让顶层模块只起到连线的作用,最多有一些多路选择器,将具体的实现细节放到模块当中去
对于外部的连线,无论模块output的规格是reg还是wire,外部的接线都得定义为wire,或者你就将wire型变量想象为一根根具体的导线😁
同时一定要建立一套自己的命名规范,到了P5你就知道这有多么重要了
NPC
对于NPC模块的跳转判断,一定要做到不重不漏,比如说branch为1,但不相等时是否有赋值,贴上我的代码
1 | |
也可以用assign实现
Controller
教程中有两种实现方法,我采取了比较直观但是码量更大的方式,如下
1 | |
这个就看个人选择了
P4课上准备
新指令信号
对与新的指令,可以预留一个信号的接口,提前在Controller模块里准备一个新信号NewSign,具体实现看以下代码
1 | |
课上只需要改newOp以及对应的控制信号即可,同时每次case前NewSign = 1'b0(18行)这样就不用每一条其他指令都赋值了,同时顶层模块也提前连接好这个信号
ALU模块
- 考虑到有些题目可能涉及PC,比如与PC比较之类的,可以提前将PC接到ALU输入,要用时直接取
- 有些新指令可能两种情况的行为完全不同,这时无法从Controller直接获得我们想要的控制信号的最终取值,需要根据ALU运算结果来判断,可以提前预留一个新的
output输出new,后面根据new信号来控制一些模块。例子见P4课上T2,一种情况只需要写入寄存器,另一种情况只需要跳转,完全不同。 - 可以提前将上一点的new信号连接到可能的模块,如
GRF、NPC,先不管,到时候特判即可
其他
做课下时可以提前看看课上加指令的模式,提前准备一些必要的接口和连线,到时候课上只需要稍微修改,加几行代码即可
课下测试
每年都有会奆佬在讨论区或者水群发评测机和测试数据生成器,大家多多关注
如果没什么数据的话可以试试下面这个数据,用的是学长的魔改MARS,链接在这里
可以直接输出GRF\DM的写入信息,与自己的对拍即可,注意在Settings下勾选Ignore Arithmetic Overflow以及Output Log level 1,并在Memory Configuration下选择large text,这样可以一次运行4000多行mips代码
同时testbench时钟周期要减小,我减小到了always #0.15 clk = ~clk;
测试数据如下(没有对jr跳转31号以外寄存器的情况进行测试)
Update: 2025.11.12
今天有同学跟我反映数据太长直接复制会导致浏览器卡死,哈哈哈确实,没考虑到这个DOM相关的问题,我把数据上传到这里了,链接在此,请大家有需要ctrl+s下载 或者鼠标右键另存为,如果对你有帮助,可以在评论区say thanks (doge)
1 | |
- 后面的省略了,请下载源文件查看