If you have been following our CDC (Clock Domain Crossing) series, you know the golden rule of single-bit transfers: Always use a 2-Flop Synchronizer.
So, you design your RTL. You have two independent control bits—let's call them enable and mode—crossing from a 100MHz domain to a 500MHz domain. Like a good design engineer, you place a 2-flop synchronizer on each signal. The metastability resolves, the linting tools pass, and you tape out.
But when the silicon comes back, your destination state machine occasionally jumps into an illegal state and freezes. What went wrong?
Welcome to the hidden trap of CDC: Reconvergent Logic.
The +/- 1 Clock Cycle Uncertainty
To understand why your design crashed, we have to look at how synchronizers actually behave in the physical world.
When a signal goes metastable in the first stage of a 2-flop synchronizer, it will eventually settle to a 1 or a 0. But which one it settles to during that specific clock cycle is entirely random.
If it settles to the new value, the destination domain sees the signal change this cycle.
If it settles to the old value, the destination domain won't see the signal change until the next cycle.
This introduces a fundamental hardware rule: Every synchronizer has a built-in temporal uncertainty of +/- 1 clock cycle.