Welcome back to our Clock Domain Crossing (CDC) series! In our first post, we introduced the critical challenges of CDC in digital designs. In this article, we focus on one of the most fundamental and effective techniques to tackle metastability, a core issue in CDC: the two-stage flip-flop synchronizer.
Understanding metastability and how this simple synchronizer design combats it is essential for creating reliable, glitch-free systems that safely transfer signals across clock domains.
What is Metastability and Why Does it Matter?
When a signal crosses from one clock domain to another, the receiving flip-flop samples the input asynchronously relative to its own clock. If the input changes very close to the clock edge, the flip-flop’s internal circuitry can enter a metastable state—an unstable condition where the output is neither a clear logical ‘0’ nor ‘1’ for an unpredictable amount of time.
This metastable state can cause:
- Unpredictable outputs: Leading to logic errors downstream.
- Timing violations: Potentially causing system failures.
- Difficult debugging: Because metastability-induced bugs are intermittent and hard to reproduce.
Metastability cannot be entirely eliminated but can be dramatically reduced to negligible levels with proper design.
How Does a Two-Stage Flip-Flop Synchronizer Help?
The two-stage flip-flop synchronizer works by giving the metastable signal time to settle before it propagates further into the design.

Here’s how it works:
- First flip-flop: Captures the asynchronous input signal. If metastability occurs here, it may take some time to resolve.
- Second flip-flop: Samples the output of the first flip-flop on the next clock cycle, providing an additional clock cycle for the metastable output to settle to a stable ‘0’ or ‘1’.
By cascading two flip-flops clocked by the destination clock domain, the probability that metastability affects downstream logic is reduced exponentially. This technique does not eliminate metastability, but it makes its occurrence so rare that it’s practically safe for most designs.

Verilog Example of a Two-Stage Synchronizer
module two_stage_synchronizer (
input wire async_signal, // Signal from source clock domain
input wire dest_clk, // Destination clock domain clock
input wire rst_n, // Active-low synchronous reset
output reg sync_signal // Synchronized output signal
);
reg sync_ff1;
always @(posedge dest_clk or negedge rst_n) begin
if (!rst_n) begin
sync_ff1 <= 1'b0;
sync_signal <= 1'b0;
end else begin
sync_ff1 <= async_signal; // First stage: capture async input
sync_signal <= sync_ff1; // Second stage: stabilize output
end
end
endmodule
Important Design Considerations
- Use only for single-bit signals: Multi-bit buses require more complex CDC techniques.
- Synchronous reset: Reset should be synchronous with the destination clock for proper initialization.
- Latency: Adds one clock cycle of delay, which is usually acceptable for control signals.
- More stages for higher reliability: Adding more flip-flops can further reduce metastability risk but increases latency.
Why Industry Relies on Two-Stage Synchronizers
- Simplicity: Easy to implement and verify.
- Effectiveness: Provides a strong metastability mitigation with minimal resource cost.
- Standard practice: Widely adopted in FPGA and ASIC designs for control signal synchronization.
What’s Next in Our CDC Series?
In the next post, we’ll tackle multi-bit CDC challenges and explore techniques like asynchronous FIFOs and handshake protocols that ensure safe data transfers across clock domains.
Metastability is an unavoidable reality in clock domain crossing, but with the right design techniques, you can reduce its impact to near zero. The two-stage flip-flop synchronizer is a simple yet powerful solution that gives your signals the time they need to stabilize, protecting your design from elusive and hard-to-debug errors.
Discover more from VLSIFacts
Subscribe to get the latest posts sent to your email.