CDC-101.2: The CDC Linter — Catch Clock Domain Issues Early

When it comes to FPGA design, Clock Domain Crossing (CDC) issues are among the most elusive and costly bugs to diagnose. They often appear late — in the lab or on customer hardware — and can be extremely hard to reproduce.

What if you could catch them much earlier, without adding third-party tools?

Enter Vivado’s CDC Linter — a little-known, built-in static analysis feature that can help you detect CDC issues early in your design flow, without requiring any extra licenses or software.

The CDC Problem: Why It’s Dangerous

In FPGA and ASIC designs, signals often need to pass between blocks running on different clocks. This introduces potential risks:

  • Metastability, when a flip-flop samples a signal mid-transition
  • Data loss, due to inadequate synchronization
  • Glitches, especially in control signals
  • Inconsistent resets, across clock boundaries

These bugs are hard to simulate because:

  • They are data- and timing-dependent
  • They don’t always manifest during normal testbenches
  • They show up under specific PVT (Process, Voltage, Temperature) conditions

That’s why static CDC analysis is a must in any robust verification flow.

What is Vivado’s CDC Linter?

Vivado’s CDC Linter is a static, rule-based analysis engine that inspects your RTL code and identifies:

  • Cross-domain signal transfers
  • Missing or misused synchronizer structures
  • Unsafe asynchronous resets
  • Potential metastability vulnerabilities

And unlike full CDC verification tools (like Synopsys VC Formal or Siemens Questa CDC), Vivado’s Linter runs fast and doesn’t require extra setup, licenses, or formal models.

What the CDC Linter Checks For

Here’s what Vivado’s CDC Linter can detect:

Check TypeDescription
Single-bit CDCIdentifies clock domain transfers missing proper synchronizer flip-flops
Multi-bit CDCFlags multi-bit buses crossing domains without proper handshakes or gray encoding
Async Reset IssuesDetects reset signals crossing domains without resynchronization
Data FanoutWarns if signals fan out from one domain to multiple others, creating timing hazards
Missing AcknowledgmentChecks for unidirectional handshakes or latches

Each issue is reported with:

  • Source and destination clocks
  • Type of crossing
  • Signal name and hierarchy
  • Severity (Warning, Critical, etc.)
  • Suggested mitigation strategies

How to Use the CDC Linter in Vivado

Running the CDC Linter is straightforward:

Option 1: Via Tcl Console

report_cdc -verbose -details

Option 2: Via Vivado GUI

  1. Open your synthesized design
  2. Go to Tools > Report CDC
  3. Choose verbosity level and generate the report
  4. Review flagged issues interactively in the report view

You can also export the CDC report to a file for documentation or design reviews.

What the CDC Linter Is (and Isn’t)

The CDC Linter is:

  • Fast static analysis of RTL
  • Free and built into all Vivado editions (even Standard)
  • Great for early-stage verification and design reviews

But it’s not:

  • A full formal CDC checker
  • A timing analyzer (it doesn’t analyze actual delays or metastability MTBF)
  • Meant to replace simulation or functional verification

That said, for small to mid-sized designs — or as a first-pass CDC filter — it’s an invaluable tool.

Example Use Case: Missed Synchronizer

Imagine you’re designing a UART interface in a slower clock domain and sending status signals to an AXI interface running at a faster clock. A simple tx_done pulse crosses from UART to AXI.

If you forget to insert a 2-stage synchronizer, Vivado’s CDC Linter will flag it — even if your simulation doesn’t.

Result: You catch a potential metastability bug before the testbench is written, saving debug time and downstream pain.

Best Practices

To get the most out of the CDC Linter:

  • Use consistent clock naming conventions in your RTL
  • Tag your synchronizer modules or use ASYNC_REG attributes
  • Run CDC linting as early as possible — ideally right after RTL handoff
  • Integrate into your synthesis flow or CI pipeline

How This Fits into the Larger Vivado Ecosystem

AMD continues to evolve Vivado into a more verification-aware toolchain. Recent versions added:

  • UVM simulation support
  • VHDL code coverage in 2025.1 (Existing Verilog/SystemVerilog code coverage)
  • Functional coverage via SystemVerilog

Adding CDC linting to your workflow brings Vivado closer to a full RTL signoff environment, especially for budget-conscious teams not using third-party EDA tools.

Final Thoughts

CDC issues are stealthy and hard to simulate — but they’re easy to prevent with the right tools.

Vivado’s CDC Linter is a simple, powerful way to:

  • Improve design reliability
  • Catch bugs earlier
  • Build more robust, production-ready FPGA systems

And it’s already in your toolbox. Start using it.