Menu Close

RISC-V32个寄存器和译码模块(4)指令译码器

RISC-V FPGA 设计中, RISC-V 的核心核心模块中包括指令译码模块。 这个模块的主要功能是:根据当前的PC,对ITCM 输入的汇编机器码进行解析。包括得到相应的汇编语言命令,需要的rs1,rs2寄存器,需要存储的rd 寄存器等

相关参考文章:

RISC-V 教学教案

 

RISC-V  中cpu 核心设计框架组成结构:  

fii_riscv_decorder

在vivado 工程文件中:

instr_dec 模块 输入为汇编语言的机器码, 输出为:

RS1_IDX:  通用寄存器rs1 ID

RS2_IDX:  通用寄存器rs2 ID

RD_IDX:   通用寄存器RD ID

instr_group:  包括:OP_IMM, OP, LUI, AUIPC, JAL, JALR, BRANCH, LOAD, STORE, CSR, 等等

opimm_instr:  包括:SRAI, SRLI, SLLI, ANDI, ORI, XORI, SLTIU, SLTI, ADDI

op_instr: 包括:SRA, SUB, SRL, SLL, XOR, OR, AND, SLTU, SLT, ADD

branch_instr: 包括:BGTU, BGT, BLTU, BLT, BNE, BEQ

shamt: 数据位移宽度 I_imm: I-type 立即数

S_imm: S-type 立即数

J_imm: J-type 立即数

U_imm: U-type 立即数

B_imm: B-type 立即数

load_instr: 包括:LBU, LB, LHU, LH, LW

store_instr: 包括:SB, SH, SW

csr_instr: 包括:SCRRCI, CSRRSI, CSRRWI, SCRRC, CSRRS, CSRRW

csr_addr: 选择4095 个csr 寄存器中的一个 CSR_imm: csr 立即数  

 

decoder 模块代码:

wire LUI           = ( opcode[ 6: 0 ] == 7’b011_0111 ); // TYPE U lui
wire AUIPC      = ( opcode[ 6: 0 ] == 7’b001_0111 ); // TYPE U auipc

wire JAL           = ( opcode[ 6: 0 ] == 7’b110_1111 ); // TYPE J jal
wire JALR        = ( opcode[ 6: 0 ] == 7’b110_0111 ); // TYPE I jalr

wire BRANCH = ( opcode[ 6: 0 ] == 7’b110_0011 ); // TYPE B

wire LOAD       = ( opcode[ 6: 0 ] == 7’b000_0011 ); // TYPE I load
wire STORE     = ( opcode[ 6: 0 ] == 7’b010_0011 ); // YTPE S store

wire OP_IMM = ( opcode[ 6: 0 ] == 7’b001_0011 ); // TYPE I operator
wire OP             = ( opcode[ 6: 0 ] == 7’b011_0011 ); // TYPE R operator

wire FENCE     = ( opcode[ 6: 0 ] == 7’b000_1111 ); // TYPE I fence
wire CSR           = ( opcode[ 6: 0 ] == 7’b111_0011 ); // TYPE I csr

如果是RV32I 指令, 先译码出是哪一个类指令。

assign o_I_imm = { { 20{ i_instr[ 31 ] } } , i_instr[ 31: 20 ] }; //addi/slti/sltiu/andi/ori/xori, lw/lh/lhu/lb/lbu, JALR, SLLI/SRLi/SRAI

assign o_S_imm = { { 20{ i_instr[ 31 ] } }, i_instr[ 31: 25 ], i_instr[ 11: 7 ] }; //s-type instruction, provide imm or store instruction

assign o_B_imm = { { 19{ i_instr[ 31 ] } }, i_instr[ 31 ], i_instr[ 7 ], i_instr[ 30: 25 ], i_instr[ 11: 8 ], 1’b0 };

assign o_U_imm = { i_instr[ 31: 12 ], 12’b0 };

assign o_J_imm = { { 11{ i_instr[ 31 ] } }, i_instr[ 31 ], i_instr[ 19: 12 ], i_instr[ 20 ], i_instr[ 30: 21 ], 1’b0 }; //for JAL,

assign o_shamt = i_instr[ 24: 20 ];

assign o_csr_imm = {27’b0,i_instr[19:15]};

 

4)确定最终指令: 根据opcode 译码出来的大类, funct3,funct7 译码出来的具体指令, 最终确定当前的机器码是指令集当中的那一条指令。

Posted in FPGA, FPGA 教材教案, RISC-V IPcore设计, RISC-V 教材教案, RISC-V架构, 教材与教案, 文章, 集成电路