设计文档
流水线层级设计
取指 F
利用PC和NPC得到的PC从IM中取得指令,传入下一层
译码 D
根据F级取到的指令分拆各部分,取到GRF对应的数据,并利用控制器得到控制信号,传入下一层
执行 E
根据D级取得的控制信号,执行对应的操作,并将得到的数据传入下一层
访存 M
根据D级取得的控制信号和E级生成的运算结果,访问对应的存储器,根据信号决定行为,并将结果和不处理数据传入下一级
写回 W
根据之前得到的控制信号和数据,写入GRF
具体指令分析
指令 |
NPC_old |
NPC_off |
PC_in |
DM_a |
DM_d |
DM_we |
ALU_a |
ALU_b |
ALU_op |
nop |
~ |
~ |
~ |
/ |
/ |
/ |
/ |
/ |
/ |
add |
PC_o |
0 |
NPC_o |
/ |
/ |
0 |
GRF_o1 |
GRF_o2 |
000 |
sub |
~ |
~ |
~ |
/ |
/ |
0 |
~ |
~ |
001 |
ori |
~ |
~ |
~ |
/ |
/ |
0 |
~ |
EXT_o |
010 |
lw |
~ |
~ |
~ |
ALU_o |
/ |
0 |
~ |
~ |
000 |
sw |
~ |
~ |
~ |
~ |
GRF_o2 |
1 |
~ |
~ |
000 |
beq |
~ |
beqmux[ALU_0]{0,EXT_o} |
~ |
/ |
/ |
0 |
GRF_o1 |
GRF_o2 |
011 |
lui |
~ |
0 |
~ |
/ |
/ |
0 |
/ |
EXT_o |
100 |
jal |
~ |
0 |
PC[31..28],EXT_o |
/ |
/ |
0 |
/ |
/ |
/ |
jr |
~ |
0 |
GRF_o1 |
/ |
/ |
0 |
/ |
/ |
/ |
|
|
|
|
|
|
|
|
|
|
指令 |
OP |
FUNC |
GRF_a1 |
GRF_a2 |
GRF_a3 |
GRF_d |
GRF_we |
EXT_op |
EXT_in |
uset |
newt |
rsuse |
rtuse |
nop |
0 |
/ |
/ |
|
/ |
/ 3 |
/ |
/ 3 |
/ |
/ |
/ |
/ |
/ |
add |
000000 |
100000 |
rs |
rt |
rd |
ALU_o |
1 |
/ |
/ |
1 |
2 |
1 |
1 |
sub |
000000 |
100010 |
~ |
~ |
~ |
~ |
1 |
/ |
/ |
1 |
2 |
1 |
1 |
ori |
001101 |
/ |
rs |
/ |
rt |
~ |
1 |
0 |
imm |
1 |
2 |
1 |
0 |
lw |
100011 |
/ |
rs |
/ |
rt |
DM_o |
1 |
1 |
imm |
1 |
3 |
1 |
0 |
sw |
101011 |
/ |
rs |
rt |
/ |
/ |
0 |
1 |
imm |
1 |
0 |
1 |
1 |
beq |
000100 |
/ |
rs |
rt |
/ |
/ |
0 |
2 |
imm |
0 |
0 |
1 |
1 |
lui |
001111 |
/ |
/ |
/ |
rt |
ALU_o |
1 |
3 |
imm |
/ |
2 |
0 |
1 |
jal |
000011 |
/ |
/ |
/ |
31 |
NPC_o |
1 |
4 |
add |
/ |
0 |
0 |
0 |
jr |
0 |
001000 |
rs |
/ |
/ |
/ |
0 |
/ |
/ |
0 |
0 |
1 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
次级部件设计
一、EXT
EXT_op[3:0] |
ope |
0 |
imm->zero_32 |
1 |
imm->sign_32 |
2 |
imm->(sign_31)«2 |
3 |
imm->{in,16{0}} |
4 |
add->{in,2{0}} |
|
|
二、mux
F-BEQm(EXT_o) [1]
from |
pos |
CONST |
any |
FEXT_O |
this |
|
|
F-NPCoffm [1]
from |
pos |
beqmux_o |
this |
CONST |
any |
|
|
F-PCinm(NPC_o,PC_o,EXT_o,GRF_o1)[2]
00 |
01 |
10 |
NPC_o |
PC[31..28],FEXT_o |
GRF_o1 |
from |
pos |
NPC_o |
this |
PC_o |
this |
FEXT_o |
this |
GRF_o1 |
D |
|
|
- 位于F,来源于F_NPC_O、F_PC_O、D_GRF_o1
M-DMam(ALU_O)[1]
M-DMdm(GRF_o2)[1]
E-ALUam(GRF_o1,GRF_o2)[1]
from |
pos |
GRF_o1 |
D |
GRF_o2 |
D |
|
|
E-ALUbm(GRF_o2,EXT_o,GRF_o1)[2]
0 |
1 |
2 |
GRF_o2 |
EEXT_o |
GRF_o1 |
from |
pos |
GRF_o2 |
D |
EEXT_o |
this |
|
|
D-GRFa1m(rs)[1]
D-GRFa2m(rt)[1]
W-GRFa3m(rd,rt,31)[2]
from |
pos |
31 |
const |
rd |
D |
rt |
D |
|
|
W-GRFdm(ALU_o,DM_o,EXT_o,NPC_o)[3]
0 |
1 |
2 |
3 |
ALU_o |
DM_o |
WEXT_o |
NPC_o |
|
|
|
|
from |
pos |
ALU_o |
E |
DM_o |
M |
WEXT_o |
this |
NPC_o |
F |
|
|
三、寄存器设计
FDreg
name |
inipos |
ins_f |
F |
npco_f |
F |
|
|
DEreg
name |
inipos |
imm_d |
D |
add_d |
D |
rs_d |
D |
rt_d |
D |
rd_d |
D |
|
|
grfo1_d |
D |
grfo2_d |
D |
npco_d |
F |
wpc_d |
F |
|
|
grfwe_d |
D |
dmwe_d |
D |
eextop_d |
D |
wextop_d |
D |
dmamsel_d |
D |
dmdmsel_d |
D |
aluamsel_d |
D |
alubmsel_d |
D |
grfa3msel_d |
D |
grfdmsel_d |
D |
aluop_d |
D |
dmop_d |
D |
|
|
newt_d |
D |
grfwd_d |
this |
grfwtarget_d |
this |
|
|
EMreg
name |
inipos |
aluo_e |
E |
grfo2_e |
D |
imm_e |
D |
rt_e |
D |
rd_e |
D |
npco_e |
F |
wpc_e |
F |
|
|
newt_e |
this |
grfwd_e |
this |
grfwtarget_e |
this |
|
|
grfwe_e |
D |
dmwe_e |
D |
wextop_e |
D |
dmamsel_e |
D |
dmdmsel_e |
D |
grfa3msel_e |
D |
grfdmsel_e |
D |
dmop_e |
D |
|
|
MWreg
name |
inipos |
imm_m |
D |
rt_m |
D |
rd_m |
D |
aluo_m |
E |
dmo_m |
M |
npco_m |
F |
wpc_m |
F |
|
|
newt_m |
this |
|
|
grfwe_m |
D |
wextop_m |
D |
grfa3msel_m |
D |
grfdmsel_m |
D |
|
|
冲突处理
每级输出 [newt_e/m]
,表示本指令还有多少个周期出结果。
每级输出grfwd_e/m
,grfwtarget_e/m
,表示对于寄存器的写入地址和数据,对于所有指令,显然每次只会写入一个寄存器。
保证在newt_x==0
且grfwe_x==1
时,地址和数据既为最终地址和数据。
因此可以做出设计:分别判断grf读出、alu进入、dm进入数据中的grfo1、grfo2对应地址是否与其后的寄存器中写入数据重复,若重复则转发
同时,判断E、M级的newt,当有newt>uset
且对应写寄存器与要用到的寄存器相同时
时输出 stall
信号。
stall
信号触发DE寄存器reset信号,失能PCreg,锁定FD寄存器。
延迟槽处理
修改npc,输入beq信号,若成立,则位于下一条指令,npc=pc+off,否则npc=pc+4
测试代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
ori $2,$0,1
add $3,$2,$0
beq $2,$3,save
add $3,$3,$3
lui $3,12
sub $4,$3,$2
ori $5,$0,12332
jr $5
save:
sw $4,4($0)
ori $5,$0,12300
jr $5
ori $6,$0,8
sw $5,8($6)
|
1
2
3
4
5
6
7
8
9
|
ori $sp,$0,8
ori $t0,$0,4908
lui $t7,65535
ori $t7,$t7,51744
sw $t7, -0x132c($t0)
sw $t7, -0x132c($t0)
sw $t7, -0x132c($t0)
sw $t7, -0x132c($t0)
sw $t7, ($sp)
|
思考题
- 如下
1
2
3
4
5
|
add $1,$1,$1
beq $1,$1,label
lw $1,($0)
beq $1,$1,label
|
此时beq阻塞,待alu/dm结果存入寄存器后才能继续
- 因为PC+4指令无论如何都会执行,故跳转与否下一条指令对应的地址应为PC+8
- 因为如果从功能部件转发,关键路径会被延长,特别是转发到部件前的位置,会成倍延长最长路径
- 可以少写几个信号,并且可以稍微加快速度。判断
A3==A&&A!=0$$WE
则转发
- grf内部转发,EMreg->D/E,MWreg->E/M
- 带有计算的指令,修改E级,带有存储的指令,修改DM,实在不行可以直接特判stall转化为单周期。
- 分布式译码,每级实例化总控制器,得到对应信号。优点是代码量少,缺点是控制器多,效率较低。