写在前面:P6其实是P5plus,依然是三类:计算类,跳转类,访存类。只是计算类一般会涉及对MDU的操作,访存类不能在DM进行计算(因为DM没有了…)。很抱歉这次只做了两道题,第三题看题时间被助教问答占掉了(不嘻嘻)。如果哪些方法写的不太详尽可以参考P5的这篇博客,大同小异
MYGO
pattern_value(x) = 4位x的前导0个数 * 2 + 4位x中1的个数 |
这个乘除槽类计算指令肯定主体要在MDU模块内实现,我的建议是A,B的计算使用组合逻辑,hi,lo的赋值使用时序逻辑。组合逻辑计算别发怵,我敢打赌要是程序设计出这个逻辑看到这里的各位没有一个怕的,所以大胆上手就行。时序逻辑只要按照之前的判断方式添加就好,别忘了Start信号下cnt的修改就行。
else if (MDUOp == `MDU_MYGO) begin |
Stall模块跟mult一致即可。
MBL
tmpA = IMM_BEQ(IMM指令跳转的数值) |
这道题真的是坑点满满!!!
- 我们很容易先入为主地把
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
我也很想他 我们都一样 |