今年P3难度比去年大了不少,我考前做完去年的题感觉稳了,结果一看到题人直接傻了。如你所见,光RTL语言就已经这么长了…
T1
if (imm ∣∣ 08)>PC:GPR[rs]←PC;
else:GPR[rt]←PC;
别忘了比较的时候用unsigned
就行
T2 格雷码
for i in(0,15):
temp=gray(GRF[rt]2i+1..2i)
if temp0: sum+=1;
if temp1: sum+=1;
end_for;
if (sum>rt): PC←PC+4+sign_extend(offset∣∣02);
else:PC←PC+4;
1 2 3 4
| gray(2'b00) = 2'b00; gray(2'b01) = 2'b01; gray(2'b10) = 2'b11; gray(2'b11) = 2'b10;
|
看着挺复杂,其实还好。先建个gray码的转换模块。这个for循环的意思其实就是每2位取imm,取完之后进行格雷码转换,换完先别急着bit_adder
,用splitter
合成32位数之后再bit_adder
,否则加法过程中可能会出现溢出!
另外这个操作属于改版的beq
,PC转移的方法和beq
是一致的,所以可以这样和beq
共用一个NPCOp码
T3 sw改版
h_byte=GPR[rt]3:0
Addr←GPR[base]+sign_extend(offset)
Reg_right←[GPR[rt]>>h_byte]4..0
Reg_left←[GPR[rt]<<h_byte]4..0
mem=Mem[Addr]
if (mem is odd): GPR[Reg_right]=mem;
else: GPR[Reg_left]=mem;
这个就真其实真不难了,细心一点线别连反了,其他跟sw
是一样的