本人第一次P4挂了,非常遗憾,没有借口,就是纯菜…以下题目均为第二次P4的考试题目
SWMM
vAddr←GPR[base]+sign_ext(offset)
if(GPR[rt]0=0): Mem[vAddr31...2∣∣02]←GPR[rt]
else: Mem[vAddr29...0∣∣02]←GPR[rt]
我的DM模块设计的比较复杂,有3个控制信号:MemWr, DMRDOp, DMWDOp
,分别代表使能、读模式、写模式,因此我只需要加一个写模式即可,if-else
判断全部在DM模块中完成
ES
temp←(GPR[rs]31∣∣GPR[rs])−(GPR[rt]31∣∣GPR[rt])
if(temp32=temp31): PC←PC+4+sign_ext(offset∣∣02)
else: GPR[rt]←temp31...0
四不像指令,好吧其实和Branch挺像的。关键在于如何区分分支和写入操作。由于我的所有Branch
指令都在ALU中进行比较,并将比较结果通过Branch
端口进行输出,于是对于本条指令,我通过ALU对减法溢出进行判断,并将是否溢出通过Branch
信号传给CTRL和IFU,CTRL中给GPR写使能赋值时增加(~overflow && es)
,IFU中正常对是否Branch进行判断。
IBS
000000 |
rs |
rt |
rd |
00000 |
101001 |
if(sym(GPR[rt])): GPR[rd]←bitwise(GPR[rs])
else: GPR[rt]←GPR[rs]
写入的时候选择一下写入地址就好辣