Fix commented out frontend properties which relied on non-constant past reset values
This commit is contained in:
parent
449348f459
commit
116e34df49
|
@ -534,7 +534,6 @@ if (EXTENSION_M) begin: has_muldiv
|
||||||
.result_vld (x_muldiv_result_vld)
|
.result_vld (x_muldiv_result_vld)
|
||||||
);
|
);
|
||||||
|
|
||||||
// TODO fusion of MULHx->MUL and DIVy->REMy sequences
|
|
||||||
wire x_muldiv_result_is_high =
|
wire x_muldiv_result_is_high =
|
||||||
d_mulop == M_OP_MULH ||
|
d_mulop == M_OP_MULH ||
|
||||||
d_mulop == M_OP_MULHSU ||
|
d_mulop == M_OP_MULHSU ||
|
||||||
|
@ -891,7 +890,7 @@ always @ (posedge clk or negedge rst_n) begin
|
||||||
// AMOs should handle the entire bus transfer in stage X.
|
// AMOs should handle the entire bus transfer in stage X.
|
||||||
assert(xm_memop != MEMOP_AMOADD_W);
|
assert(xm_memop != MEMOP_AMOADD_W);
|
||||||
`endif
|
`endif
|
||||||
if (d_memop_is_amo && |x_amo_phase) begin // TODO do AMOs clear reservation?
|
if (d_memop_is_amo) begin
|
||||||
mw_local_exclusive_reserved <= 1'b0;
|
mw_local_exclusive_reserved <= 1'b0;
|
||||||
end else if (xm_memop == MEMOP_SC_W) begin
|
end else if (xm_memop == MEMOP_SC_W) begin
|
||||||
mw_local_exclusive_reserved <= 1'b0;
|
mw_local_exclusive_reserved <= 1'b0;
|
||||||
|
|
|
@ -171,7 +171,6 @@ always @ (posedge clk or negedge rst_n) begin
|
||||||
assert(ctr_flush_pending <= pending_fetches);
|
assert(ctr_flush_pending <= pending_fetches);
|
||||||
assert(pending_fetches < 2'd3);
|
assert(pending_fetches < 2'd3);
|
||||||
assert(!(mem_data_vld && !pending_fetches));
|
assert(!(mem_data_vld && !pending_fetches));
|
||||||
// assert(!($past(mem_addr_hold) && $past(mem_addr_vld) && !$stable(mem_addr)));
|
|
||||||
`endif
|
`endif
|
||||||
mem_addr_hold <= mem_addr_vld && !mem_addr_rdy;
|
mem_addr_hold <= mem_addr_vld && !mem_addr_rdy;
|
||||||
pending_fetches <= pending_fetches_next;
|
pending_fetches <= pending_fetches_next;
|
||||||
|
@ -220,11 +219,6 @@ always @ (posedge clk or negedge rst_n) begin
|
||||||
unaligned_jump_aph <= 1'b0;
|
unaligned_jump_aph <= 1'b0;
|
||||||
unaligned_jump_dph <= 1'b0;
|
unaligned_jump_dph <= 1'b0;
|
||||||
end else if (EXTENSION_C) begin
|
end else if (EXTENSION_C) begin
|
||||||
`ifdef FORMAL_FIXMEEEE
|
|
||||||
assert(!(unaligned_jump_aph && !unaligned_jump_dph));
|
|
||||||
assert(!($past(jump_now && !jump_target[1]) && unaligned_jump_aph));
|
|
||||||
assert(!($past(jump_now && !jump_target[1]) && unaligned_jump_dph));
|
|
||||||
`endif
|
|
||||||
if (mem_addr_rdy || (jump_now && !unaligned_jump_now)) begin
|
if (mem_addr_rdy || (jump_now && !unaligned_jump_now)) begin
|
||||||
unaligned_jump_aph <= 1'b0;
|
unaligned_jump_aph <= 1'b0;
|
||||||
end
|
end
|
||||||
|
@ -244,6 +238,26 @@ always @ (posedge clk or negedge rst_n) begin
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
`ifdef FORMAL
|
||||||
|
reg property_after_aligned_jump;
|
||||||
|
always @ (posedge clk or negedge rst_n) begin
|
||||||
|
if (!rst_n) begin
|
||||||
|
property_after_aligned_jump <= 1'b0;
|
||||||
|
end else begin
|
||||||
|
// Every unaligned jump that requires care in aphase also requires care in dphase.
|
||||||
|
assert(!(unaligned_jump_aph && !unaligned_jump_dph));
|
||||||
|
|
||||||
|
property_after_aligned_jump <= jump_now && !jump_target[1];
|
||||||
|
if (property_after_aligned_jump) begin
|
||||||
|
// Make sure these clear properly (have been subtle historic bugs here)
|
||||||
|
assert(!unaligned_jump_aph);
|
||||||
|
assert(!unaligned_jump_dph);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
`endif
|
||||||
|
|
||||||
|
|
||||||
// Combinatorially generate the address-phase request
|
// Combinatorially generate the address-phase request
|
||||||
|
|
||||||
reg reset_holdoff;
|
reg reset_holdoff;
|
||||||
|
@ -326,8 +340,7 @@ always @ (posedge clk or negedge rst_n) begin
|
||||||
end else begin
|
end else begin
|
||||||
`ifdef FORMAL
|
`ifdef FORMAL
|
||||||
assert(cir_vld <= 2);
|
assert(cir_vld <= 2);
|
||||||
assert(cir_use <= cir_vld);
|
assert(cir_use <= cir_vld);
|
||||||
// assert(cir_vld <= buf_level || $past(cir_lock));
|
|
||||||
`endif
|
`endif
|
||||||
// Update CIR flags
|
// Update CIR flags
|
||||||
buf_level <= buf_level_next;
|
buf_level <= buf_level_next;
|
||||||
|
@ -341,6 +354,20 @@ end
|
||||||
always @ (posedge clk)
|
always @ (posedge clk)
|
||||||
{hwbuf, cir} <= instr_data_plus_fetch;
|
{hwbuf, cir} <= instr_data_plus_fetch;
|
||||||
|
|
||||||
|
`ifdef FORMAL
|
||||||
|
reg [1:0] property_past_buf_level; // Workaround for weird non-constant $past reset issue
|
||||||
|
always @ (posedge clk or negedge rst_n) begin
|
||||||
|
if (!rst_n) begin
|
||||||
|
property_past_buf_level <= 2'h0;
|
||||||
|
end else begin
|
||||||
|
property_past_buf_level <= buf_level;
|
||||||
|
// We fetch 32 bits per cycle, max. If this happens it's due to negative overflow.
|
||||||
|
if (property_past_buf_level == 2'h0)
|
||||||
|
assert(buf_level != 2'h3);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
`endif
|
||||||
|
|
||||||
// Also keep track of bus errors associated with CIR contents, shifted in the
|
// Also keep track of bus errors associated with CIR contents, shifted in the
|
||||||
// same way as instruction data. Errors may come straight from the bus, or
|
// same way as instruction data. Errors may come straight from the bus, or
|
||||||
// may be buffered in the prefetch queue.
|
// may be buffered in the prefetch queue.
|
||||||
|
|
Loading…
Reference in New Issue