支持的指令
指令类别 | 指令 |
---|---|
运算指令 | ADDU, ADDIU, SUBU, ADD, ADDI, SUB, SLTI, SLTIU, ANDI, ORI, XORI, SLLV, SRLV, SRAV |
转移指令 | BGEZ, BGTZ, BLTZ, J, BLTZAL, BGEZAL, JALR |
访存指令 |
- 流水线前递解决相关冲突
- 加入各级dest信号到译码级,增加有效位判断
- 译码级进行bypass逻辑处理
- top模块连线
- 实验验证
- 添加算术逻辑运算类指令ADD,ADDI,SUB,SLTI,SLTIU,ANDI,ORI,XORI,SLLV,SRLV,SRAV
- ADD
- ADDI
- SUB
- SLTI
- SLTIU
- ANDI
- ORI
- XORI
- SLLV
- SRLV
- SRAV
- 添加乘除法指令
- booth 定点乘法器
- 添加转移指令
- BGEZ
- BGTZ
- BLTZ
- J
- BLTZAL
- BGEZAL
- JALR
- 添加访存指令
- LB
- LBU
- LH
- LHU
- LWL
- LWR
- SB
- SH
- SWL
- SWR
- 添加例外和中断的支持
- add inst about MTC0
- add inst about MFC0
- add inst about ERTE
- add CP0 register about Status, Cause, EPC
- add inst about SYSTEMCALL
- 添加了
JALR
指令- 在
ID stage
中添加inst_jalr
信号 - 增加对指令的判断:
assign inst_jalr = op_d[6'h00] & func_d[6'h09];
- 添加
alu_op[ 0]
信号的ALU调用逻辑 - 添加
src2_is_8
信号,使得PC加8 - 在跳转指示信号
br_taken
中增加inst_jalr
- 在
br_taken
中增加inst_jalr
的转移地址,逻辑与inst_jr
相同
- 在
- 添加了
BGEZAL
指令- 在
ID stage
中添加inst_bgezal
信号,增加对指令的判断 - 添加
alu_op[ 0]
信号的ALU调用逻辑 - 添加
src2_is_8
信号,使得PC加8 - 添加
dst_is_r31
信号,使得目的寄存器为31号通用寄存器 - 在跳转指示信号
br_taken
中增加inst_bgezal
- 在
br_taken
中增加inst_bgezal
的转移地址,逻辑与inst_bgez
相同
- 在
- 添加了
BLTZAL
指令- 在
ID stage
中添加inst_bltzal
信号,增加对指令的判断 - 添加
alu_op[ 0]
信号的ALU调用逻辑 - 添加
src2_is_8
信号,使得PC加8 - 添加
dst_is_r31
信号,使得目的寄存器为31号通用寄存器 - 在跳转指示信号
br_taken
中增加inst_bltzal
- 在
br_taken
中增加inst_bltzal
的转移地址,逻辑与inst_bltz
相同
- 在
- 修改所有
blez
为bltz
- 添加了
J
指令- 在
ID stage
中添加inst_j
信号,增加对指令的判断 - 添加
inst_no_dest
信号的无目的地址判断 - 添加
gr_we
信号非写通用寄存器判断 - 在跳转指示信号
br_taken
中增加inst_j
- 在
br_target
中增加inst_j
的转移地址,逻辑与JAL
相同
- 在
- 添加了
BLTZ
指令- 在
ID stage
中添加inst_blez
信号,增加对指令的判断 - 添加
rs_le_zero
信号,添加分支指令跳转的判断逻辑 - 添加
inst_no_dest
信号的无目的地址判断 - 添加
gr_we
信号非写通用寄存器判断 - 在跳转指示信号
br_token
中增加inst_blez
- 在
br_target
中增加inst_blez
的转移地址,逻辑与BEQ
相同
- 在
- 探索了store buffer机制,发现目前的架构不适合将store操作移动到wb stage,代码进行回滚
- 修改
ID stage
中的br_taken
为br_token
- 添加了
BGEZ
指令和BGTZ
指令- 在
ID stage
中添加inst_bgez
和inst_bgtz
信号,增加对指令的判断 - 添加
rs_gr_eq_zero
和rs_gr_zero
信号,添加分支指令跳转的判断逻辑 - 添加
inst_no_dest
信号的无目的地址判断 - 添加
gr_we
信号非写通用寄存器判断 - 在跳转指示信号
br_token
中增加inst_bgez
和inst_bgtz
- 在
br_target
中增加inst_bgez
和inst_bgtz
的转移地址,逻辑与BEQ
相同
- 在
- 添加了SLLV指令
- 添加
inst_sllv
信号线 - 解码
inst_sllv
信号线 - 复用
inst_sll
信号对ALU的控制
- 添加
- 添加了SRLV指令
- 添加了SRAV指令
- 添加了ORI指令
- 添加
inst_ori
信号线 - 解析
inst_ori
信号,其opcode为0x0d - 在立即数指令控制信号
src2_no_rt
、src2_is_imm
、dst_is_rt
上添加信号 - 在
src2_is_zero
信号上添加信号以实现零扩展 - alu控制信号
alu_op[ 6]
添加信号,复用OR指令在exe阶段的数据通路,调用ALU
- 添加
- 添加了XORI指令
- 解析
inst_ori
信号,其opcode为0x0e - alu控制信号
alu_op[ 7]
添加信号,复用XOR指令在exe阶段的数据通路,调用ALU - 其余同上
- 解析
- 添加了SLTIU指令
- 添加
inst_sltiu
信号线 - alu控制信号
alu_op[ 2]
添加inst_sltiu
信号 - 在立即数指令控制信号
src2_no_rt
、src2_is_imm
、dst_is_rt
上添加inst_sltiu
信号
- 添加
- 添加了ANDI指令
- 在ID_stage增加了
src2_is_zero
信号判断零扩展,并在ds_to_es_bus
添加 - 修改
define DS_TO_ES_BUS_WD 136
为define DS_TO_ES_BUS_WD 137
- 添加
inst_andi
信号线 - 读取
inst_andi
信号 - alu控制信号
alu_op[ 4]
添加inst_andi
信号 - 在立即数指令控制信号
src2_no_rt
、src2_is_imm
、dst_is_rt
上添加inst_andi
信号 - 在
src2_is_zero
信号上添加inst_andi
信号 - 在EXE_stage中添加
es_src2_is_zero
信号 - 在EXE_stage中添加零扩展逻辑
es_src2_is_zero? {{16'd0}, es_imm[15:0]}:
- 在ID_stage增加了
添加了SLTI指令:
- 添加
inst_slti
信号线 - alu控制信号
alu_op[ 2]
添加inst_slti
信号 - 在立即数指令控制信号
src2_no_rt
、src2_is_imm
、dst_is_rt
上添加inst_slti
信号
- 添加了SUB指令
- 分析了
decoder_6_64
解码器的原理 - 发现SUB与SUBU指令对
alu_op[ 1]
产生作用,后续需要关注