北航计组-P3课上易错点
通过阅读本文,你可以大致了解BUAA 2024秋季 P3课上添加指令的常见坑点和小技巧
写在前面
做了两次P3,这次较为顺利,40min就整完了,从上周挂掉P3到现在,本人发现了不少大家共性的问题或者叫易错点,也有一些个人的经验与技巧,写在这里,希望下一届 的朋友们能够更加顺利地通过P3😁😁(●’◡’●)
本人课下重构版如下:
正文
易错点总结
其实大家添加指令或许并不成问题,但是可能会出现哪些问题呢?包括但不限于:
- 1.输出信号值随意更改
- 2.添加指令影响了已有指令
- 3.没有预留充足空间和信号端口,导致添加指令麻烦、耗时长,也就容易产生问题
- 4.课下充分测试,裸交一发,对了几个点的话就不要怀疑课下的bug了
针对前三个问题,我分别给出错误示范和改进方法
问题1
参考我之前课上的设计,
Reg_Addr
是直接连接到输出信号的,表示寄存器写入地址,如果你在端口和这个Tunnel之间对信号做了处理,那会造成本地运行正确,但是交上去输出错误,且debug很困难
- 解决:就是将这种输出信号直接接在端口上,像这样,这样,你在更改信号,比如GRF_WA时,就直接在Tunnel前面改,如图红色箭头处,加MUX之类的
问题2
这也是一个很常见的问题,我以第二次课上的一个题为例,来说一说
第二次P3课上第一题为BA指令,RTL语言如下:
ba rs, rt, offset
ans <- GRF(rs) ^ GRF(rt)
(按位异或)
if ans < 0x10000
then
PC <- PC +4 + sign_extend(ans[15:0] || 00)
else
PC <- PC +4 + sign_extend(offset[15:0] || 00)
这其实就是beq
指令的变体,对于beq
指令,我是branch信号置1同时判断ALU相减结果是否为0来决定是否跳转,具体的跳转在NPC模块实现,对于此题发现只要该指令执行,就一定会跳转,同时ALU模块需要执行异或运算,也无法直接用zero信号,所以我选择了新输出一个信号,就叫new(事实上提前预留了端口,见Controller模块),只要该指令,则new为1,把new与之前的最终跳转信号或一下,连到NPC模块,即可
接着看看跳转地址,可以直接在NPC输入端口前加一个MUX,根据判断条件选一个进去,就是这样.png)
看起来似乎没啥问题,但这样是错的!!!,因为你把之前正常跳转beq
的跳转地址也改了,回头想一想,我们只需要在执行这条新指令时这样选择,对于其他的指令,用之前的Tunnel就好了,想到这里后,实现就很简单了,对于每一条新指令,如果需要改变之前输入输出的端口,则加一个MUX,确保只对新指令作用,同时新增一个输出信号作为MUX的选择信号,由于新信号new只在新信号时为1,这样就保证了原来指令的正确性
.png)
问题3
我之前是这样设计的,课上修改数据通路,把我累的够呛,特别是在一些很小的地方加一些MUX,那简直了(┬┬﹏┬┬),整个电路连线很复杂,也容易犯错
因此,我对电路进行了重构,增加了很多的Tunnel,也扩大了空间,这样增添通路时更加方便,同时Controller预留了一个新的信号,到时候把指令在里面连起来,直接就能用,看起来也更加简洁,可能没那么直观只是。
碎碎念
哈哈哈,问答时助教还问我CPU画的怎么这么好看,嘻嘻😎😎😆😆,Logisim
可以直接编辑子电路外观、形状、颜色,大家自行搜索学习即可,确实好看很多颜狗来了
P3挂了,唉唉,但回头一想,也没啥,今晚P4似乎难度不小,感觉很多人没出来,如果我今晚做P4,说不定也挂,下次兴许能简单点!?(未经),不知道,全面准备吧。
最后送大家一句话:
请不要相信胜利就像山坡上的蒲公英一样唾手可得,但请相信,世上总有美好值得自己全力以赴,哪怕粉身碎骨
😊😊😊