[prim_sync_reqack] Disable reset checks by default, enable inside OTBN
This commit adds a new SV parameter to the prim_edn_req and
prim_sync_reqack(data) modules to only enable the reset checks if
explicitly enabled. For now, the checks are only enabled within OTBN.
The reason for doing this is that currently we expect quite a few test
failures based on this change. Once the reset domains have been
re-organized (see lowRISC/OpenTitan#15317) this commit can be reverted
and the checks can be enabled system wide without causing a large amount
of test failures.
Signed-off-by: Pirmin Vogel <vogelpi@lowrisc.org>
diff --git a/hw/ip/otbn/rtl/otbn.sv b/hw/ip/otbn/rtl/otbn.sv
index 108df26..3214b56 100644
--- a/hw/ip/otbn/rtl/otbn.sv
+++ b/hw/ip/otbn/rtl/otbn.sv
@@ -1017,6 +1017,7 @@
// internal entropy width of 256 bit.
prim_edn_req #(
+ .EnRstChks(1'b1),
.OutWidth(EdnDataWidth),
// SEC_CM: RND.BUS.CONSISTENCY
.RepCheck(1'b1)
@@ -1036,6 +1037,7 @@
);
prim_edn_req #(
+ .EnRstChks(1'b1),
.OutWidth(EdnDataWidth)
) u_prim_edn_urnd_req (
.clk_i,
diff --git a/hw/ip/otbn/rtl/otbn_scramble_ctrl.sv b/hw/ip/otbn/rtl/otbn_scramble_ctrl.sv
index 0b2e002..5d372b2 100644
--- a/hw/ip/otbn/rtl/otbn_scramble_ctrl.sv
+++ b/hw/ip/otbn/rtl/otbn_scramble_ctrl.sv
@@ -226,6 +226,7 @@
prim_sync_reqack_data #(
.Width($bits(otp_ctrl_pkg::otbn_otp_key_rsp_t)-1),
+ .EnRstChks(1'b1),
.DataSrc2Dst(1'b0)
) u_otp_key_req_sync (
.clk_src_i (clk_i),
diff --git a/hw/ip/prim/rtl/prim_edn_req.sv b/hw/ip/prim/rtl/prim_edn_req.sv
index a3cf988..ff12cd7 100644
--- a/hw/ip/prim/rtl/prim_edn_req.sv
+++ b/hw/ip/prim/rtl/prim_edn_req.sv
@@ -19,6 +19,8 @@
parameter int OutWidth = 32,
// Repetition check for incoming edn data
parameter bit RepCheck = 0,
+ // Disable reset-related assertion checks inside prim_sync_reqack primitives.
+ parameter bit EnRstChks = 0,
// EDN Request latency checker
//
@@ -56,6 +58,7 @@
localparam int SyncWidth = $bits({edn_i.edn_fips, edn_i.edn_bus});
prim_sync_reqack_data #(
.Width(SyncWidth),
+ .EnRstChks(EnRstChks),
.DataSrc2Dst(1'b0),
.DataReg(1'b0)
) u_prim_sync_reqack_data (
diff --git a/hw/ip/prim/rtl/prim_sync_reqack.sv b/hw/ip/prim/rtl/prim_sync_reqack.sv
index d58217f..8f4d9aa 100644
--- a/hw/ip/prim/rtl/prim_sync_reqack.sv
+++ b/hw/ip/prim/rtl/prim_sync_reqack.sv
@@ -25,7 +25,9 @@
`include "prim_assert.sv"
-module prim_sync_reqack (
+module prim_sync_reqack #(
+ parameter bit EnRstChks = 1'b0 // Enable reset-related assertion checks, disabled by default.
+) (
input clk_src_i, // REQ side, SRC domain
input rst_src_ni, // REQ side, SRC domain
input clk_dst_i, // ACK side, DST domain
@@ -194,12 +196,14 @@
`ASSERT(SyncReqAckAckNeedsReq, dst_ack_i |->
dst_req_o, clk_dst_i, !rst_src_ni || !rst_dst_ni)
- // Always reset both domains. Both resets need to be active at the same time.
- `ASSERT(SyncReqAckRstSrc, $fell(rst_src_ni) |->
- (##[0:$] !rst_dst_ni within !rst_src_ni [*1:$]),
- clk_src_i, 0)
- `ASSERT(SyncReqAckRstDst, $fell(rst_dst_ni) |->
- (##[0:$] !rst_src_ni within !rst_dst_ni [*1:$]),
- clk_dst_i, 0)
+ if (EnRstChks) begin : gen_assert_en_rst_chks
+ // Always reset both domains. Both resets need to be active at the same time.
+ `ASSERT(SyncReqAckRstSrc, $fell(rst_src_ni) |->
+ (##[0:$] !rst_dst_ni within !rst_src_ni [*1:$]),
+ clk_src_i, 0)
+ `ASSERT(SyncReqAckRstDst, $fell(rst_dst_ni) |->
+ (##[0:$] !rst_src_ni within !rst_dst_ni [*1:$]),
+ clk_dst_i, 0)
+ end
endmodule
diff --git a/hw/ip/prim/rtl/prim_sync_reqack_data.sv b/hw/ip/prim/rtl/prim_sync_reqack_data.sv
index d05d0f3..6950716 100644
--- a/hw/ip/prim/rtl/prim_sync_reqack_data.sv
+++ b/hw/ip/prim/rtl/prim_sync_reqack_data.sv
@@ -18,6 +18,8 @@
module prim_sync_reqack_data #(
parameter int unsigned Width = 1,
+ parameter bit EnRstChks = 1'b0, // Enable reset-related assertion checks, disabled by
+ // default.
parameter bit DataSrc2Dst = 1'b1, // Direction of data flow: 1'b1 = SRC to DST,
// 1'b0 = DST to SRC
parameter bit DataReg = 1'b0 // Enable optional register stage for data,
@@ -42,7 +44,9 @@
////////////////////////////////////
// REQ/ACK synchronizer primitive //
////////////////////////////////////
- prim_sync_reqack u_prim_sync_reqack (
+ prim_sync_reqack #(
+ .EnRstChks(EnRstChks)
+ ) u_prim_sync_reqack (
.clk_src_i,
.rst_src_ni,
.clk_dst_i,