提供一些博客

P6学习总结 | AugetyVolte’s Blog (augetyvolta.github.io)这个学长的博客里有很多课上拓展的题,可以做参考

企鹅的课上

T1 fdiv

Fast DIV

31……26 25……21 20……16 15…11 10…6 5……0
op
000000
rs rt 0
00000
0
00000
fdiv
101100

题目描述:

乘除槽阻塞周期为3,其他与有符号除法相同

操作:

$$
\begin{align}
&HI\ ←\ GPR[rs]\ %\ GPR[rt] \
&LO\ ←\ GPR[rs]\ \ /\ GPR[rt]\
\end{align}
$$

T2 bslt

31……26 25……21 20……16 15…11 10…6 5……0
op
000000
rs rt rd 0
00000
boall
111011

题目描述:

操作:
$$
\begin{flalign}
&\qquad temp ← GPR[rs]+GPR[rt]\
&\qquad if\quad unsigned(temp)<0x00006000 \quad then\
&\qquad \qquad GPR[rd] ← PC+8\
&\qquad \qquad PC ← temp_{31…2}||0^2\
&\qquad endif
\end{flalign}
$$

T3 lsas

31……26 25……21 20……16 15……0
op
111110
base rt offset

题目描述:

操作:
$$
\begin{flalign}
&vaddr ← GPR[base] + sign_extend(offset) \
&paddr ← vaddr&0xfffffffc \
&Word ← memory[paddr] \
&number ← Word_{31}-Word_{30}+Word_{29}-Word_{28}+…+Word_{1}-Word_{0}+16\
&GPR[number>>1]←Word
\end{flalign}
$$

第一次课上

T1

31……26 25……21 20……16 15…11 10…6 5……0
op
000000
rs rt 0
00000

111010

题目描述:

用有符号数计算;cnt=5

操作:
$$
\begin{align}
&HI\ ←\ HI\ +\ GPR[rs]\ \ /\ GPR[rt] \
&LO\ ←\ LO\ +\ GPR[rs]\ %\ GPR[rt]\
\end{align}
$$

实现:

`MDU_div : begin
tmp_HI <= $signed( $signed(HI) + $signed(A) / $signed(B) );//我怕错,索性多加几个
tmp_LO <= $signed( $signed(LO) + $signed(A) % $signed(B) );
cnt <= 5;
end

T2 boall

31……26 25……21 20……16 15…11 10…6 5……0
op
000000
rs rt rd 0
00000
boall
111011

题目描述:

GPR[rt]的二进制表示中,没有连续的四个1

操作:
$$
\begin{flalign}
&I:\
&\qquad link ← PC+8\
&\qquad cond ← True\
&\qquad for\quad i=3…31\quad begin\
&\qquad \qquad cond=cond\quad and\quad (GPR[rt]_{i…i-3}\neq4’b1111)\
&\qquad end\
&I+1:\
&\qquad if\quad cond \quad then\
&\qquad \qquad GPR[rd] ← link\
&\qquad \qquad PC ← GPR[rs]\
&\qquad else\
&\qquad \qquad NullifyCurrentInstruction()\
&\qquad endif
\end{flalign}
$$

integer i;
reg [31:0] cond;
always @(*)begin
cond=32'd1;
for(i=3;i<32;i=i+1)begin
cond = cond & (RD1[i-:3]!=4'b1111);
end
end

T3 lwd

31……26 25……21 20……16 15……0
op
111110
base rt offset

题目描述:

若访存结果为奇数,存入rt寄存器,若访存结果为偶数,则存入base

操作:
$$
\begin{flalign}
&paddr ← GPR[base] + sign_extend(offset) \
&memWord ← memory[paddr] \
&Condition ← memWord[0]\
&if\quad Condition\quad then\
&\qquad grfIndex←rt\
&else\
&\qquad grfIndex←base\
&endif\
&GPR[grfIndex]←memWord
\end{flalign}
$$


第二次课上

T1 fdiv

课上题一开始有bug所以换了个题,居然刚好换了上上周的题,是我室友写过的题

Fast DIV

31……26 25……21 20……16 15…11 10…6 5……0
op
000000
rs rt 0
00000
0
00000
fdiv
101100

题目描述:

乘除槽阻塞周期为3,其他与有符号除法相同

操作:

$$
\begin{align}
&HI\ ←\ GPR[rs]\ %\ GPR[rt] \
&LO\ ←\ GPR[rs]\ \ /\ GPR[rt]\
\end{align}
$$

T2 jabs

Jump ABSolute value

31……26 25……21 20……16 15……0
op
101100
rs rt offset

题目描述:

采用一种新的计算偏移量方式对于跳转偏移进行计算

操作:
$$
\begin{flalign}
&I:\
&\qquad new_offset ← sign_extend(offset||0^2) +(abs(GPR[rs]-GPR[rt])[29:0]||0^2)\
&\qquad addr ← PC+4+new_offset\
&I+1:\
&\qquad PC ← addr\
\end{flalign}
$$

其他:

求绝对值时,我们认为寄存器内容为有符号数

//写一下我的abs(GPR[rs]-GPR[rt])实现
wire [31:0] count_sub = signed(signed(RD1)-signed(RD2));
wire [31:0] count_abs = signed(signed(count_sub)>signed(0)) ? signed(count_sub) : signed(signed(count_sub)*signed(-1));

T3 lwm

Load Word depend on Memory

31……26 25……21 20……16 15……0
op
101100
base rt offset

题目描述:

将要写入的寄存器编号改为访存结果减GPR[rt]的值的后5位

操作:
$$
\begin{flalign}
&vaddr ← GPR[base] + sign_extend(offset) \
&paddr ← vaddr_{31…2}||0^2\
&memWord ← memory[paddr]-GPR[rt] \
&grfindex ← memWord[4:0]\
&GPR[grfindex] ← memory[paddr]
\end{flalign}
$$

这个题需要注意的是,在M级使用了GPR[rt]的值,不是rt的值,也就是说这个值需要用和sw一样的操作得到,我们需要做的操作是在D_Contoller里使D_rt_Tuse=2