赞
踩
处理器应支持 MIPS-C3 指令集。
MIPS-C3={LB、LBU、LH、LHU、LW、SB、SH、SW、ADD、ADDU、 SUB、 SUBU、 MULT、 MULTU、 DIV、 DIVU、 SLL、 SRL、 SRA、 SLLV、 SRLV、SRAV、AND、OR、XOR、NOR、ADDI、ADDIU、ANDI、ORI、 XORI、LUI、SLT、SLTI、SLTIU、SLTU、BEQ、BNE、BLEZ、BGTZ、 BLTZ、BGEZ、J、JAL、JALR、JR、MFHI、MFLO、MTHI、MTLO}
所有运算类指令均暂不考虑因溢出而产生的异常。
指令名 | 编号 | D_Tuse_GRF_A1 | D_Tuse_GRF_A2 | 产生回写值 | 最先保存回写值得级寄存器 | E_Tnew | M_Tnew | W_Tnew |
---|---|---|---|---|---|---|---|---|
LB | 0 | 1 | 不需要 | M_DM_out | WREG | 2 | 1 | 0 |
LBU | 1 | 1 | 不需要 | M_DM_out | WREG | 2 | 1 | 0 |
LH | 2 | 1 | 不需要 | M_DM_out | WREG | 2 | 1 | 0 |
LHU | 3 | 1 | 不需要 | M_DM_out | WREG | 2 | 1 | 0 |
LW | 4 | 1 | 不需要 | M_DM_out | WREG | 2 | 1 | 0 |
SB | 5 | 1 | 2 | 不回写 | 0 | 0 | 0 | |
SH | 6 | 1 | 2 | 不回写 | 0 | 0 | 0 | |
SW | 7 | 1 | 2 | 不回写 | 0 | 0 | 0 | |
ADD | 8 | 1 | 1 | E_ALU_C | MREG | 1 | 0 | 0 |
ADDU | 9 | 1 | 1 | E_ALU_C | MREG | 1 | 0 | 0 |
SUB | 10 | 1 | 1 | E_ALU_C | MREG | 1 | 0 | 0 |
SUBU | 11 | 1 | 1 | E_ALU_C | MREG | 1 | 0 | 0 |
MULT | 12 | 1 | 1 | 不回写 | — | — | — | |
MULTU | 13 | 1 | 1 | 不回写 | — | — | — | |
DIV | 14 | 1 | 1 | 不回写 | — | — | — | |
DIVU | 15 | 1 | 1 | 不回写 | — | — | — | |
SLL | 16 | 不需要 | 1 | E_ALU_C | MREG | 1 | 0 | 0 |
SRL | 17 | 不需要 | 1 | E_ALU_C | MREG | 1 | 0 | 0 |
SRA | 18 | 不需要 | 1 | E_ALU_C | MREG | 1 | 0 | 0 |
SLLV | 19 | 1 | 1 | E_ALU_C | MREG | 1 | 0 | 0 |
SRLV | 20 | 1 | 1 | E_ALU_C | MREG | 1 | 0 | 0 |
SRAV | 21 | 1 | 1 | E_ALU_C | MREG | 1 | 0 | 0 |
AND | 22 | 1 | 1 | E_ALU_C | MREG | 1 | 0 | 0 |
OR | 23 | 1 | 1 | E_ALU_C | MREG | 1 | 0 | 0 |
XOR | 24 | 1 | 1 | E_ALU_C | MREG | 1 | 0 | 0 |
NOR | 25 | 1 | 1 | E_ALU_C | MREG | 1 | 0 | 0 |
ADDI | 26 | 1 | 不需要 | E_ALU_C | MREG | 1 | 0 | 0 |
ADDIU | 27 | 1 | 不需要 | E_ALU_C | MREG | 1 | 0 | 0 |
ANDI | 28 | 1 | 不需要 | E_ALU_C | MREG | 1 | 0 | 0 |
ORI | 29 | 1 | 不需要 | E_ALU_C | MREG | 1 | 0 | 0 |
XORI | 30 | 1 | 不需要 | E_ALU_C | MREG | 1 | 0 | 0 |
LUI | 31 | 不需要 | 不需要 | E_ALU_C | MREG | 1 | 0 | 0 |
SLT | 32 | 0 | 0 | D_cmp_data | EREG | 0 | 0 | 0 |
SLTI | 33 | 0 | 不需要 | D_cmp_data | EREG | 0 | 0 | 0 |
SLTIU | 34 | 0 | 不需要 | D_cmp_data | EREG | 0 | 0 | 0 |
SLTU | 35 | 0 | 0 | D_cmp_data | EREG | 0 | 0 | 0 |
BEQ | 36 | 0 | 0 | 不回写 | 0 | 0 | 0 | |
BNE | 37 | 0 | 0 | 不回写 | 0 | 0 | 0 | |
BLEZ | 38 | 0 | 不需要 | 不回写 | 0 | 0 | 0 | |
BGTZ | 39 | 0 | 不需要 | 不回写 | 0 | 0 | 0 | |
BLTZ | 40 | 0 | 不需要 | 不回写 | 0 | 0 | 0 | |
BGEZ | 41 | 0 | 不需要 | 不回写 | 0 | 0 | 0 | |
J | 42 | 不需要 | 不需要 | 不回写 | 0 | 0 | 0 | |
JAL | 43 | 不需要 | 不需要 | D_PC+8 | DREG | 0 | 0 | 0 |
JALR | 44 | 0 | 不需要 | D_PC+8 | DREG | 0 | 0 | 0 |
JR | 45 | 0 | 不需要 | 不回写 | 0 | 0 | 0 | |
MFHI | 46 | 不需要 | 不需要 | E_MDU_out | MREG | 1 | 0 | 0 |
MFLO | 47 | 不需要 | 不需要 | E_MDU_out | MREG | 1 | 0 | 0 |
MTHI | 48 | 1 | 不需要 | 不回写 | 0 | 0 | 0 | |
MTLO | 49 | 1 | 不需要 | 不回写 | 0 | 0 | 0 |
2.1.1 PC
PC的主要功能是完成输出位于F级指令的地址
同步复位后,PC指向0x0000_3000
端口名 | 端口输入/输出信号名 | 端口描述 |
---|---|---|
input clk | clk | 时钟信号 |
input reset | reset | 同步复位信号,复位到0x0000_3000 |
input PC_en | Stall | 用于暂停操作,PC的使能端 当PC_en为0时,PC不工作,在时钟上升沿不改变值 |
input [31:0] F_NextPC | F_NextPC | 下一条指令所在地址 |
output reg [31:0] F_PC | F_PC | 当前F级指令所在地址 |
2.1.2 MUX_F_NextPC选择器(其实没什么用,懒得删了)
同步复位时选择32'h0000_3004
模块端口名 | 端口对应信号名 | 对输入信号的描述 |
---|---|---|
input [31:0] A | D_NextPC | 当前D级计算的Next_PC |
input [31:0] B | 32'h0000_3004 | |
input Sel | reset | 同步复位信号 |
output [31:0] Y | F_NextPC | 当前F级的Next_PC |
2.2.1 DCTRL
D级控制器
输出当前D级指令需要的控制信号
信号名 | 描述 |
---|---|
input [5:0] D_op | 当前D级指令的6位op码 |
input [4:0] D_rt | 当前D级指令的5位rt码,用于判定bgez和bltz |
input [5:0] D_func | 当前D级指令的6位func码 |
input D_cmp_sign | 当前D级指令的1位比较输出信号 |
input [5:0] E_order | 当前E级指令的编号(用于生成转发需求者信号) |
input [5:0] M_order | 当前M级指令的编号(用于生成转发需求者信号) |
output [4:0] D_EXTop | 当前D级指令EXT模块功能选择信号 00000:符号扩展 00001:0扩展 00010:加载至最高位,低位补0 |
output [4:0] D_CMPop | 当前D级指令CMP模块功能选择信号 00000:相等判断 |
output [4:0] D_NPCop | 当前D级指令NPC模块功能选择信号 00000:PC+4 00001:PC+4+sign_extend(imm16) 00010:PC[31:28]||imm26||00 00011:reg_data |
output [2:0] D_GRF_A1_Sel | 当前D级指令GRF_A1数据来源选择信号 000:D_rs |
output [2:0] D_GRF_A2_Sel | 当前D级指令GRF_A2数据来源选择信号 000:D_rt |
output [2:0] D_GRF_A3_Sel | 当前D级指令GRF_A3数据来源信号(本来应该在W级输出,但是由于转发需求) 000:D_rt 001:D_rd 010:31(jal) |
output [2:0] D_CMP_A_Sel | 当前D级指令CMP_A数据来源选择信号 000:D_TR_GRF_RD1 |
output [2:0] D_CMP_B_Sel | 当前D级指令CMP_B数据来源选择信号 000:D_TR_GRF_RD2 |
output [2:0] D_TR_GRF_RD1_Sel | 转发数据来源选择信号 |
output [2:0] D_TR_GRF_RD2_Sel | 转发数据来源选择信号 |
output [1:0] D_Tuse_GRF_A1 | 当前D级指令的GRF_A1的Tuse信号 |
output [1:0] D_Tuse_GRF_A2 | 当前D级指令的GRF_A2的Tuse信号 |
output D_NPC_PC_Sel | 当前D级NPC的PC输入选择信号 确定要跳转的指令为1(D_PC);顺序执行的指令为0(F_PC) |
output [5:0] D_order | 当前D级指令的6位编号 |
2.2.2 DREG
D级寄存器
保存当前D级指令(正在取操作数的指令)的信息
端口名 | 端口输入/输出信号名 | 描述 |
---|---|---|
input clk | clk | 时钟信号 |
input reset | reset | 同步复位信号,清空寄存器 |
input DREG_en | ~Stall | 用于暂停操作 |
input [31:0] F_IM_instr | F_IM_instr | 当前F级32位指令,在时钟上升沿写入DREG |
input [31:0] F_PC | F_PC | 当前F级指令的PC,在时钟上升沿写入DREG |
output [31:0] D_IM_instr | D_IM_instr | 当前D级32位指令 |
output [31:0] D_PC | D_PC | 当前D级指令的PC |
2.2.3 GRF(支持内部转发)
端口定义
信号名 | 描述 |
---|---|
input clk | 时钟信号 |
input reset | 同步复位信号 |
input [4:0] D_GRF_A1 | D级指令的5位地址输入信号,指定32个寄存器中的一个,将其中的数据输出到RD1 |
input [4:0] D_GRF_A2 | D级指令的5位地址输入信号,指定32个寄存器中的一个,将其中的数据输出到RD2 |
input [31:0] W_PC | 当前W级指令所在的IM地址 |
input [4:0] W_GRF_A3 | W级指令的5位地址输入信号,指定32个寄存器中的一个作为写入目标寄存器 |
input [31:0] W_GRF_WD | W级指令的32位写入数据 |
input W_RegWrite | W级指令的GRF写使能信号 |
output reg [31:0] D_GRF_RD1 | D级指令输出A1指定寄存器的32位数据 |
output reg [31:0] D_GRF_RD2 | D级指令输出A2指定寄存器的32位数据 |
功能定义
功能 | 描述 |
---|---|
读出数据 | 组合逻辑:读出D级指令D_GRF_A1和D_GRF_A3地址所对应的寄存器的值通过D_GRF_RD1和D_GRF_RD2读出。支持内部转发:将W级即将在下一个时钟周期写入的数据读出。(数据转发) |
写入数据 | 时序逻辑:当W_RegWrite为1且时钟上升沿来临时,将W级指令的W_GRF_WD写入W_GRF_A3(非0)所对应的寄存器中。0号寄存器的值始终为0。 |
同步复位 | 当reset为1且时钟上升沿来临时,将所有寄存器的值清零。 |
2.2.4 EXT
EXT功能是位扩展,将16位立即数扩展为32位立即数。
信号名 | 描述 |
---|---|
input [15:0] D_EXT_imm16 | D级指令的16位立即数输入 |
input [4:0] D_EXTop | EXT功能选择信号 |
output reg [31:0] D_EXT_imm32 | D级指令的32位扩展后的立即数输出 |
EXT功能选择信号表
D_EXTop | 编码对应运算 |
---|---|
5'd0(00000) | 符号扩展 |
5'd1(00001) | 零扩展 |
5'd2(00010) | 加载至最高位,低位补0 |
5'd3(00011) | 新扩展功能 |
2.2.5 mux_D_TR_GRF_RD1
GRF_RD1数据转发选择器
EREG,MREG
没有WREG(WREG采用GRF内部转发)
模块端口名 | 端口对应信号名 | 对输入信号的描述 |
---|---|---|
input [31:0] in_0 | 32'd0 | 摆烂 |
input [31:0] in_1 | D_GRF_RD1 | 当前D级的GRF_RD1(待更新) |
input [31:0] in_2 | M_TR_data | 当前M级的转发数据(可能不存在) |
input [31:0] in_3 | W_TR_data | 当前W级的转发数据(可能不存在) |
input Sel | D_TR_GRF_RD1_Sel | 转发需求者数据选择信号 |
output [31:0] Y | D_TR_GRF_RD1 | 新的转发需求者数据D |
2.2.6 mux_D_TR_GRF_RD2
GRF_RD2数据转发选择器
模块端口名 | 端口对应信号名 | 对输入信号的描述 |
---|---|---|
input [31:0] in_0 | 32'd0 | 摆烂 |
input [31:0] in_1 | D_GRF_RD2 | |
input [31:0] in_2 | M_TR_data | |
input [31:0] in_3 | W_TR_data | |
input Sel | D_TR_GRF_RD2_Sel | |
output [31:0] Y | D_TR_GRF_RD2 |
2.2.7 mux_CMP_A
D_CMP_A的数据来源选择器
模块端口名 | 端口对应信号名 | 描述 |
---|---|---|
input [31:0] in_0 | D_TR_GRF_RD1 | |
input [2:0] Sel | D_CMP_A_Sel | |
output [31:0] Y | D_CMP_A |
2.2.8 mux_CMP_B
D_CMP_B的数据来源选择器
模块端口名 | 端口对应信号名 | 描述 |
---|---|---|
input [31:0] in_0 | D_TR_GRF_RD2 | |
input [31:0] in_1 | D_EXT_imm32 | |
input [2:0] Sel | D_CMP_B_Sel | |
output [31:0] Y | D_CMP_B |
2.2.9 CMP
CMP的功能是输出条件比较的结果,可用于NPC跳转控制信号。
信号名 | 描述 |
---|---|
input [31:0] D_CMP_A | D级指令的32位比较数A的输入 |
input [31:0] D_CMP_B | D级指令的32位比较数B的输入 |
input [4:0] D_CMPop | D级功能选择信号 |
output [31:0] D_cmp_sign | D级指令的比较结果输出 |
CMP功能选择信号表
D_CMPop编码 | 编码对应运算 |
---|---|
5'd0(00000) | D_CMP_A==D_CMP_B(BEQ) |
5'd1(00001) | D_CMP_A!=D_CMP_B(BNE) |
5'd2(00010) | D_CMP_A<=0(BLEZ) |
5'd3(00011) | D_CMP_A>0(BGTZ) |
5'd4(00100) | D_CMP_A<0(BLTZ) |
5'd5(00101) | D_CMP_A>=0(BGEZ) |
5'd6(00110) | D_CMP_A<D_CMP_B(SLT,SLTI) 有符号比较 |
5'd7(00111) | D_CMP_A<D_CMP_B(SLTU,SLTIU)无符号比较 |
5'd8(01000) | 新比较运算 |
2.2.10 mux_D_NPC_PC
模块端口名 | 端口对应信号名 | 描述 |
---|---|---|
input [31:0] F_PC | F_PC | |
input [31:0] D_PC | D_PC | |
input Sel | D_NPC_PC_Sel 0:顺序执行 1:需要跳转(J指令,D_cmp_sign==1的B指令) | |
output [31:0] D_NPC_PC | D级NPC模块的32位D_NPC_PC输入 |
2.2.11 NPC
NPC的作用是计算转移指令的下一条指令的地址,当前转移指令(b类或j类)在D级
信号名 | 描述 |
---|---|
input [31:0] D_NPC_PC | NPC输入 确定跳转的指令为D_PC 不跳转的指令为F_PC |
input [15:0] D_imm16 | 当前D级指令的16位立即数 |
input [25:0] D_imm26 | 当前D级指令的26位立即数 |
input [31:0] D_reg_data | 当前D级指令跳转寄存器地址的寄存器数据 |
input [4:0] D_NPCop | 当前D级指令NPC控制信号 |
output reg [31:0] D_NextPC | 当前D级指令的下一条指令地址 |
2.2.12 mux_D_cmp_data
模块端口名 | 端口对应信号名 | 描述 |
---|---|---|
input [31:0] in_0 | 32'd0 | |
input [31:0] in_1 | 32'd1 | |
input Sel | D_cmp_sign | |
output [31:0] Y | D_cmp_data |
2.3.1 EREG
模块端口名 | 端口对应信号名 | 对输入信号的描述 |
---|---|---|
input clk | clk | |
input reset | reset|Stall | |
input [31:0] D_IM_instr | D_IM_instr | |
input [4:0] D_GRF_A1 | D_GRF_A1 | |
input [4:0] D_GRF_A2 | D_GRF_A2 | |
input [31:0] D_GRF_RD1 | D_TR_GRF_RD1 | |
input [31:0] D_GRF_RD2 | D_TR_GRF_RD2 | |
input [4:0] D_GRF_A3 | D_GRF_A3 | |
input [31:0] D_EXT_imm32 | D_EXT_imm32 | |
input D_cmp_sign | D_cmp_sign | |
input [31:0] D_cmp_data | D_cmp_data | |
input [31:0] D_PC | D_PC | |
output reg [31:0] E_IM_instr | E_IM_instr | |
output reg [4:0] E_GRF_A1 | E_GRF_A1 | |
output reg [4:0] E_GRF_A2 | E_GRF_A2 | |
output reg [31:0] E_GRF_RD1 | E_TR_GRF_RD1 | |
output reg [31:0] E_GRF_RD2 | E_TR_GRF_RD2 | |
output reg [4:0] E_GRF_A3 | E_GRF_A3 | |
output reg [31:0] E_EXT_imm32 | E_EXT_imm32 | |
output reg E_cmp_sign | E_cmp_sign | |
output reg [31:0] E_cmp_data | E_cmp_data | |
output reg [31:0] E_PC | E_PC |
2.3.2 ECTRL
信号名 | 描述 |
---|---|
input [5:0] E_op | |
input [4:0] E_rt | |
input [5:0] E_func | |
input [4:0] E_GRF_A1 | |
input [4:0] E_GRF_A2 | |
input [4:0] M_GRF_A3 | |
input [4:0] W_GRF_A3 | |
input [5:0] M_order | |
input [5:0] W_order | |
output reg [4:0] E_ALUop | |
output reg [4:0] E_MDUop | |
output [2:0] E_ALU_A_Sel | |
output reg [2:0] E_ALU_B_Sel | |
output [2:0] E_ALU_S_Sel | |
output [2:0] E_MDU_A_Sel | |
output [2:0] E_MDU_B_Sel | |
output [2:0] E_TR_GRF_RD1_Sel | |
output [2:0] E_TR_GRF_RD2_Sel | |
output [2:0] E_TR_data_Sel | |
output [1:0] E_Tnew | |
output [5:0] E_order |
2.3.3 ALU
端口定义
信号名 | 描述 |
---|---|
input [31:0] E_ALU_A | |
input [31:0] E_ALU_B | |
input [4:0] E_ALU_S | |
input [4:0] E_ALUop | |
output reg [31:0] E_ALU_C |
ALU功能选择信号表
E_ALUop编码 | 编码对应运算 |
---|---|
5'd0(00000) | E_ALU_A&E_ALU_B |
5'd1(00001) | E_ALU_A|E_ALU_B |
5'd2(00010) | E_ALU_A+E_ALU_B(无符号加) |
5'd3(00011) | 符号加 |
5'd4(00100) | E_ALU_A-E_ALU_B(无符号减) |
5'd5(00101) | 符号减 |
5'd6(00110) | E_ALU_A 或非 E_ALU_B |
5'd7(00111) | 逻辑左移 |
5'd8(01000) | 算术右移 |
5'd9(01001) | 逻辑右移 |
5'd10(01010) | E_ALU_A 异或 E_ALU_B |
5'd11(01011) | E_ALU_B |
5'd12(01100) | 新运算 |
2.3.4 MDU
端口定义
信号名 | 描述 |
---|---|
input clk | 时钟信号 |
input reset | 同步复位信号 |
input [31:0] E_MDU_A | 乘除模块输入的第一个32位运算数 |
input [31:0] E_MDU_B | 乘除模块输入的第二个32位运算数 |
input [4:0] E_MDUop | 乘除模块功能选择信号 |
output E_MDU_busy | E_MDU_busy为1时说明乘除模块在工作 |
output reg [31:0] E_MDU_out | 乘除模块的32位输出 |
乘除模块功能选择信号
M_MDUop编码 | 编码对应运算 | 指令 |
---|---|---|
5'd0(00000) | 对MDU没有操作 | 其他不涉及MDU的指令 |
5'd1(00001) | 乘 | MULT |
5'd2(00010) | 乘(无符号) | MULTU |
5'd3(00011) | 除 | DIV |
5'd4(00100) | 除(无符号) | DIVU |
5'd5(00101) | 读HI | MFHI |
5'd6(00110) | 读LO | MFLO |
5'd7(00111) | 写HI | MTHI |
5'd8(01000) | 写LO | MTLO |
5'd9(01001) | 新操作 |
2.3.5 mux_E_TR_GRF_RD1
GRF_RD1数据转发选择器
模块端口名 | 端口对应信号名 | 对输入信号的描述 |
---|---|---|
input [31:0] in_0 | 32'd0 | |
input [31:0] in_1 | E_GRF_RD1 | |
input [31:0] in_2 | M_TR_data | |
input [31:0] in_3 | W_TR_data | |
input Sel | E_TR_GRF_RD1_Sel | |
output [31:0] Y | E_TR_GRF_RD1 |
2.3.6 mux_E_TR_GRF_RD2
GRF_RD2数据转发选择器
模块端口名 | 端口对应信号名 | 对输入信号的描述 |
---|---|---|
input [31:0] in_0 | 32'd0 | |
input [31:0] in_1 | E_GRF_RD2 | |
input [31:0] in_2 | M_TR_data | |
input [31:0] in_3 | W_TR_data | |
input [2:0] Sel | E_TR_GRF_RD2_Sel | |
output [31:0] Y | E_TR_GRF_RD2 |
2.3.7 mux_E_TR_data
模块端口名 | 端口对应信号名 | 对输入信号的描述 |
---|---|---|
input [31:0] in_0 | E_PC+8 | |
input [31:0] in_1 | E_cmp_data | |
input [2:0] Sel | E_TR_data_Sel | |
output [31:0] Y | E_TR_data |
2.4.1 MREG
模块端口 | 端口对应信号名 | 对信号的描述 |
---|---|---|
input clk | clk | |
input reset | reset | |
input [31:0] E_IM_instr | E_IM_instr | |
input [31:0] E_PC | E_PC | |
input [4:0] E_GRF_A2 | E_GRF_A2 | |
input [31:0] E_GRF_RD2 | E_TR_GRF_RD2 | |
input [4:0] E_GRF_A3 | E_GRF_A3 | |
input [31:0] E_ALU_C | E_ALU_C | |
input [31:0] E_MDU_out | E_MDU_out | |
input E_cmp_sign | E_cmp_sign | |
input [31:0] E_cmp_data | E_cmp_data | |
output [31:0] M_IM_instr | M_IM_instr | |
output [31:0] M_PC | M_PC | |
output [4:0] M_GRF_A2 | M_GRF_A2 | |
output [31:0] M_GRF_RD2 | M_GRF_RD2 | |
output [4:0] M_GRF_A3 | M_GRF_A3 | |
output [31:0] M_ALU_C | M_ALU_C | |
output [31:0] M_MDU_out | M_MDU_out | |
output M_cmp_sign | M_cmp_sign | |
output [31:0] M_cmp_data | M_cmp_data |
2.4.2 MCTRL
信号名 | 描述 |
---|---|
input [5:0] M_op | |
input [4:0] M_rt | |
input [5:0] M_func | |
input [4:0] M_GRF_A2 | |
input [4:0] W_GRF_A3 | |
input [5:0] W_order | |
output [3:0] m_data_byteen | 当前M级指令DM写使能 |
output [2:0] M_DMEXTop | |
output [2:0] M_DM_A_Sel | |
output [2:0] M_DM_data_Sel | |
output [2:0] M_TR_GRF_RD2_Sel | |
output [2:0] M_TR_data_Sel | |
output [1:0] M_Tnew | |
output [5:0] M_order |
2.4.3 DMEXT
数据扩展模块
信号名 | 描述 |
---|---|
input [31:0] M_DM_A | 从外置DM中取的数据所在字的地址,DMEXT模块只取最后两位 |
input [31:0] m_data_rdata | 从外置DM中取出来的32位待处理数据 |
input [2:0] M_DMEXTop | 数据扩展模块功能选择 |
output [31:0] M_DM_out | 数据扩展后的32位数数据 |
数据扩展模块功能选择信号表
M_DMEXTop编码 | 编码对应功能 |
---|---|
3'd0(000) | 无扩展 |
3'd1(001) | 无符号字节扩展 |
3'd2(010) | 符号字节扩展 |
3'd3(011) | 无符号半字扩展 |
3'd4(100) | 符号半字扩展 |
3'd5(101) | 新扩展 |
2.4.4 mux_M_TR_GRF_RD2
GRF_RD2数据转发选择器
模块端口名 | 端口对应信号名 | 对输入信号的描述 |
---|---|---|
input [31:0] in_0 | 32'd0 | |
input [31:0] in_1 | M_GRF_RD2 | |
input [31:0] in_2 | W_TR_data | |
input [2:0] Sel | M_TR_GRF_RD2_Sel | |
output [31:0] Y | M_TR_GRF_RD2 |
2.4.5 mux_M_TR_data
模块端口名 | 端口对应信号名 | 对输入信号的描述 |
---|---|---|
input [31:0] in_0 | M_ALU_C | |
input [31:0] in_1 | M_PC+8 | |
input [31:0] in_2 | M_MDU_out | |
input [31:0] in_3 | M_cmp_data | |
input [2:0] Sel | M_TR_data_Sel | |
output [31:0] Y | M_TR_data |
2.5.1 WREG
模块端口 | 端口对应信号吗 | 对输入信号的描述 |
---|---|---|
input clk | ||
input reset | ||
input [31:0] M_IM_instr | ||
input [31:0] M_ALU_C | ||
input [31:0] M_MDU_out | ||
input [31:0] M_DM_out | ||
input [4:0] M_GRF_A3 | ||
input M_cmp_sign | ||
input [31:0] M_cmp_data | ||
input [31:0] M_PC | ||
output [31:0] W_IM_instr | ||
output [31:0] W_ALU_C | ||
output [31:0] W_MDU_out | ||
output [31:0] W_DM_out | ||
output [4:0] M_GRF_A3 | ||
output W_cmp_sign | ||
output [31:0] W_cmp_data | ||
output [31:0] W_PC |
2.5.2 WCTRL
信号名 | 描述 |
---|---|
input [5:0] W_op | |
input [4:0] W_rt | |
input [5:0] W_func | |
output reg W_RegWrite | |
output reg [2:0] W_GRF_WD_Sel | |
output [1:0] W_Tnew | |
output [5:0] W_order |
2.5.3 mux_W_GRF_WD
模块端口名 | 端口对应信号名 | 对输入信号的描述 |
---|---|---|
input [31:0] in_0 | W_ALU_C | |
input [31:0] in_1 | W_DM_out | |
input [31:0] in_2 | W_PC+8 | |
input [31:0] in_3 | W_MDU_out | |
input [31:0] in_4 | W_cmp_data | |
input [2:0] Sel | W_GRF_WD_Sel | |
output [31:0] Y | W_GRF_WD |
2.5.4 mux_W_TR_data
和mux_W_GRF_WD一致
assign W_TR_data=W_GRF_WD;
信号名 | 描述 |
---|---|
input [1:0] D_Tuse_GRF_A1 | |
input [1:0] D_Tuse_GRF_A1 | |
input [1:0] E_Tnew | |
input [1:0] M_Tnew | |
input [1:0] W_Tnew | |
input [5:0] D_order | |
input [4:0] D_GRF_A1 | |
input [4:0] D_GRF_A2 | |
input [4:0] E_GRF_A3 | |
input [4:0] M_GRF_A3 | |
input [4:0] W_GRF_A3 | |
input E_MDU_busy | |
output Stall |
指令名 | 编号 | D_EXTop | D_CMPop | D_NPCop | E_ALUop | E_MDUop | M_DMEXTop |
---|---|---|---|---|---|---|---|
LB | 0 | 0 | - | 0 | 2 | - | 2 |
LBU | 1 | 0 | - | 0 | 2 | - | 1 |
LH | 2 | 0 | - | 0 | 2 | - | 4 |
LHU | 3 | 0 | - | 0 | 2 | - | 3 |
LW | 4 | 0 | - | 0 | 2 | - | 0 |
SB | 5 | 0 | - | 0 | 2 | - | - |
SH | 6 | 0 | - | 0 | 2 | - | - |
SW | 7 | 0 | - | 0 | 2 | - | - |
ADD | 8 | - | - | 0 | 3 | - | - |
ADDU | 9 | - | - | 0 | 2 | - | - |
SUB | 10 | - | - | 0 | 5 | - | - |
SUBU | 11 | - | - | 0 | 4 | - | - |
MULT | 12 | - | - | 0 | - | 1 | - |
MULTU | 13 | - | - | 0 | - | 2 | - |
DIV | 14 | - | - | 0 | - | 3 | - |
DIVU | 15 | - | - | 0 | - | 4 | - |
SLL | 16 | - | - | 0 | 7 | - | - |
SRL | 17 | - | - | 0 | 9 逻辑右移 | - | - |
SRA | 18 | - | - | 0 | 8 算术右移 | - | - |
SLLV | 19 | - | - | 0 | 7 | - | - |
SRLV | 20 | - | - | 0 | 9 逻辑可变右移 | - | - |
SRAV | 21 | - | - | 0 | 8 算术可变右移 | - | - |
AND | 22 | - | - | 0 | 0 | - | - |
OR | 23 | - | - | 0 | 1 | - | - |
XOR | 24 | - | - | 0 | 10 | - | - |
NOR | 25 | - | - | 0 | 6 | - | - |
ADDI | 26 | 0 | - | 0 | 3 | - | - |
ADDIU | 27 | 0 | - | 0 | 2 | - | - |
ANDI | 28 | 1 | - | 0 | 0 | - | - |
ORI | 29 | 1 | - | 0 | 1 | - | - |
XORI | 30 | 1 | - | 0 | 10 | - | - |
LUI | 31 | 2 | - | 0 | 11 | - | - |
SLT | 32 | - | 6 | 0 | - | - | - |
SLTI | 33 | 0 | 6 | 0 | - | - | - |
SLTIU | 34 | 0 | 7 | 0 | - | - | - |
SLTU | 35 | - | 7 | 0 | - | - | - |
BEQ | 36 | - | 0 | (D_cmp_sign==1) 1 | - | - | - |
BNE | 37 | - | 1 | (D_cmp_sign==1) 1 | - | - | - |
BLEZ | 38 | - | 2 | (D_cmp_sign==1) 1 | - | - | - |
BGTZ | 39 | - | 3 | (D_cmp_sign==1) 1 | - | - | - |
BLTZ | 40 | - | 4 | (D_cmp_sign==1) 1 | - | - | - |
BGEZ | 41 | - | 5 | (D_cmp_sign==1) 1 | - | - | - |
J | 42 | - | - | 2 | - | - | - |
JAL | 43 | - | - | 2 | - | - | - |
JALR | 44 | - | - | 3 | - | - | - |
JR | 45 | - | - | 3 | - | - | - |
MFHI | 46 | - | - | 0 | - | 5 | - |
MFLO | 47 | - | - | 0 | - | 6 | - |
MTHI | 48 | - | - | 0 | - | 7 | - |
MTLO | 49 | - | - | 0 | - | 8 | - |
指令名 | 编号 | D_GRF_A1_Sel | D_GRF_A2_Sel | D_GRF_A3_Sel | D_CMP_A_Sel | D_CMP_B_Sel | D_NPC_PC_Sel |
---|---|---|---|---|---|---|---|
LB | 0 | 0 | - | 0 | - | - | 0 |
LBU | 1 | 0 | - | 0 | - | - | 0 |
LH | 2 | 0 | - | 0 | - | - | 0 |
LHU | 3 | 0 | - | 0 | - | - | 0 |
LW | 4 | 0 | - | 0 | - | - | 0 |
SB | 5 | 0 | 0 | - | - | - | 0 |
SH | 6 | 0 | 0 | - | - | - | 0 |
SW | 7 | 0 | 0 | - | - | - | 0 |
ADD | 8 | 0 | 0 | 1 | - | - | 0 |
ADDU | 9 | 0 | 0 | 1 | - | - | 0 |
SUB | 10 | 0 | 0 | 1 | - | - | 0 |
SUBU | 11 | 0 | 0 | 1 | - | - | 0 |
MULT | 12 | 0 | 0 | - | - | - | 0 |
MULTU | 13 | 0 | 0 | - | - | - | 0 |
DIV | 14 | 0 | 0 | - | - | - | 0 |
DIVU | 15 | 0 | 0 | - | - | - | 0 |
SLL | 16 | - | 0 | 1 | - | - | 0 |
SRL | 17 | - | 0 | 1 | - | - | 0 |
SRA | 18 | - | 0 | 1 | - | - | 0 |
SLLV | 19 | - | 0 | 1 | - | - | 0 |
SRLV | 20 | - | 0 | 1 | - | - | 0 |
SRAV | 21 | - | 0 | 1 | - | - | 0 |
AND | 22 | 0 | 0 | 1 | - | - | 0 |
OR | 23 | 0 | 0 | 1 | - | - | 0 |
XOR | 24 | 0 | 0 | 1 | - | - | 0 |
NOR | 25 | 0 | 0 | 1 | - | - | 0 |
ADDI | 26 | 0 | - | 0 | - | - | 0 |
ADDIU | 27 | 0 | - | 0 | - | - | 0 |
ANDI | 28 | 0 | - | 0 | - | - | 0 |
ORI | 29 | 0 | - | 0 | - | - | 0 |
XORI | 30 | 0 | - | 0 | - | - | 0 |
LUI | 31 | - | - | 0 | - | - | 0 |
SLT | 32 | 0 | 0 | 1 | 0 | 0 | 0 |
SLTI | 33 | 0 | - | 0 | 0 | 1 | 0 |
SLTIU | 34 | 0 | - | 0 | 0 | 1 | 0 |
SLTU | 35 | 0 | 0 | 1 | 0 | 0 | 0 |
BEQ | 36 | 0 | 0 | - | 0 | 0 | (D_cmp_sign==1) 1 |
BNE | 37 | 0 | 0 | - | 0 | 0 | (D_cmp_sign==1) 1 |
BLEZ | 38 | 0 | - | - | 0 | - | (D_cmp_sign==1) 1 |
BGTZ | 39 | 0 | - | - | 0 | - | (D_cmp_sign==1) 1 |
BLTZ | 40 | 0 | - | - | 0 | - | (D_cmp_sign==1) 1 |
BGEZ | 41 | 0 | - | - | 0 | - | (D_cmp_sign==1) 1 |
J | 42 | - | - | - | - | - | 1 |
JAL | 43 | - | - | 2 | - | - | 1 |
JALR | 44 | 0 | - | 1 | - | - | 1 |
JR | 45 | 0 | - | - | - | - | 1 |
MFHI | 46 | - | - | 1 | - | - | 0 |
MFLO | 47 | - | - | 1 | - | - | 0 |
MTHI | 48 | 0 | - | - | - | - | 0 |
MTLO | 49 | 0 | - | - | - | - | 0 |
指令名 | 编号 | E_ALU_A_Sel | E_ALU_B_Sel | E_ALU_S_Sel | E_MDU_A_Sel | E_MDU_B_Sel |
---|---|---|---|---|---|---|
LB | 0 | 0 | 1 | - | - | - |
LBU | 1 | 0 | 1 | - | - | - |
LH | 2 | 0 | 1 | - | - | - |
LHU | 3 | 0 | 1 | - | - | - |
LW | 4 | 0 | 1 | - | - | - |
SB | 5 | 0 | 1 | - | - | - |
SH | 6 | 0 | 1 | - | - | - |
SW | 7 | 0 | 1 | - | - | - |
ADD | 8 | 0 | 0 | - | - | - |
ADDU | 9 | 0 | 0 | - | - | - |
SUB | 10 | 0 | 0 | - | - | - |
SUBU | 11 | 0 | 0 | - | - | - |
MULT | 12 | - | - | - | 0 | 0 |
MULTU | 13 | - | - | - | 0 | 0 |
DIV | 14 | - | - | - | 0 | 0 |
DIVU | 15 | - | - | - | 0 | 0 |
SLL | 16 | - | 0 | 0 | - | - |
SRL | 17 | - | 0 | 0 | - | - |
SRA | 18 | - | 0 | 0 | - | - |
SLLV | 19 | - | 0 | 1 | - | - |
SRLV | 20 | - | 0 | 1 | - | - |
SRAV | 21 | - | 0 | 1 | - | - |
AND | 22 | 0 | 0 | - | - | - |
OR | 23 | 0 | 0 | - | - | - |
XOR | 24 | 0 | 0 | - | - | - |
NOR | 25 | 0 | 0 | - | - | - |
ADDI | 26 | 0 | 1 | - | - | - |
ADDIU | 27 | 0 | 1 | - | - | - |
ANDI | 28 | 0 | 1 | - | - | - |
ORI | 29 | 0 | 1 | - | - | - |
XORI | 30 | 0 | 1 | - | - | - |
LUI | 31 | - | 1 | - | - | - |
SLT | 32 | - | - | - | - | - |
SLTI | 33 | - | - | - | - | - |
SLTIU | 34 | - | - | - | - | - |
SLTU | 35 | - | - | - | - | - |
BEQ | 36 | - | - | - | - | - |
BNE | 37 | - | - | - | - | - |
BLEZ | 38 | - | - | - | - | - |
BGTZ | 39 | - | - | - | - | - |
BLTZ | 40 | - | - | - | - | - |
BGEZ | 41 | - | - | - | - | - |
J | 42 | - | - | - | - | - |
JAL | 43 | - | - | - | - | - |
JALR | 44 | - | - | - | - | - |
JR | 45 | - | - | - | - | - |
MFHI | 46 | - | - | - | - | - |
MFLO | 47 | - | - | - | - | - |
MTHI | 48 | - | - | - | 0 | - |
MTLO | 49 | - | - | - | 0 | - |
指令名 | 编号 | M_DM_A_Sel | M_DM_data_Sel | W_GRF_WD_Sel |
---|---|---|---|---|
LB | 0 | 0 | - | 1 W_DM_out |
LBU | 1 | 0 | - | 1 W_DM_out |
LH | 2 | 0 | - | 1 W_DM_out |
LHU | 3 | 0 | - | 1 W_DM_out |
LW | 4 | 0 | - | 1 W_DM_out |
SB | 5 | 0 | 0 | - |
SH | 6 | 0 | 0 | - |
SW | 7 | 0 | 0 | - |
ADD | 8 | - | - | 0 W_ALU_C |
ADDU | 9 | - | - | 0 W_ALU_C |
SUB | 10 | - | - | 0 W_ALU_C |
SUBU | 11 | - | - | 0 W_ALU_C |
MULT | 12 | - | - | - |
MULTU | 13 | - | - | - |
DIV | 14 | - | - | - |
DIVU | 15 | - | - | - |
SLL | 16 | - | - | W_ALU_C |
SRL | 17 | - | - | W_ALU_C |
SRA | 18 | - | - | W_ALU_C |
SLLV | 19 | - | - | W_ALU_C |
SRLV | 20 | - | - | W_ALU_C |
SRAV | 21 | - | - | W_ALU_C |
AND | 22 | - | - | W_ALU_C |
OR | 23 | - | - | W_ALU_C |
XOR | 24 | - | - | W_ALU_C |
NOR | 25 | - | - | W_ALU_C |
ADDI | 26 | - | - | W_ALU_C |
ADDIU | 27 | - | - | W_ALU_C |
ANDI | 28 | - | - | W_ALU_C |
ORI | 29 | - | - | W_ALU_C |
XORI | 30 | - | - | W_ALU_C |
LUI | 31 | - | - | W_ALU_C |
SLT | 32 | - | - | 4 W_cmp_data |
SLTI | 33 | - | - | 4 W_cmp_data |
SLTIU | 34 | - | - | 4 W_cmp_data |
SLTU | 35 | - | - | 4 W_cmp_data |
BEQ | 36 | - | - | - |
BNE | 37 | - | - | - |
BLEZ | 38 | - | - | - |
BGTZ | 39 | - | - | - |
BLTZ | 40 | - | - | - |
BGEZ | 41 | - | - | - |
J | 42 | - | - | - |
JAL | 43 | - | - | W_PC+8 |
JALR | 44 | - | - | W_PC+8 |
JR | 45 | - | - | - |
MFHI | 46 | - | - | W_MDU_out |
MFLO | 47 | - | - | W_MDU_out |
MTHI | 48 | - | - | - |
MTLO | 49 | - | - | - |
指令名 | 编号 | m_data_byteen | W_RegWrite |
---|---|---|---|
LB | 0 | 0000 | 1 |
LBU | 1 | 0000 | 1 |
LH | 2 | 0000 | 1 |
LHU | 3 | 0000 | 1 |
LW | 4 | 0000 | 1 |
SB | 5 | 0001 | 0 |
SH | 6 | 0011 | 0 |
SW | 7 | 1111 | 0 |
ADD | 8 | 0000 | 1 |
ADDU | 9 | 0000 | 1 |
SUB | 10 | 0000 | 1 |
SUBU | 11 | 0000 | 1 |
MULT | 12 | 0000 | 0 |
MULTU | 13 | 0000 | 0 |
DIV | 14 | 0000 | 0 |
DIVU | 15 | 0000 | 0 |
SLL | 16 | 0000 | 1 |
SRL | 17 | 0000 | 1 |
SRA | 18 | 0000 | 1 |
SLLV | 19 | 0000 | 1 |
SRLV | 20 | 0000 | 1 |
SRAV | 21 | 0000 | 1 |
AND | 22 | 0000 | 1 |
OR | 23 | 0000 | 1 |
XOR | 24 | 0000 | 1 |
NOR | 25 | 0000 | 1 |
ADDI | 26 | 0000 | 1 |
ADDIU | 27 | 0000 | 1 |
ANDI | 28 | 0000 | 1 |
ORI | 29 | 0000 | 1 |
XORI | 30 | 0000 | 1 |
LUI | 31 | 0000 | 1 |
SLT | 32 | 0000 | 1 |
SLTI | 33 | 0000 | 1 |
SLTIU | 34 | 0000 | 1 |
SLTU | 35 | 0000 | 1 |
BEQ | 36 | 0000 | 0 |
BNE | 37 | 0000 | 0 |
BLEZ | 38 | 0000 | 0 |
BGTZ | 39 | 0000 | 0 |
BLTZ | 40 | 0000 | 0 |
BGEZ | 41 | 0000 | 0 |
J | 42 | 0000 | 0 |
JAL | 43 | 0000 | 1 |
JALR | 44 | 0000 | 1 |
JR | 45 | 0000 | 0 |
MFHI | 46 | 0000 | 1 |
MFLO | 47 | 0000 | 1 |
MTHI | 48 | 0000 | 0 |
MTLO | 49 | 0000 | 0 |
侧重点在E级的MDU和ALU的新运算算法
MDU指令需要修改Stall_CTRL,将新指令标签添加到Stall_MDU中。(一般不用考虑Tnew)
侧重点在D级的CMP的新比较算法
一般为两种指令的结合。比如blezals就是B类跳转指令和jal的结合体。
可能会考到清空延迟槽操作。如果D_cmp_sign==0且Stall==0的时候,产生一个DREG_clr信号,清空DREG。DREG_clr信号的优先级是低于Stall暂停信号的。
因为回写的寄存器地址直到M级才确定,所以一般比较难,需要修改Stall_CTRL模块。
将新指令编号为6'd50,并将其添加到macro_Decode.v模块中
在Decode_CTRL中根据op,func可能还有rt位将新指令加入到else if语句中
根据是否需要用到rs和rt来确定D_Tuse_GRF_A1和D_Tuse_GRF_A2,以及什么时候寄存器中保存了回写数据确定E_Tnew,M_Tnew和W_Tnew。填上面的Tuse和Tnew的表格。
将D_Tuse_GRF_A1和D_Tuse_GRF_A2加入到DCTRL中,将E_Tnew加入到ECTRL,M_Tnew加入到MCTRL,W_Tnew加入到WCTRL中。
注意:记得先修改模块!!!添加模块新功能!!!
思考转发有两个很重要的角度:供给者和需求者
6.4.1 供给者
供给者角度问两个很重要的问题:
该指令是否需要回写?
如果不需要,直接跳过供给者修改部分。
如果需要回写的话,是否产生了新的回写GRF的数据? 就是除了cmp_data,ALU_C,PC+8,DM_out之外的新数据
如果没有产生新数据,判断该指令回写数据属于哪个类别,将它的指令标签添加到两个地方。
根据在最先保存在哪一级REG中修改TR_data_Sel控制信号(供给者)只需添加新指令标签
最早保存在EREG里的回写数据(如cmp_data,PC+8),修改E_TR_data_Sel,M_TR_data_Sel以及W_TR_data_Sel
最先保存在MREG里的回写数据(如ALU_C,MDU_out),修改M_TR_data_Sel,W_TR_data_Sel
最先保存在WREG里的回写数据(如DM_out),修改W_GRF_WD_Sel即可
根据在哪级最先保存回写数据,修改所有前级的TR_GRF_RD1_Sel和TR_GRF_RD2_Sel控制信号,添加新指令的标签啦
如果产生了新数据,可能稍稍有点麻烦了。首先要判断新数据最先出现在哪个流水级寄存器中,然后在mips顶层中的该级及该级之后的所有级mux_TR_data数据选择器中增加新的端口,并添加相应的控制信号。
最先保存回写数据的流水级前面所有的TR_GRF_RD1_Sel和TR_GRF_RD2_Sel都要进行修改(将新指令标签添加到所有保存该指令回写数据的if-else语句中即可)
如果是最先保存在WREG中,D级采用内部转发
要注意该新回写数据的优先级(在写控制信号的时候)
6.4.2 需求者
需求者需要考虑的问题:
该指令是否有新的使用寄存器值的地方?
如果没有,那就直接跳过。
如果有的话,添加新的转发mux,(mips中加mux以及控制器中添加控制信号)。
6.4.3 需要考虑的控制信号
D_TR_GRF_RD1_Sel
D_TR_GRF_RD2_Sel
E_TR_GRF_RD1_Sel
E_TR_GRF_RD2_Sel
M_TR_GRF_RD2_Sel
E_TR_data_Sel
M_TR_data_Sel
W_TR_data_Sel
如果是MDU计算类指令(P6一般都是),要修改Stall_CTRL模块,将新指令标签添加到Stall_MDU中
暂停需要先问一个问题:该指令的回写寄存器编号GRF_A3在D级是否可以确定。如果可以确定,那么就不需要做其他修改了。
如果是存储类指令:
在M级确定GRF_A3,并且在W级保存正确的GRF_A3时,先让D_GRF_A3,E_GRF_A3,M_GRF_A3=5'd0。
有两种不确定可能分别为:GRF_A3二选一模式和GRF_A3完全不确定模式
6.5.1 二选一模式
将D_GRF_A3_Sel=3,选择0号寄存器。
将它的两个可能的寄存器值都进入流水线,设为D_GRF_A3_X1,D_GRF_A3_X2,E_GRF_A3_X1,E_GRF_A3,X2,M_GRF_A3_X1,M_GRF_A3_X2,在M级确定真正的M_GRF_A3_new,将其输入在WREG的M_GRF_A3口
将E_GRF_A3_X1,E_GRF_A3_X2,M_GRF_A3_X1,M_GRF_A3_X2,E_order,M_order传入Stall_CTRL控制器。添加判断。主要是添加E和M的判断,W不用管。
别忘了把新的暂停信号和总的暂停信号|起来
6.5.2 不确定模式
将D_GRF_A3_Sel=3,选择0号寄存器
将E_order和M_order传入Stall_CTRL控制器。添加判断。主要是添加E和M的判断。
在M级直接给M_GRF_A3赋值
因为乘除法的运算速率明显低于其他运算,需要多个时钟周期,为了不干扰其他运算指令的进行,因此将乘除法分离出ALU,自成一个部件。独立的HI、LO寄存器可以保存乘除法运算的值,如果不保存,要等运算完把值存入相应的寄存器,最坏情况会暂停11个周期,这大大降低了流水线CPU的性能,不是我们想要的。
乘除槽就是因乘除法运算的大量时间导致出的结果延后性,即想要这个结果需要等待一定长的时间,这个时间我们自然是不想要浪费的,可以用于运行其他不需要用到乘除器的指令,以保证流水线CPU的性能。
当遇到sb,sh等指令,按字节访存比按字访存更好,如果按字访存,则需要将整个字取出后再进行更改,可能会引起电路震荡,如果按字节访存,则直接对字节进行修改,不用再取出修改了。
指令冲突跟P5差不多,都是计算型指令,jr,beq,load、store的互相冲突,新增的sw,sb,sh可以概括为store类指令,lb,lbu,lhu,lh概括为load指令,jr,jalr指令为一类,beq,bgez,bne,blez…为一类branch指令,其他除乘除法的计算型指令的Tuse,Tnew几乎一样。而mflo、mfhi、mthi、mtlo与乘除器的冲突都用暂停解决。同样,转发机制与P5就基本一样,因为除乘除法指令外,所有冒险冲突解决机制都搭建好了,只需更改级控制器中的Tuse和Tnew信号。
我要做的测试样例就是测试指令功能的正确性,冒险冲突的解决检验只需要将同类型指令更换。
写Tuse的时候要记得同时分别考虑rs(A1)和rt(A2)的使用情况,不要遗漏。
当只有一种情况的时候,直接使用assign语句,千万不要使用always@(*)块
直接assign M_DMop=5'd0;
区分output和output reg
output对应assign语句赋值的变量
output reg对应always @(*)块赋值的变量
如果将assign改为always@(*)块,记得将output改为output reg
记得所有if_else语句最后要加else begin_end,避免产生锁存器
信号优先级:顶层reset>stall>延迟操清零
清空延迟槽的优先级在Stall后面
reg型变量计数器是否清零
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。