[keymgr] Fix reseed_ctrl edn requests
- Fixes #8260
- Ensure edn protocol is always followed no matter how software
changes the reseed_interval
Signed-off-by: Timothy Chen <timothytim@google.com>
diff --git a/hw/ip/keymgr/rtl/keymgr_reseed_ctrl.sv b/hw/ip/keymgr/rtl/keymgr_reseed_ctrl.sv
index 8c0d5fa..c4f746f 100644
--- a/hw/ip/keymgr/rtl/keymgr_reseed_ctrl.sv
+++ b/hw/ip/keymgr/rtl/keymgr_reseed_ctrl.sv
@@ -40,7 +40,7 @@
logic [EdnCntWidth-1:0] edn_cnt;
logic edn_txn_done;
logic edn_done;
- logic edn_req, edn_ack;
+ logic edn_req, edn_req_d, edn_req_q, edn_ack;
logic [EdnWidth-1:0] edn_data;
// This tracks how many edn rounds are required to fill up
@@ -77,15 +77,30 @@
.clk_i,
.rst_ni,
.clr_i(edn_done),
- .set_i(reseed_req_i & ~edn_req),
- .set_cnt_i(reseed_interval_i),
+ .set_i('0),
+ .set_cnt_i('0),
.en_i(~edn_req & ~first_use),
.step_i(16'h1),
.cnt_o(reseed_cnt),
.err_o(cnt_err_o)
);
- assign edn_req = (reseed_cnt == reseed_interval_i);
+ // latch edn request to ensure even if interval is changed in the middle
+ // the req/ack protocol is respected
+ always_ff @(posedge clk_i or negedge rst_ni) begin
+ if (!rst_ni) begin
+ edn_req_q <= '0;
+ end else if (edn_done) begin
+ edn_req_q <= '0;
+ end else begin
+ edn_req_q <= edn_req_q | edn_req_d;
+ end
+ end
+
+ // An edn request can either come from counter or from external
+ assign edn_req_d = reseed_req_i | (~first_use & (reseed_cnt == reseed_interval_i));
+ assign edn_req = edn_req_q | edn_req_d;
+
assign reseed_ack_o = reseed_req_i & edn_done;
assign seed_en_o = edn_done;