[lc] Stop requesting tokens from KMAC after reception
Previously, the REQ signal was kept high after receiving ACK but then
lowered withtout a new handshake. This is problematic for the CDC
crossing.
Signed-off-by: Pirmin Vogel <vogelpi@lowrisc.org>
diff --git a/hw/ip/lc_ctrl/rtl/lc_ctrl_kmac_if.sv b/hw/ip/lc_ctrl/rtl/lc_ctrl_kmac_if.sv
index 6a14ba7..a8f6f33 100644
--- a/hw/ip/lc_ctrl/rtl/lc_ctrl_kmac_if.sv
+++ b/hw/ip/lc_ctrl/rtl/lc_ctrl_kmac_if.sv
@@ -35,6 +35,7 @@
logic kmac_req, kmac_ack;
lc_token_t kmac_transition_token;
+ logic token_hash_req;
// The transition_token_i register is guaranteed to remain stable once a life cycle
// transition has been initiated.
@@ -52,7 +53,7 @@
.rst_src_ni ( rst_ni ),
.clk_dst_i ( clk_kmac_i ),
.rst_dst_ni ( rst_kmac_ni ),
- .src_req_i ( token_hash_req_i ),
+ .src_req_i ( token_hash_req ),
.src_ack_o ( ), // not connected
.dst_req_o ( ), // not connected
.dst_ack_i ( kmac_ack ),
@@ -79,7 +80,7 @@
.rst_src_ni ( rst_ni ),
.clk_dst_i ( clk_kmac_i ),
.rst_dst_ni ( rst_kmac_ni ),
- .src_req_i ( token_hash_req_i ),
+ .src_req_i ( token_hash_req ),
.src_ack_o ( token_hash_ack_d ),
.dst_req_o ( kmac_req ),
.dst_ack_i ( kmac_ack ),
@@ -117,6 +118,9 @@
assign token_hash_err_o = token_hash_err_q;
assign hashed_token_o = hashed_token_q;
+ // Stop requesting tokens upon latching on LC side.
+ assign token_hash_req = token_hash_req_i & ~token_hash_ack_q;
+
/////////////////////////////////////////////
// Serialization FSM Running on KMAC Clock //
/////////////////////////////////////////////