[dv/top] Regression triage
- fixes part of #14585
- in addition to the aon_timer related assertion failure, there is also
one in usbdev.
- to fix these issues, update prim_reg_cdc_arb to only create a handshake
event when the update actually contains a different value from the
one currently sitting in the transit register. This ensures that
even if the instantiator ties a particular register's de to 1, it will
not generate continuous update requests unless it actually has a
different value.
Signed-off-by: Timothy Chen <timothytim@google.com>
diff --git a/hw/ip/prim/rtl/prim_reg_cdc_arb.sv b/hw/ip/prim/rtl/prim_reg_cdc_arb.sv
index ced71d8..1737453 100644
--- a/hw/ip/prim/rtl/prim_reg_cdc_arb.sv
+++ b/hw/ip/prim/rtl/prim_reg_cdc_arb.sv
@@ -92,6 +92,13 @@
StWait
} state_e;
+
+ // Only honor the incoming destinate update request if the incoming
+ // value is actually different from what is already completed in the
+ // handshake
+ logic dst_update;
+ assign dst_update = dst_update_i & (dst_qs_o != dst_ds_i);
+
if (DstWrReq) begin : gen_wr_req
logic dst_lat_q;
logic dst_lat_d;
@@ -161,7 +168,7 @@
// if a destination update is received when the system is idle and there is no
// software side request, hw update must be selected.
- `ASSERT(DstUpdateReqCheck_A, ##1 dst_update_i & !dst_req & !busy |=> id_q == SelHwReq,
+ `ASSERT(DstUpdateReqCheck_A, ##1 dst_update & !dst_req & !busy |=> id_q == SelHwReq,
clk_dst_i, !rst_dst_ni)
// if hw select was chosen, then it must be the case there was a destination update
@@ -195,7 +202,7 @@
// there's a software issued request for change
state_d = StWait;
dst_lat_d = 1'b1;
- end else if (dst_update_i) begin
+ end else if (dst_update) begin
state_d = StWait;
dst_lat_d = 1'b1;
end else if (dst_qs_o != dst_qs_i) begin
@@ -248,7 +255,7 @@
async_flag <= '0;
end else if (src_update_o) begin
async_flag <= '0;
- end else if (dst_update_i && !dst_req_o && !busy) begin
+ end else if (dst_update && !dst_req_o && !busy) begin
async_flag <= 1'b1;
end
end
@@ -280,7 +287,7 @@
);
logic unused_sigs;
- assign unused_sigs = |{dst_ds_i, dst_update_i};
+ assign unused_sigs = |{dst_ds_i, dst_update};
end