BUAA-CO-p3-课上

BUAA-CO-p3-课上

今年P3难度比去年大了不少,我考前做完去年的题感觉稳了,结果一看到题人直接傻了。如你所见,光RTL语言就已经这么长了…

T1

if (imm  08)>PC:GPR[rs]PC;if\space (imm\space ||\space 0^8) \gt PC: GPR[rs] \leftarrow PC;

else:GPR[rt]PC;else:GPR[rt]\leftarrow PC;

别忘了比较的时候用unsigned就行

T2 格雷码

for i in(0,15):for \space i \space in (0,15):

temp=gray(GRF[rt]2i+1..2i)temp=gray(GRF[rt]_{2i+1..2i})

if temp0: sum+=1;if \space temp_0:\space sum+=1;

if temp1: sum+=1;if \space temp_1:\space sum+=1;

end_for;end\_for;

if (sum>rt): PCPC+4+sign_extend(offset02);if\space (sum \gt rt):\space PC \leftarrow PC+4+sign\_extend(offset||0^2);

else:PCPC+4;else: PC \leftarrow 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:0h\_byte=GPR[rt]_{3:0}

AddrGPR[base]+sign_extend(offset)Addr \leftarrow GPR[base]+sign\_extend(offset)

Reg_right[GPR[rt]>>h_byte]4..0Reg\_right \leftarrow [GPR[rt]>>h\_byte]_{4..0}

Reg_left[GPR[rt]<<h_byte]4..0Reg\_left \leftarrow [GPR[rt]<<h\_byte]_{4..0}

mem=Mem[Addr]mem=Mem[Addr]

if (mem is odd): GPR[Reg_right]=mem;if\space (mem\space is\space odd):\space GPR[Reg\_right]=mem;

else: GPR[Reg_left]=mem;else:\space GPR[Reg\_left]=mem;

这个就真其实真不难了,细心一点线别连反了,其他跟sw是一样的

作者

OWPETER

发布于

2024-10-28

更新于

2024-12-02

许可协议

评论