Fix wrong reg readaddr when D starvation ends during a downstream load/store dphase stall (was using garbage from D instead of new fetch data predecoded in F)
This commit is contained in:
parent
f23ec3f941
commit
4b9a3c2c78
|
@ -140,6 +140,7 @@ end
|
||||||
//synthesis translate_on
|
//synthesis translate_on
|
||||||
|
|
||||||
// To X
|
// To X
|
||||||
|
wire d_starved;
|
||||||
wire [W_DATA-1:0] d_imm;
|
wire [W_DATA-1:0] d_imm;
|
||||||
wire [W_REGADDR-1:0] d_rs1;
|
wire [W_REGADDR-1:0] d_rs1;
|
||||||
wire [W_REGADDR-1:0] d_rs2;
|
wire [W_REGADDR-1:0] d_rs2;
|
||||||
|
@ -174,6 +175,7 @@ hazard3_decode #(
|
||||||
.d_pc (d_pc),
|
.d_pc (d_pc),
|
||||||
.x_jump_not_except (x_jump_not_except),
|
.x_jump_not_except (x_jump_not_except),
|
||||||
|
|
||||||
|
.d_starved (d_starved),
|
||||||
.d_stall (d_stall),
|
.d_stall (d_stall),
|
||||||
.x_stall (x_stall),
|
.x_stall (x_stall),
|
||||||
.f_jump_rdy (f_jump_rdy),
|
.f_jump_rdy (f_jump_rdy),
|
||||||
|
@ -674,9 +676,9 @@ hazard3_regfile_1w2r #(
|
||||||
.rst_n (rst_n),
|
.rst_n (rst_n),
|
||||||
// On downstream stall, we feed D's addresses back into regfile
|
// On downstream stall, we feed D's addresses back into regfile
|
||||||
// so that output does not change.
|
// so that output does not change.
|
||||||
.raddr1 (x_stall ? d_rs1 : f_rs1),
|
.raddr1 (x_stall && !d_starved ? d_rs1 : f_rs1),
|
||||||
.rdata1 (x_rdata1),
|
.rdata1 (x_rdata1),
|
||||||
.raddr2 (x_stall ? d_rs2 : f_rs2),
|
.raddr2 (x_stall && !d_starved ? d_rs2 : f_rs2),
|
||||||
.rdata2 (x_rdata2),
|
.rdata2 (x_rdata2),
|
||||||
|
|
||||||
.waddr (xm_rd),
|
.waddr (xm_rd),
|
||||||
|
|
|
@ -31,6 +31,7 @@ module hazard3_decode #(
|
||||||
output wire df_cir_lock,
|
output wire df_cir_lock,
|
||||||
output wire [W_ADDR-1:0] d_pc,
|
output wire [W_ADDR-1:0] d_pc,
|
||||||
|
|
||||||
|
output wire d_starved,
|
||||||
output wire d_stall,
|
output wire d_stall,
|
||||||
input wire x_stall,
|
input wire x_stall,
|
||||||
input wire f_jump_rdy,
|
input wire f_jump_rdy,
|
||||||
|
@ -91,7 +92,7 @@ wire [31:0] d_imm_j = {{12{d_instr[31]}}, d_instr[19:12], d_instr[20], d_instr[3
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// PC/CIR control
|
// PC/CIR control
|
||||||
|
|
||||||
wire d_starved = ~|fd_cir_vld || fd_cir_vld[0] && d_instr_is_32bit;
|
assign d_starved = ~|fd_cir_vld || fd_cir_vld[0] && d_instr_is_32bit;
|
||||||
assign d_stall = x_stall || d_starved;
|
assign d_stall = x_stall || d_starved;
|
||||||
|
|
||||||
assign df_cir_use =
|
assign df_cir_use =
|
||||||
|
|
Loading…
Reference in New Issue