[prim_sync_reqack_data] Fix SVA checking DST-to-SRC data stability This commit reduces the window during which data must be stable. Since the next REQ only takes 1 SRC clock cycle (and 2 DST clock cycles) to cross over from SRC to DST, it doesn't make sense to check that the data remains stable for 2 SRC clock cycles after the SRC handshake. This resolves lowRISC/OpenTitan#4797. Signed-off-by: Pirmin Vogel <vogelpi@lowrisc.org>
diff --git a/hw/ip/prim/rtl/prim_sync_reqack_data.sv b/hw/ip/prim/rtl/prim_sync_reqack_data.sv index d73e45d..542fb43 100644 --- a/hw/ip/prim/rtl/prim_sync_reqack_data.sv +++ b/hw/ip/prim/rtl/prim_sync_reqack_data.sv
@@ -95,9 +95,11 @@ end else if (DataSrc2Dst == 1'b0 && DataReg == 1'b0) begin : gen_assert_data_dst2src // DST domain shall not change data while waiting for SRC domain to latch it (together with - // receiving ACK). Assert that the data is stable +/- 2 SRC cycles around the SRC handshake. + // receiving ACK). It takes 2 SRC cycles for ACK to cross over from DST to SRC, and 1 SRC cycle + // for the next REQ to cross over from SRC to DST. Assert that the data is stable during that + // window, i.e. [-2,+1] SRC cycles around the SRC handshake. `ASSERT(SyncReqAckDataHoldDst2Src, - src_req_i && src_ack_o |-> $past(data_o,2) == data_o && $stable(data_o) [*3], + src_req_i && src_ack_o |-> $past(data_o,2) == data_o && $stable(data_o) [*2], clk_src_i, !rst_src_ni) end