SinnLiu / CPU_Design_MIPS

《CPU设计实战》学习记录及代码

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

CPU设计实战

支持的指令

指令类别 指令
运算指令 ADDU, ADDIU, SUBU, ADD, ADDI, SUB, SLTI, SLTIU, ANDI, ORI, XORI, SLLV, SRLV, SRAV
转移指令 BGEZ, BGTZ, BLTZ, J, BLTZAL, BGEZAL, JALR
访存指令

带有Inst RAM和Data RAM的仿真流程

片外DDR流程

TODO List

  • 流水线前递解决相关冲突
    • 加入各级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

更新日志

2023.09.16

  1. 添加了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相同

2023.09.12

  1. 添加了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相同

2023.09.10

  1. 添加了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相同
  2. 修改所有blezbltz

2023.08.25

  1. 添加了J指令
    • ID stage中添加inst_j信号,增加对指令的判断
    • 添加inst_no_dest信号的无目的地址判断
    • 添加gr_we信号非写通用寄存器判断
    • 在跳转指示信号br_taken中增加inst_j
    • br_target中增加inst_j的转移地址,逻辑与JAL相同

2023.08.24

  1. 添加了BLTZ指令
    • ID stage中添加inst_blez信号,增加对指令的判断
    • 添加rs_le_zero信号,添加分支指令跳转的判断逻辑
    • 添加inst_no_dest信号的无目的地址判断
    • 添加gr_we信号非写通用寄存器判断
    • 在跳转指示信号br_token中增加inst_blez
    • br_target中增加inst_blez的转移地址,逻辑与BEQ相同

2023.08.23

  1. 探索了store buffer机制,发现目前的架构不适合将store操作移动到wb stage,代码进行回滚
  2. 修改ID stage中的br_takenbr_token
  3. 添加了BGEZ指令和BGTZ指令
    • ID stage中添加inst_bgezinst_bgtz信号,增加对指令的判断
    • 添加rs_gr_eq_zerors_gr_zero信号,添加分支指令跳转的判断逻辑
    • 添加inst_no_dest信号的无目的地址判断
    • 添加gr_we信号非写通用寄存器判断
    • 在跳转指示信号br_token中增加inst_bgezinst_bgtz
    • br_target中增加inst_bgezinst_bgtz的转移地址,逻辑与BEQ相同

2023.06.15

  1. 添加了SLLV指令
    • 添加inst_sllv信号线
    • 解码inst_sllv信号线
    • 复用inst_sll信号对ALU的控制
  2. 添加了SRLV指令
  3. 添加了SRAV指令

2023.05.28

  1. 添加了ORI指令
    • 添加inst_ori信号线
    • 解析inst_ori信号,其opcode为0x0d
    • 在立即数指令控制信号src2_no_rtsrc2_is_immdst_is_rt上添加信号
    • src2_is_zero信号上添加信号以实现零扩展
    • alu控制信号alu_op[ 6]添加信号,复用OR指令在exe阶段的数据通路,调用ALU
  2. 添加了XORI指令
    • 解析inst_ori信号,其opcode为0x0e
    • alu控制信号alu_op[ 7]添加信号,复用XOR指令在exe阶段的数据通路,调用ALU
    • 其余同上

2023.04.07

  1. 添加了SLTIU指令
    • 添加inst_sltiu信号线
    • alu控制信号alu_op[ 2]添加inst_sltiu信号
    • 在立即数指令控制信号src2_no_rtsrc2_is_immdst_is_rt上添加inst_sltiu信号
  2. 添加了ANDI指令
    • ID_stage增加了src2_is_zero信号判断零扩展,并在ds_to_es_bus添加
    • 修改define DS_TO_ES_BUS_WD 136define DS_TO_ES_BUS_WD 137
    • 添加inst_andi信号线
    • 读取inst_andi信号
    • alu控制信号alu_op[ 4]添加inst_andi信号
    • 在立即数指令控制信号src2_no_rtsrc2_is_immdst_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]}:

2023.04.06

添加了SLTI指令:

  • 添加inst_slti信号线
  • alu控制信号alu_op[ 2]添加inst_slti信号
  • 在立即数指令控制信号src2_no_rtsrc2_is_immdst_is_rt上添加inst_slti信号

2023.04.05

  1. 添加了SUB指令
  2. 分析了decoder_6_64解码器的原理
  3. 发现SUB与SUBU指令对alu_op[ 1]产生作用,后续需要关注

About

《CPU设计实战》学习记录及代码


Languages

Language:Verilog 99.6%Language:C 0.4%