A signal from another clock domain can change inside the receiving flop's setup-hold window. The flop then becomes metastable and settles late to an unpredictable value, so crossings need synchronisers.
5 lessons, about 25 min
The first destination flop can go metastable if the signal changes inside its setup/hold window, and its (random) output can then be seen as different values by different logic, corrupting state. A synchroniser limits that to one controlled flop.
The whole topic on one page, taken from each lesson's Remember box. Read it before an interview, or print it.
What Metastability Means in Practice
Only a change inside the setup-hold window can cause it.
The output settles to the old or the new value at random, and more settling time makes a long delay exponentially less likely.
Simulation can model the random choice, but it cannot measure a real failure rate.
Rule of thumb: treat the event as certain to happen, and make sure the second flop only ever sees a settled value.
The Two-Flop Synchroniser
Cross one bit, or bits that are independent. Put nothing between the two flops.
Use only the second flop's output.
The source must hold its value for more than one destination period (in practice 1.5 to 2).
Rule of thumb: a level that holds still crosses safely; a pulse shorter than the destination period does not.
When to Use Three Flops
MTBF falls quickly as the clock and data rates rise.
A third flop adds one cycle of latency and more settling time, and the protocol must tolerate the extra cycle.
Choose stages from the implemented settling slack and the system MTBF target, not from frequency alone.
Rule of thumb: make the stage count a parameter of one wrapper, so a faster clock is a one-line change.
CDC Constraints and Implementation Hygiene
A crossing needs an explicit constraint, not an ordinary setup path.
A false path or clock group removes timing checks. It does not make the crossing correct.
Wrap the synchroniser once, so its attributes, constraints and checks live in one place.
Rule of thumb: every constraint that silences a check needs a CDC structural check beside it.
Do Not Synchronise Buses Bit by Bit
Independent bits may each use a synchroniser. Related bits may not.
A sample taken mid-change can be neither the old word nor the new one: the bus 0111 to 1000 was read as 4 between 7 and 8.
Gray code works for counters because only one bit changes per step. For general data, use a handshake or a FIFO.
Rule of thumb: cross one bit with a synchroniser; cross a word with a protocol.
Mini project: a two-clock block with a handshake, an async FIFO and a hostile test
Practice question: Metastability in a CDC control path, analysed from a waveform
Practice question: A 3-flop synchroniser that still causes glitches
Practice question: Design a CDC synchroniser for a memory-peripheral transfer
Code lab: Build the 2-flop synchroniser
Interview: run a mock interview on this topic