Reconvergence is rarely drawn deliberately. It grows when two signals that belong together are given two independent crossings because each looked like a single-bit problem on its own. The destination then combines clean copies that describe different source moments.
Pattern | What crosses separately | What the destination sees |
|---|---|---|
Related control bits | Two enables from the same state machine, each with its own synchroniser | One enable applied a cycle before the other |
Pulse plus qualifier | A strobe and the valid bit that says what it means | The strobe fires with a stale qualifier, acting on old meaning |
Derived enables | An enable synchronised directly, plus the same enable recomputed from another synchronised signal | The two copies disagree for the skew window |
Status consumed together | Two status flags sampled as a pair (for example empty plus error) | A flag pair that never coexisted drives the decision |
Data plus its own valid | A quasi-static bus sampled freely alongside a synchronised valid | New data with old valid, or old data sampled as new |
The waveform below is simulation output for a source strobe req_s and its qualifier qual_s rising together, each crossing through its own synchroniser into the destination domain. The qualifier path carries one extra destination flop standing in for one cycle of skew between the two synchroniser paths. bad is req_d & ~qual_d: the inconsistent combination.
How to read it: one slot is one source-clock cycle. req_s and qual_s rise together and are both high from slot 2.
req_d rises in slot 5, two destination edges after the change; qual_d follows one destination cycle later in slot 7.
bad is high across slots 5 and 6: the destination sees the request without its qualifier for one full destination cycle.
The release is clean: both sources fall together in slot 10, req_d falls in slot 13 and qual_d in slot 15, and bad stays low throughout because the request drops first.
Every flop settles correctly throughout. The glitch is skew between two correct paths, not metastability.
Structurally, from the extra flop on the qualifier path, which stands in for sampling or routing skew between the paths. req_d settles two destination edges after the change and qual_d three after, so they disagree for one cycle.