计组p5

设计文档

流水线层级设计

取指 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]

0 1
31’b0 EXT_o
  • 位于F,来源于CONST、FEXT_O
from pos
CONST any
FEXT_O this

F-NPCoffm [1]

0 1
0 beqmux_o
from pos
beqmux_o this
CONST any
  • 位于F,来源于CONST、BEQm

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]

0
ALU_o
from pos
ALU_O E

M-DMdm(GRF_o2)[1]

0
GRF_o2
from pos
GRF_o2 D

E-ALUam(GRF_o1,GRF_o2)[1]

0 1
GRF_o1 GRF_o2
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]

0
rs
from pos
rs this

D-GRFa2m(rt)[1]

0
rt
from pos
rt this

W-GRFa3m(rd,rt,31)[2]

0 1 2
rd rt 31
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/mgrfwtarget_e/m,表示对于寄存器的写入地址和数据,对于所有指令,显然每次只会写入一个寄存器。

保证在newt_x==0grfwe_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. 如下
1
2
3
4
5
add $1,$1,$1
beq $1,$1,label

lw $1,($0)
beq $1,$1,label

此时beq阻塞,待alu/dm结果存入寄存器后才能继续

  1. 因为PC+4指令无论如何都会执行,故跳转与否下一条指令对应的地址应为PC+8
  2. 因为如果从功能部件转发,关键路径会被延长,特别是转发到部件前的位置,会成倍延长最长路径
  3. 可以少写几个信号,并且可以稍微加快速度。判断A3==A&&A!=0$$WE则转发
  4. grf内部转发,EMreg->D/E,MWreg->E/M
  5. 带有计算的指令,修改E级,带有存储的指令,修改DM,实在不行可以直接特判stall转化为单周期。
  6. 分布式译码,每级实例化总控制器,得到对应信号。优点是代码量少,缺点是控制器多,效率较低。
Licensed under CC BY-NC-SA 4.0
京ICP备2021032224号-1
Built with Hugo
主题 StackJimmy 设计
vi ./themes/hugo-theme-learn/layouts/partials/footer.html