设计文档
流水线层级设计
取指 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转化为单周期。
- 分布式译码,每级实例化总控制器,得到对应信号。优点是代码量少,缺点是控制器多,效率较低。