mirror of
https://github.com/openhwgroup/cve2.git
synced 2025-04-25 06:27:22 -04:00
Rename reg buffer signals
This commit is contained in:
parent
099673de2b
commit
659e234be0
1 changed files with 22 additions and 22 deletions
44
id_stage.sv
44
id_stage.sv
|
@ -117,7 +117,7 @@ module riscv_id_stage
|
||||||
|
|
||||||
// CONFIG_REGION: MERGE_ID_EX
|
// CONFIG_REGION: MERGE_ID_EX
|
||||||
`ifdef MERGE_ID_EX
|
`ifdef MERGE_ID_EX
|
||||||
output logic id_wait_o,
|
output logic id_wait_o, // We did not yet buffer the register ports
|
||||||
`endif
|
`endif
|
||||||
|
|
||||||
// Pipeline ID/EX
|
// Pipeline ID/EX
|
||||||
|
@ -531,8 +531,9 @@ module riscv_id_stage
|
||||||
|
|
||||||
// CONFIG_REGION: MERGE_ID_EX
|
// CONFIG_REGION: MERGE_ID_EX
|
||||||
`ifdef MERGE_ID_EX
|
`ifdef MERGE_ID_EX
|
||||||
logic [31:0] reg_buffer_s1_Q, reg_buffer_s2_Q;
|
// As we have a latched register file, we need to buffer the register ports to prevent a time loop over the ALU
|
||||||
enum logic { WAIT_WRITE_BACK, COMPUTING } buffering_regs_Q, buffering_regs_n;
|
logic [31:0] reg_buffer_a_Q, reg_buffer_b_Q;
|
||||||
|
enum logic { WAIT_WRITE_BACK, COMPUTING } buffer_fsm_Q, buffer_fsm_n;
|
||||||
`endif // MERGE_ID_EX
|
`endif // MERGE_ID_EX
|
||||||
|
|
||||||
|
|
||||||
|
@ -722,8 +723,8 @@ module riscv_id_stage
|
||||||
// CONFIG_REGION: MERGE_ID_EX
|
// CONFIG_REGION: MERGE_ID_EX
|
||||||
`ifdef MERGE_ID_EX
|
`ifdef MERGE_ID_EX
|
||||||
// JALR: Cannot forward RS1, since the path is too long
|
// JALR: Cannot forward RS1, since the path is too long
|
||||||
JT_JALR: jump_target = reg_buffer_s1_Q + imm_i_type;
|
JT_JALR: jump_target = reg_buffer_a_Q + imm_i_type;
|
||||||
default: jump_target = reg_buffer_s1_Q + imm_i_type;
|
default: jump_target = reg_buffer_a_Q + imm_i_type;
|
||||||
`else
|
`else
|
||||||
// JALR: Cannot forward RS1, since the path is too long
|
// JALR: Cannot forward RS1, since the path is too long
|
||||||
JT_JALR: jump_target = regfile_data_ra_id + imm_i_type;
|
JT_JALR: jump_target = regfile_data_ra_id + imm_i_type;
|
||||||
|
@ -787,8 +788,8 @@ module riscv_id_stage
|
||||||
`endif
|
`endif
|
||||||
// CONFIG_REGION: MERGE_ID_EX
|
// CONFIG_REGION: MERGE_ID_EX
|
||||||
`ifdef MERGE_ID_EX
|
`ifdef MERGE_ID_EX
|
||||||
SEL_REGFILE: operand_a_fw_id = reg_buffer_s1_Q;
|
SEL_REGFILE: operand_a_fw_id = reg_buffer_a_Q;
|
||||||
default: operand_a_fw_id = reg_buffer_s1_Q;
|
default: operand_a_fw_id = reg_buffer_a_Q;
|
||||||
`else
|
`else
|
||||||
SEL_FW_WB: operand_a_fw_id = regfile_wdata_wb_i;
|
SEL_FW_WB: operand_a_fw_id = regfile_wdata_wb_i;
|
||||||
SEL_REGFILE: operand_a_fw_id = regfile_data_ra_id;
|
SEL_REGFILE: operand_a_fw_id = regfile_data_ra_id;
|
||||||
|
@ -907,8 +908,8 @@ module riscv_id_stage
|
||||||
`endif // MERGE_ID_EX
|
`endif // MERGE_ID_EX
|
||||||
// CONFIG_REGION: MERGE_ID_EX
|
// CONFIG_REGION: MERGE_ID_EX
|
||||||
`ifdef MERGE_ID_EX
|
`ifdef MERGE_ID_EX
|
||||||
SEL_REGFILE: operand_b_fw_id = reg_buffer_s2_Q;
|
SEL_REGFILE: operand_b_fw_id = reg_buffer_b_Q;
|
||||||
default: operand_b_fw_id = reg_buffer_s2_Q;
|
default: operand_b_fw_id = reg_buffer_b_Q;
|
||||||
`else
|
`else
|
||||||
SEL_FW_WB: operand_b_fw_id = regfile_wdata_wb_i;
|
SEL_FW_WB: operand_b_fw_id = regfile_wdata_wb_i;
|
||||||
SEL_REGFILE: operand_b_fw_id = regfile_data_rb_id;
|
SEL_REGFILE: operand_b_fw_id = regfile_data_rb_id;
|
||||||
|
@ -1778,41 +1779,40 @@ module riscv_id_stage
|
||||||
|
|
||||||
always_ff @(posedge clk or negedge rst_n) begin
|
always_ff @(posedge clk or negedge rst_n) begin
|
||||||
if(~rst_n) begin
|
if(~rst_n) begin
|
||||||
reg_buffer_s1_Q <= 32'b0;
|
reg_buffer_a_Q <= 32'b0;
|
||||||
reg_buffer_s2_Q <= 32'b0;
|
reg_buffer_b_Q <= 32'b0;
|
||||||
buffering_regs_Q <= WAIT_WRITE_BACK;
|
buffer_fsm_Q <= WAIT_WRITE_BACK;
|
||||||
end else begin
|
end else begin
|
||||||
if ((buffering_regs_Q == WAIT_WRITE_BACK && (buffering_regs_n == COMPUTING))) // TODO: Move to combinational process
|
if ((buffer_fsm_Q == WAIT_WRITE_BACK && (buffer_fsm_n == COMPUTING))) // TODO: Move to combinational process
|
||||||
begin
|
begin
|
||||||
reg_buffer_s1_Q <= regfile_data_ra_id;
|
reg_buffer_a_Q <= regfile_data_ra_id;
|
||||||
reg_buffer_s2_Q <= regfile_data_rb_id;
|
reg_buffer_b_Q <= regfile_data_rb_id;
|
||||||
end
|
end
|
||||||
|
|
||||||
buffering_regs_Q <= buffering_regs_n;
|
buffer_fsm_Q <= buffer_fsm_n;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
always_comb
|
always_comb
|
||||||
begin
|
begin
|
||||||
buffering_regs_n = buffering_regs_Q;
|
buffer_fsm_n = buffer_fsm_Q;
|
||||||
|
|
||||||
case (buffering_regs_Q)
|
case (buffer_fsm_Q)
|
||||||
WAIT_WRITE_BACK: begin
|
WAIT_WRITE_BACK: begin
|
||||||
if (~regfile_we_wb_i & instr_valid_i)
|
if (~regfile_we_wb_i & instr_valid_i)
|
||||||
buffering_regs_n = COMPUTING;
|
buffer_fsm_n = COMPUTING;
|
||||||
end
|
end
|
||||||
|
|
||||||
COMPUTING: begin
|
COMPUTING: begin
|
||||||
if (id_ready_o)
|
if (id_ready_o)
|
||||||
buffering_regs_n = WAIT_WRITE_BACK;
|
buffer_fsm_n = WAIT_WRITE_BACK;
|
||||||
// TODO: Introduce shortcut sinc we know that no write back is pending and that there won't be a next writeback
|
|
||||||
end
|
end
|
||||||
default : /* default */;
|
default : /* default */;
|
||||||
endcase
|
endcase
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
assign id_wait_o = (buffering_regs_Q == WAIT_WRITE_BACK);
|
assign id_wait_o = (buffer_fsm_Q == WAIT_WRITE_BACK);
|
||||||
|
|
||||||
`endif // MERGE_ID_EX
|
`endif // MERGE_ID_EX
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue