rv32g-core

Pipelined, synthesizable, and fabricable RISC-V core in SystemVerilog+Yosys+OpenROAD
Log | Files | Refs | LICENSE

commit 8211eeff31624249a8a6b65081b8f31f3fe0325e
parent b912995e94db9b6dad3d569897771ac3336e66ea
Author: Vineet Kumar <git@vineetk.net>
Date:   Sun, 31 May 2026 19:04:13 -0400

define control signals

Diffstat:
Mrtl/stage_decode.sv | 82+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 78 insertions(+), 4 deletions(-)

diff --git a/rtl/stage_decode.sv b/rtl/stage_decode.sv @@ -1,7 +1,81 @@ +// TODO move main typedefs to package +typedef enum logic [3:0] {// rv32i + ALU_NONE, + ALU_ADD, + ALU_SUB, + ALU_XOR, + ALU_OR, + ALU_AND, + ALU_SLL, + ALU_SRL, + ALU_SRA, + ALU_SLT, + ALU_SLTU + // TODO rv32m + // ALU_MUL, + // ALU_DIV, + // ALU_REM, + // TODO rv32a + // TODO rv32f + // TODO rv32d +} aluop_t; + +typedef enum logic [1:0] {ALUOP1_NONE, + ALUOP1_REG, // pretty much every intruction except AUIPC + ALUOP1_PC // AUIPC is special :) +} aluop1src_t; + +typedef enum logic [1:0] {ALUOP2_NONE, + ALUOP2_REG, // R-type and S-type instructions + ALUOP2_IMM // sign-extended immediate for I-type and JALR +} aluop2src_t; + +typedef enum logic [3:0] {MEM_NONE, + MEM_LB, + MEM_LH, + MEM_LW, + MEM_LBU, + MEM_LHU, + MEM_SB, + MEM_SH, + MEM_SW +} memop_t; + +typedef enum logic [2:0] {BRANCH_NONE, + BRANCH_BEQ, + BRANCH_BNE, + BRANCH_BLT, + BRANCH_BGE, + BRANCH_BLTU, + BRANCH_BGEU +} branchop_t; + +typedef enum logic [1:0] {PC_SEQ, // PC = PC + 4 (regular) + PC_IMM, // PC = PC + imm (branch and jal) + PC_ALU // PC = rs1 + imm (jalr) +} pcsrc_t; + +typedef enum logic [2:0] {WB_NONE, // no register writeback + WB_PC, // JAL writes using PC adder + WB_ALU, // R-type and I-type instructions + WB_MEM, // All load instructions + WB_IMM // LUI writes back an immediate value +} wbsrc_t; + +typedef struct packed { + aluop_t aluop; + aluop1src_t aluop1src; + aluop2src_t aluop2src; + memop_t memop; + pcsrc_t pcsrc; + branchop_t branchop; + wbsrc_t wbsrc; +} ctrl_t; + module stage_decode (input logic [31:0] inst, input logic [31:0] regfile [0:31], - output logic [31:0] ctrl, + output ctrl_t ctrl, output logic [31:0] imm, output logic [31:0] rs1_val, output logic [31:0] rs2_val, @@ -110,8 +184,8 @@ module stage_decode always_comb begin unique case (opcode) // rv32i - OPCODE_LUI: inst_type = ITYPE; - OPCODE_AUIPC: inst_type = ITYPE; + OPCODE_LUI: inst_type = UTYPE; + OPCODE_AUIPC: inst_type = UTYPE; OPCODE_JAL: inst_type = JTYPE; OPCODE_JALR: inst_type = ITYPE; OPCODE_BRANCH: inst_type = BTYPE; @@ -201,7 +275,7 @@ module stage_decode always_comb begin case (name) // rv32i - default: ctrl = '0; + default: ctrl = {default:0}; endcase end