「BUAA-CO」P6课上


写在前面:P6其实是P5plus,依然是三类:计算类跳转类访存类。只是计算类一般会涉及对MDU的操作,访存类不能在DM进行计算(因为DM没有了…)。很抱歉这次只做了两道题,第三题看题时间被助教问答占掉了(不嘻嘻)。如果哪些方法写的不太详尽可以参考P5的这篇博客,大同小异

MYGO

pattern_value(x) = 4位x的前导0个数 * 2 + 4位x中1的个数
chain(x) = 32位二进制数分成8组,每组的pattern_value(x) * (组数 + 1) 组数从低位开始(0,1,2,3,4,5,6,7).
A = chain(GPR(rs))
B = chain(GPR(rt))
if (A > B) {
hi = GPR[rs]
lo = GPR[rt]
}
else if(A < B) {
hi = GPR[rt];
lo = GPR[rs];
}
else {
hi = GPR[rs] ^ GPR[rt];
lo = GPR[rs] ^ GPR[rt];
}

MYGO当作乘除指令来计算,延迟5个周期。

这个乘除槽类计算指令肯定主体要在MDU模块内实现,我的建议是A,B的计算使用组合逻辑,hi,lo的赋值使用时序逻辑。组合逻辑计算别发怵,我敢打赌要是程序设计出这个逻辑看到这里的各位没有一个怕的,所以大胆上手就行。时序逻辑只要按照之前的判断方式添加就好,别忘了Start信号下cnt的修改就行。

else if (MDUOp == `MDU_MYGO) begin
if (A > B) begin
HIreg <= GPT[rs];
LOreg <= GPR[rt];
end
...
end

Stall模块跟mult一致即可。

MBL

tmpA = IMM_BEQ(IMM指令跳转的数值)
tmpB = GPR[rs] + GPR[rt]
GPR[31] = PC + 8;
if rs == rt {
PC = tmpA;
}
else if (rs[0] == rt[0]) {
PC = {tmpB[31:0],2'b0}
}

这道题真的是坑点满满!!!

  • 我们很容易先入为主地把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

我也很想他 我们都一样
在他的身上 曾找到翅膀
只是那时的他 是因为你
他开始飞翔
我也很想他,在某个地方
我少了尴尬 你少了肩膀
而夏天还是那么短
思念却很长

文章作者: Cordial-Kid
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Cordial-Kid !
  目录