fix(rni): two-packet write txdat send trigger lost - #15
Conversation
…s low For two-packet write entries (e.g. 64B write = 2x32B flits), the send trigger (rdy_d3 & sel_d3) for the second packet may assert while awctrl_txdat_not_busy_d2_i is still low (wr_buffer assembling the first flit). By the time not_busy_d2 reasserts, rdy_d3 has already been cleared, causing the second data flit to never be sent and the write transaction to hang. Add a txdat_send_pending_q register to latch the send trigger until not_busy_d2 allows it to propagate into txdat_send_vec.
|
Closing this in favour of the root-cause fix. This PR patches a real defect but only its lost-flag symptom. The actual mechanism is that The correct fix is to gate both shadow registers with the same Recommend maintainers take the shadow-enable approach rather than this side-latch. Thanks to @umerimran-10xe for running it down. |
Problem
In
rni_awctrl, for two-packet write entries (e.g. 64B write = 2x32B CHI data flits), the second packet's send trigger (txdat_rdy_entry_d3_q & txdat_select_vec_d3_q) may assert whileawctrl_txdat_not_busy_d2_iis still low, because the write buffer is still assembling the first flit. By the timenot_busy_d2reasserts,rdy_d3has already been cleared. This causestxdat_send_vecto never be set for the second packet, and the write transaction hangs.Root Cause
The original combinational assign gates the send trigger with
not_busy_d2, butrdy_d3is only high for one cycle. When these two signals do not overlap, the trigger is lost.Before:
Fix
Add a
txdat_send_pending_qregister that latches(rdy_d3 & sel_d3)and holds it untilnot_busy_d2allows propagation intotxdat_send_vec. The pending bit is cleared oncetxdat_send_vecis set or the entry is deallocated.After:
Affected file:
rtl/src/rni/rni_awctrl.v