A reconvergence fix is not done when the RTL looks better; it is done when the finding is gone from the structural report, the dynamic checks still pass, and no new finding took its place. Fixes fail review most often on that third point: the repair adds a crossing the author never checked.
Fix applied | Structural recheck | Dynamic recheck |
|---|---|---|
Synchronise one, derive the rest | Convergence point gone; derivation logic local to the destination domain | Derivation covered by destination-domain tests with the strobe at every alignment |
Qualified capture | Qualifier crossing clean; no second synchroniser on the bundle | Stability assertion active; bus toggled in every legal window during regression |
Handshake or FIFO | Request, acknowledge, and pointer crossings each classified synchronised | Full protocol sequences: stall, backpressure, reset mid-transfer |
The added synchroniser needs the standard rules itself: registered source, no logic between flops, destination clock only.
A qualifier derived from a second synchronised copy reintroduces the finding under a new name; derive from the crossed signal, not from a copy of the source state.
Lengthening a pulse path (extra stages for settling) re-times every consumer of that pulse; recheck pulse spacing and derived enables.
Reset changes with the fix (new flops, new domain) need the reset-domain review again, not just the CDC one.
Close the loop in the finding tracker: link the fixed RTL, the clean structural excerpt, and the passing dynamic run to the original finding id, so the waiver history shows a repair rather than a disappearance.
The design is structurally correct but the new stimulus changes the bus inside a previously quiet window. Either the stimulus violates the agreed change protocol (fix the test and document the window) or the window was never real (reopen the finding). The assertion did its job either way.