Fix bad timing of predecoded regnum register update (thanks BMC)
This commit is contained in:
parent
b80b09afe5
commit
7b8fe43c1c
|
@ -355,12 +355,23 @@ always @ (posedge clk or negedge rst_n) begin
|
||||||
if (!rst_n) begin
|
if (!rst_n) begin
|
||||||
d_rs1_predecoded <= {W_REGADDR{1'b0}};
|
d_rs1_predecoded <= {W_REGADDR{1'b0}};
|
||||||
d_rs2_predecoded <= {W_REGADDR{1'b0}};
|
d_rs2_predecoded <= {W_REGADDR{1'b0}};
|
||||||
end else if (!x_stall) begin
|
end else if (d_starved || !x_stall) begin
|
||||||
d_rs1_predecoded <= f_rs1;
|
d_rs1_predecoded <= f_rs1;
|
||||||
d_rs2_predecoded <= f_rs2;
|
d_rs2_predecoded <= f_rs2;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
`ifdef FORMAL
|
||||||
|
always @ (posedge clk) begin
|
||||||
|
if (rst_n && !x_stall) begin
|
||||||
|
if (~|d_rs1_predecoded)
|
||||||
|
assert(~|d_rs1);
|
||||||
|
if (~|d_rs2_predecoded)
|
||||||
|
assert(~|d_rs2);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
`endif
|
||||||
|
|
||||||
always @ (*) begin
|
always @ (*) begin
|
||||||
if (~|d_rs1) begin
|
if (~|d_rs1) begin
|
||||||
// Note the predecoded version is not sufficiently precise for zeroing
|
// Note the predecoded version is not sufficiently precise for zeroing
|
||||||
|
@ -508,6 +519,10 @@ always @ (posedge clk) if (rst_n) begin
|
||||||
// be an unaligned AMO address, which goes straight to error phase.
|
// be an unaligned AMO address, which goes straight to error phase.
|
||||||
if (x_amo_phase == 3'h4 && m_stall)
|
if (x_amo_phase == 3'h4 && m_stall)
|
||||||
assert(x_unaligned_addr);
|
assert(x_unaligned_addr);
|
||||||
|
// Should be impossible to get an unaligned address in the write address
|
||||||
|
// phase, since it would be picked up in the read address phase
|
||||||
|
if (x_amo_phase == 3'h2)
|
||||||
|
assert(!x_unaligned_addr);
|
||||||
// Error phase is either due to a bus response, or a misaligned address.
|
// Error phase is either due to a bus response, or a misaligned address.
|
||||||
// Neither of these are write-address-phase.
|
// Neither of these are write-address-phase.
|
||||||
if (x_amo_phase == 3'h4)
|
if (x_amo_phase == 3'h4)
|
||||||
|
|
Loading…
Reference in New Issue