写在前面:P6 其实是 P5 plus,依然是三类:计算类、跳转类、访存类。只是计算类一般会涉及对 MDU 的操作,访存类不能在 DM 进行计算(因为 DM 没有了…)。很抱歉这次只做了两道题,第三题看题时间被助教问答占掉了(不嘻嘻)。如果哪些方法写得不太详尽可以参考 P5 的这篇博客,大同小异。
MYGO
|
这个乘除槽类计算指令肯定主体要在 MDU 模块内实现,我的建议是 A、B 的计算使用组合逻辑,hi、lo 的赋值使用时序逻辑。组合逻辑计算别发怵,我敢打赌要是程序设计出这个逻辑,看到这里的各位没有一个怕的,所以大胆上手就行。时序逻辑只要按照之前的判断方式添加就好,别忘了 Start 信号下 cnt 的修改就行。
|
Stall模块跟mult一致即可。
MBL
|
这道题真的是坑点满满!!!
- 我们很容易先入为主地把
rs == rt理解为GPR[rs] == GPR[rt],恭喜你,你将收获莫名其妙的 PC。 - 在D级我们一定会用到GPR[rs] 和 GPR[rt] 吗?如果我们直接按照之前的
rs_Tuse = 0,rt_Tuse = 0来写,那么恭喜你,喜提TLE。
注意到以上两点这道题也就迎刃而解了。在CMP新增rs,rt输入端口完成比较,新增输出端口Judge辅助判断跳转类型,NPC当然要增加Judge这个输入来计算新地址。
对于 Stall,我们判断的条件是(D_beq | D_jr | D_jalr | D_bne | (D_mbl && Beq_jump == 1 && Judge == 0)) ? 3'd0 :,即只在 rs[0] == rt[0] 的条件下才需要 GPR[rs] 和 GPR[rt]。这就解决了 TLE 问题。
LBO
这里希望路过好心人可以告诉笔者一下题目,共同给学弟学妹一个完整的magicbook(bushi),谢谢谢谢。
写在最后
P6 其实和 P5 差不多,放宽心,前两道题肯定难不倒你,加油哦。再向好心人求一下LBO指令。
Lyrics Sharing
|