Fix wen delays in rf

This commit is contained in:
Olof Kindgren 2019-10-30 12:38:20 +01:00
parent a7d7d6475b
commit fc348f3a22
2 changed files with 11 additions and 6 deletions

View file

@ -62,18 +62,23 @@ module serv_mpram
wire [5:0] wreg = wport ? wreg1 : wreg0;
wire [9:0] waddr = {wreg, wslot};
wire wen = wgo & (i_trap | (wport ? i_csr_en : i_rd_wen & run_r));
wire wen0 = i_trap | (i_rd_wen & i_run);
wire wen1 = i_trap | i_csr_en;
wire wen = wgo & (wport ? wen1_r : wen0_r);
reg wreq_r;
reg run_r;
reg wen0_r;
reg wen1_r;
always @(posedge i_clk) begin
wreq_r <= i_wreq | o_rgnt;
wen0_r <= wen0;
wen1_r <= wen1;
wreq_r <= i_wreq;
wdata0_r <= wdata0;
wdata1_r <= wdata1;
wdata1_2r <= wdata1_r;
run_r <= i_run;
if (wgo)
wcnt <= wcnt+5'd1;

View file

@ -83,7 +83,7 @@ module serv_state
assign o_rf_rreq = i_ibus_ack | (stage_two_req & trap_pending);
//Prepare RF for writes when everything is ready to enter stage two
assign o_rf_wreq = ((i_shift_op & i_alu_sh_done & stage_two_pending) | (i_mem_op & i_dbus_ack) | (stage_two_req & (i_slt_op | i_branch_op))) & !trap_pending;
assign o_rf_wreq = ((i_shift_op & i_alu_sh_done & stage_two_pending) | (i_mem_op & i_dbus_ack) | (stage_two_req & (i_slt_op | i_branch_op))) & !trap_pending | i_rf_ready;
//Shift operations require bufreg to hold for one cycle between INIT and RUN before shifting
assign o_bufreg_hold = !cnt_en & (stage_two_req | ~i_shift_op);