mirror of
https://github.com/lowRISC/ibex.git
synced 2025-04-22 21:07:34 -04:00
Rework register file write data mux
This commit is contained in:
parent
9e46bc50d5
commit
7924431144
4 changed files with 38 additions and 36 deletions
|
@ -782,9 +782,9 @@ module ibex_core #(
|
|||
|
||||
.lsu_value_i ( data_wdata_ex ),
|
||||
|
||||
.ex_reg_addr_i ( id_stage_i.regfile_waddr_mux ),
|
||||
.ex_reg_we_i ( id_stage_i.regfile_we_mux ),
|
||||
.ex_reg_wdata_i ( id_stage_i.regfile_wdata_mux ),
|
||||
.ex_reg_addr_i ( id_stage_i.regfile_waddr_id ),
|
||||
.ex_reg_we_i ( id_stage_i.regfile_we ),
|
||||
.ex_reg_wdata_i ( id_stage_i.regfile_wdata_id ),
|
||||
.data_valid_lsu_i ( data_valid_lsu ),
|
||||
.ex_data_addr_i ( data_addr_o ),
|
||||
.ex_data_req_i ( data_req_o ),
|
||||
|
|
|
@ -60,6 +60,7 @@ module ibex_decoder #(
|
|||
output logic [1:0] multdiv_signed_mode_o,
|
||||
|
||||
// register file related signals
|
||||
output ibex_defines::rf_wd_sel_e regfile_wdata_sel_o, // RF write data selection
|
||||
output logic regfile_we_o, // write enable for regfile
|
||||
|
||||
// CSR manipulation
|
||||
|
@ -107,6 +108,7 @@ module ibex_decoder #(
|
|||
multdiv_operator_o = MD_OP_MULL;
|
||||
multdiv_signed_mode_o = 2'b00;
|
||||
|
||||
regfile_wdata_sel_o = RF_WD_EX;
|
||||
regfile_we_o = 1'b0;
|
||||
|
||||
csr_access_o = 1'b0;
|
||||
|
@ -229,9 +231,10 @@ module ibex_decoder #(
|
|||
end
|
||||
|
||||
OPCODE_LOAD: begin
|
||||
data_req_o = 1'b1;
|
||||
regfile_we_o = 1'b1;
|
||||
data_type_o = 2'b00;
|
||||
data_req_o = 1'b1;
|
||||
regfile_wdata_sel_o = RF_WD_LSU;
|
||||
regfile_we_o = 1'b1;
|
||||
data_type_o = 2'b00;
|
||||
|
||||
// offset from immediate
|
||||
alu_operator_o = ALU_ADD;
|
||||
|
@ -463,6 +466,7 @@ module ibex_decoder #(
|
|||
end else begin
|
||||
// instruction to read/modify CSR
|
||||
csr_access_o = 1'b1;
|
||||
regfile_wdata_sel_o = RF_WD_CSR;
|
||||
regfile_we_o = 1'b1;
|
||||
alu_op_b_mux_sel_o = OP_B_IMM;
|
||||
imm_a_mux_sel_o = IMM_A_Z;
|
||||
|
|
|
@ -153,6 +153,12 @@ typedef enum logic [2:0] {
|
|||
IMM_B_INCR_ADDR
|
||||
} imm_b_sel_e;
|
||||
|
||||
// Regfile write data selection
|
||||
typedef enum logic [1:0] {
|
||||
RF_WD_LSU,
|
||||
RF_WD_EX,
|
||||
RF_WD_CSR
|
||||
} rf_wd_sel_e;
|
||||
|
||||
//////////////
|
||||
// IF stage //
|
||||
|
|
|
@ -77,7 +77,7 @@ module ibex_id_stage #(
|
|||
// Stalls
|
||||
input logic ex_valid_i, // EX stage has valid output
|
||||
input logic lsu_valid_i, // LSU has valid output, or is done
|
||||
output logic id_valid_o, // ID stage is done
|
||||
output logic id_valid_o, // ID stage is done
|
||||
|
||||
// ALU
|
||||
output ibex_defines::alu_op_e alu_operator_ex_o,
|
||||
|
@ -179,11 +179,6 @@ module ibex_id_stage #(
|
|||
logic stall_branch;
|
||||
logic stall_jump;
|
||||
|
||||
logic regfile_we;
|
||||
|
||||
typedef enum logic {RF_LSU, RF_EX} select_e;
|
||||
select_e select_data_rf;
|
||||
|
||||
// Immediate decoding and sign extension
|
||||
logic [31:0] imm_i_type;
|
||||
logic [31:0] imm_s_type;
|
||||
|
@ -204,11 +199,15 @@ module ibex_id_stage #(
|
|||
logic [4:0] regfile_addr_ra_id;
|
||||
logic [4:0] regfile_addr_rb_id;
|
||||
|
||||
logic [4:0] regfile_alu_waddr_id;
|
||||
logic [4:0] regfile_waddr_id;
|
||||
logic regfile_we_id, regfile_we_dec;
|
||||
|
||||
logic [31:0] regfile_data_ra_id;
|
||||
logic [31:0] regfile_data_rb_id;
|
||||
logic [31:0] regfile_wdata_id;
|
||||
|
||||
rf_wd_sel_e regfile_wdata_sel;
|
||||
logic regfile_we;
|
||||
|
||||
// ALU Control
|
||||
alu_op_e alu_operator;
|
||||
|
@ -265,12 +264,12 @@ module ibex_id_stage #(
|
|||
///////////////////////////
|
||||
// Destination registers //
|
||||
///////////////////////////
|
||||
assign regfile_alu_waddr_id = instr[`REG_D];
|
||||
assign regfile_waddr_id = instr[`REG_D];
|
||||
|
||||
//if (RV32E)
|
||||
// assign illegal_reg_rv32e = (regfile_addr_ra_id[4] |
|
||||
// regfile_addr_rb_id[4] |
|
||||
// regfile_alu_waddr_id[4]);
|
||||
// regfile_waddr_id[4]);
|
||||
//else
|
||||
assign illegal_reg_rv32e = 1'b0;
|
||||
|
||||
|
@ -335,22 +334,14 @@ module ibex_id_stage #(
|
|||
// Registers //
|
||||
///////////////
|
||||
|
||||
logic [31:0] regfile_wdata_mux;
|
||||
logic regfile_we_mux;
|
||||
logic [4:0] regfile_waddr_mux;
|
||||
|
||||
//TODO: add assertion
|
||||
// Register File mux
|
||||
always_comb begin
|
||||
regfile_we_mux = regfile_we;
|
||||
regfile_waddr_mux = regfile_alu_waddr_id;
|
||||
if (select_data_rf == RF_LSU) begin
|
||||
regfile_wdata_mux = regfile_wdata_lsu_i;
|
||||
end else if (csr_access) begin
|
||||
regfile_wdata_mux = csr_rdata_i;
|
||||
end else begin
|
||||
regfile_wdata_mux = regfile_wdata_ex_i;
|
||||
end
|
||||
// Register file write data mux
|
||||
always_comb begin : regfile_wdata_mux
|
||||
unique case (regfile_wdata_sel)
|
||||
RF_WD_EX: regfile_wdata_id = regfile_wdata_ex_i;
|
||||
RF_WD_LSU: regfile_wdata_id = regfile_wdata_lsu_i;
|
||||
RF_WD_CSR: regfile_wdata_id = csr_rdata_i;
|
||||
default: regfile_wdata_id = regfile_wdata_ex_i;
|
||||
endcase;
|
||||
end
|
||||
|
||||
ibex_register_file #( .RV32E ( RV32E ) ) registers_i (
|
||||
|
@ -366,9 +357,9 @@ module ibex_id_stage #(
|
|||
.raddr_b_i ( regfile_addr_rb_id ),
|
||||
.rdata_b_o ( regfile_data_rb_id ),
|
||||
// write port
|
||||
.waddr_a_i ( regfile_waddr_mux ),
|
||||
.wdata_a_i ( regfile_wdata_mux ),
|
||||
.we_a_i ( regfile_we_mux )
|
||||
.waddr_a_i ( regfile_waddr_id ),
|
||||
.wdata_a_i ( regfile_wdata_id ),
|
||||
.we_a_i ( regfile_we )
|
||||
);
|
||||
|
||||
`ifdef RVFI
|
||||
|
@ -376,8 +367,8 @@ module ibex_id_stage #(
|
|||
assign rfvi_reg_rdata_ra_o = regfile_data_ra_id;
|
||||
assign rfvi_reg_raddr_rb_o = regfile_addr_rb_id;
|
||||
assign rfvi_reg_rdata_rb_o = regfile_data_rb_id;
|
||||
assign rfvi_reg_waddr_rd_o = regfile_waddr_mux;
|
||||
assign rfvi_reg_wdata_rd_o = regfile_wdata_mux;
|
||||
assign rfvi_reg_waddr_rd_o = regfile_waddr_id;
|
||||
assign rfvi_reg_wdata_rd_o = regfile_wdata_id;
|
||||
assign rfvi_reg_we_o = regfile_we;
|
||||
`endif
|
||||
|
||||
|
@ -414,6 +405,7 @@ module ibex_id_stage #(
|
|||
.multdiv_signed_mode_o ( multdiv_signed_mode ),
|
||||
|
||||
// register file control signals
|
||||
.regfile_wdata_sel_o ( regfile_wdata_sel ),
|
||||
.regfile_we_o ( regfile_we_dec ),
|
||||
|
||||
// CSR control signals
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue