← RTL Design Interviews

Interview Question · Design

A CDC Sign-Off Plan for Your Block

L3 SeniorL4 Staffcdcsignoffmethodology
  • Likely at Google
  • Likely at Micron
  • Likely at Apple

The Question

The interviewer asks

You own an IP block with three clocks, an asynchronous FIFO and a few control crossings. What is your CDC sign-off plan, and what must be true before you call it done?

Reveal the Model Answer

Start with a written clock and reset spec: every clock, which are related, and each reset's domain. Run structural CDC checks until every crossing has an approved scheme, with no logic before synchronizers and no reconvergence. Turn each scheme's rule into an assertion, run it in formal and simulation, and add metastability injection. Bound the Gray buses with max-delay constraints. Done means zero open violations, and every waiver reviewed with a named owner.

What Each Check Can SeeThe write-domain pointer crosses through two flops into the read domain. The dashed boundary is where a structural check looks. Arrows mean "drives".
call: who calls whom
What each check can seeThe write-domain pointer crosses through two flops into the read domain. The dashed boundary is where a structural check looks. Arrows mean "drives". component bin counter(wclk) counts writes component gray register(wclk) bin ^ (bin >> 1), froma flop component sync1 (rclk) may go metastablewhen ptr moves nearthe edge component sync2 (rclk) settled copy used bythe read side component Structural check is there a recognisedsynchroniser? yes component Formal property does at most one bitchange per sourceedge? crosses
Read the diagram as text
  • bin counter (wclk): counts writes
  • gray register (wclk): bin ^ (bin >> 1), from a flop
  • sync1 (rclk): may go metastable when ptr moves near the edge
  • sync2 (rclk): settled copy used by the read side
  • Structural check: is there a recognised synchroniser? yes
  • Formal property: does at most one bit change per source edge?
  • bin counter (wclk) → gray register (wclk)
  • gray register (wclk) → sync1 (rclk): crosses
  • sync1 (rclk) → sync2 (rclk)
  • Structural check → sync1 (rclk)
  • Formal property → gray register (wclk)

Replace the gray register with the binary count and the structure is unchanged: same two flops, same pass. Only the property sees the difference.

Self-Check

Tick each key point you covered in your answer.

What Interviewers Listen For (Senior)

A good senior answer puts the plan in order: the clock spec, structure checks, protocol checks, constraints, then waivers. It names clear exit criteria instead of saying "the tool is clean".

Cross-Questions

Where the interviewer goes next. Open a node to practise that follow-up.

WhyWhat IfProve ItBreak ItCompareScale It

  1. A CDC Sign-Off Plan for Your Block
  2. CompareA False Path vs a Max Delay on a Gray BusL3 Senior

    Compare a false path with a max-delay constraint on the Gray-coded pointer bus of an asynchronous FIFO.

    Reveal the Model Answer

    A false path tells STA to ignore the bus, so place and route may stretch one bit far longer than another. Gray code only promises one change per step at the source. If the skew exceeds a destination period, two steps can overlap at the receiver. A max-delay bound of about one period keeps the bits together, and STA then checks it.

    Every Crossing Needs Its Own ReasonPointers and ready flags enter first-stage synchronizers. Stored data reaches the read register through a separate path.
    Every crossing needs its own reasonPointers and ready flags enter first-stage synchronizers. Stored data reaches the read register through a separate path. component Write domain wclk · write pointer ·memory component Readsynchronizers Pointer and readyfirst stages component Read domain rclk · read pointer ·output component Writesynchronizers Pointer and readyfirst stages Bounded Gray / readypathsNormal same-clocktimingBounded Gray / readypathsNormal same-clocktimingStable-word protocol+ data bound
    Read the diagram as text
    • Write domain: wclk · write pointer · memory
    • Read synchronizers: Pointer and ready first stages
    • Read domain: rclk · read pointer · output
    • Write synchronizers: Pointer and ready first stages
    • Write domain → Read synchronizers: Bounded Gray / ready paths
    • Read synchronizers → Read domain: Normal same-clock timing
    • Read domain → Write synchronizers: Bounded Gray / ready paths
    • Write synchronizers → Write domain: Normal same-clock timing
    • Write domain → Read domain: Stable-word protocol + data bound

    From lesson L8.1, an asynchronous FIFO: each Gray pointer path gets a delay bound, never a plain false path.

    Self-Check

    Tick each key point you covered in your answer.

    Half-Truth

    "Gray code is safe whatever the wire delays."

    It is safe only if each change reaches every bit before the next change. Unbounded skew breaks that.

    Source Lesson L8.1 and its source: Dassa and Mirsky, A New Approach to Easily Resolve the Hidden Timing Dangers of False Path Constraints on Clock Domain Crossings (DVCon), §II.A

  3. What IfThe Max Delay That Did NothingL3 SeniorL4 Staff

    What if the SDC also declares the two clocks as asynchronous groups? Does the max-delay still apply?

    Reveal the Model Answer

    No. set_clock_groups -asynchronous acts as false paths between the two clocks. In SDC precedence a false path outranks set_max_delay, so the pointer bound is dropped. This was confirmed on OpenSTA 3.1.0. Write the bound with path-level exceptions, and check the report to show it is applied.

    Self-Check

    Tick each key point you covered in your answer.

    Tool as Truth

    "Writing the constraint is enough."

    Exceptions interact, and one can silently override another. Only the timing report shows whether the bound is applied.

    Source Synopsys, Using the Synopsys Design Constraints Format (application note), timing exception precedence; confirmed on OpenSTA 3.1.0 in lesson L2.6

  4. WhyWhat Metastability Injection AddsL3 Senior

    Why add metastability injection to simulation, and what can it never prove?

    Reveal the Model Answer

    A synchronizer model that randomly adds a cycle of delay per bit shows how the design behaves when a crossing resolves late. It exposes logic that assumes an exact latency, and reconvergence that only fails with skew. It cannot prove absence: it finds only what the tests happen to reach.

    Self-Check

    Tick each key point you covered in your answer.

    Half-Truth

    "With injection on, passing regressions sign off CDC."

    Random delay finds only part of the errors. The structural and protocol checks still carry the sign-off.

    Source Mehta, ASIC/SoC Functional Design Verification (2018) ch. 8.5 CDC verification methodology (random-delay simulation models)

  5. What IfResets That Cross Clock DomainsL3 Senior

    Asked if they mention resets

    What if the block's three clock domains each have their own reset?

    Reveal the Model Answer

    Each domain gets its own reset synchronizer: assert at once, release on two edges of its own clock. Then the domains leave reset at different times. Every crossing needs a rule for that window, such as a ready flag from the receiver. A reset in one domain must not corrupt a flop in another domain that is mid-capture.

    Two Reset Synchronizers and a Ready FlagArrows show signals. The top row is domain A on clk_a, the bottom row domain B on clk_b.
    Two reset synchronizers and a ready flagArrows show signals. The top row is domain A on `clk_a`, the bottom row domain B on `clk_b`. component rst_n pin shared by bothdomains clk_a ra_q1, rst_a_n release on clk_a clk_a tog_a flips once per event clk_b rb_q1, rst_b_n release on clk_b clk_b t1, t2, t3 two flops, edgedetect ready up_b to up_q2 B is awake, told to A assert at onceassert at oncerst_a_nrst_b_ntoggleup_b
    1. Assert

      The pin falls and both domains are in reset at once, with or without their clocks.

    2. A releases first

      A's clock is running, so two of its edges release A. In the lab that is edge 3.

      Follow the calls, values and waits
      1. data release: ra_q1, rst_a_n → tog_a
    3. A sends too soon

      Without the flag, A sends as soon as it is out of reset. Its toggle reaches flops that are held at 0.

      Follow the calls, values and waits
      1. data event: tog_a → t1, t2, t3
    4. B says it is awake

      The fix: B raises up_b one edge after its release, and the flag crosses into A through two flops. A sends only when ready_a is 1.

      Follow the calls, values and waits
      1. data release: rb_q1, rst_b_n → t1, t2, t3
      2. data ready: t1, t2, t3 → up_b to up_q2
    Read the diagram as text
    • rst_n pin: shared by both domains
    • ra_q1, rst_a_n: release on clk_a
    • tog_a: flips once per event
    • rb_q1, rst_b_n: release on clk_b
    • t1, t2, t3: two flops, edge detect
    • up_b to up_q2: B is awake, told to A
    • rst_n pin → ra_q1, rst_a_n: assert at once
    • rst_n pin → rb_q1, rst_b_n: assert at once
    • ra_q1, rst_a_n → tog_a: rst_a_n
    • rb_q1, rst_b_n → t1, t2, t3: rst_b_n
    • tog_a → t1, t2, t3: toggle
    • t1, t2, t3 → up_b to up_q2: up_b

    The ready flag is a register in B that crosses like any other bit: from a flop, through two flops, into A.

    Self-Check

    Tick each key point you covered in your answer.

    Misconception

    "One reset synchronizer, shared by all three domains, is enough."

    It releases on one clock. In the other domains the release is asynchronous again, so their flops can leave reset in different cycles.

    Source Cummings, Mills and Golson, Asynchronous & Synchronous Reset Design Techniques - Part Deux (SNUG Boston 2003) §6.2

  6. Break ItHow a Waived Crossing Becomes a Silicon BugL3 SeniorL4 Staff

    Break it: how does a reviewed CDC waiver still turn into a bug in silicon?

    Reveal the Model Answer

    A waiver records an assumption, such as "this bus is static during operation". The tool stops checking, but nothing enforces the assumption. Later, software writes the register while traffic runs, or an RTL change adds a new path under the old waiver. Waivers need a stated assumption, an owner and a re-check after every change.

    Self-Check

    Tick each key point you covered in your answer.

    Delivery

    "Waived means reviewed, so it is safe for the life of the project."

    The waiver was true for the RTL on the day it was reviewed. Without a re-check, it hides every later change on that path.

  7. What IfThe Configuration Register That Never ChangesL3 Senior

    What if the crossing is a configuration register that "never changes while the block runs"?

    Reveal the Model Answer

    Then it can cross without a synchronizer, but only if that rule really holds. Write it down as a protocol: the block is idle or in reset when the register changes. Check it with an assertion in simulation and formal. Tell the software team, because they are the ones who could break it.

    Self-Check

    Tick each key point you covered in your answer.

    Half-Truth

    "Configuration is static, so it needs no CDC handling at all."

    It needs a rule instead of a synchronizer. Without an assertion, the first driver that writes it while the design runs breaks it.

    Source Mehta, ASIC/SoC Functional Design Verification (2018) ch. 8.5 CDC verification methodology (protocol verification)

  8. Scale ItCDC Sign-Off on a Many-Clock SoCL3 SeniorL4 Staff

    How do you sign off clock domain crossings on an SoC with dozens of clocks?

    Reveal the Model Answer

    Start with structural analysis: define the clocks and their relationships. Then let the tool find every crossing and check that each has the right synchronizer for its type. Next comes protocol checking: each scheme's rules, such as hold times and Gray steps, become assertions in formal and simulation. Add reconvergence checks and reviewed waivers. Use metastability injection in simulation to expose designs that assume exact timing.

    Self-Check

    Tick each key point you covered in your answer.

    Tool as Truth

    "Our regressions pass with all clocks running, so CDC is covered."

    RTL simulation never goes metastable and rarely hits the bad clock phase. CDC needs structural and protocol checks, not only passing tests.

    Source Mehta, ASIC/SoC Functional Design Verification ch. 8.5 (PDF p186-188); Sutherland, RTL Modeling with SystemVerilog ch. 8.1.6

    Wrong Altitude

    A staff-level answer that stops at "run the CDC tool".

    The interviewer wants the flow: constraints, structure, protocol, reconvergence, waiver review and who owns each step.

  9. Prove ItSolve R6.2.1: The Job That Finished TwiceSimulator-graded

    Show it, don't just say it: this Silicon Lab problem is graded by the simulator.

    Open Problem R6.2.1

What People Get Wrong

Common wrong answers and why they fail. Run It shows the wrong belief failing on a real simulator.

Missed Corner

"Every crossing has a synchronizer on every bit, so the structural check is enough."

Separately synchronized bits that meet again downstream can form a code the source never had. The twin shows a phase engine seen in DONE between LOAD and RUN.

Run It

A two-bit phase with binary codes; bit 1 arrives 0.2 ns and bit 0 1.0 ns after a change.

RUNIcarus Verilog · in your browser
Edit the code, then run it
Expected: destination saw: 00 01 11 10 11 FAIL: each bit had a synchronizer, yet the destination saw DONE between LOAD and RUN
See the Fix
`timescale 1ns/1ps
module tb;
  // A job engine's phase crosses as two bits, each with its own synchronizer.
  localparam logic [1:0] IDLE = 2'b00, LOAD = 2'b01, RUN = 2'b11, DONE = 2'b10;   // Gray: one bit per step
  logic dclk = 0;
  always #5 dclk = ~dclk;
  logic [1:0] phase = IDLE, wire_p, s1, s2, last;
  assign #0.2 wire_p[1] = phase[1];              // bit 1 arrives early
  assign #1.0 wire_p[0] = phase[0];              // bit 0 arrives late
  always_ff @(posedge dclk) begin s1 <= wire_p; s2 <= s1; end
  string seen = "";
  int done_early = 0;
  always @(posedge dclk) if (s2 !== last) begin
    seen = {seen, $sformatf(" %b", s2)};
    if (s2 == DONE && last == LOAD) done_early++;
    last = s2;
  end
  initial begin
    #14.5 phase = LOAD;
    #20   phase = RUN;                            // t = 34.5, just before an edge
    #20   phase = DONE;
    #60;
    $display("destination saw:%s", seen);
    if (done_early == 0) $display("PASS: with one bit changing per step, the destination saw only real phases");
    $finish;
  end
endmodule

Prints: destination saw: 00 01 11 10 PASS: with one bit changing per step, the destination saw only real phases

Misconception

"Set a false path on every crossing; the synchronizers make timing irrelevant."

A false path lets place and route skew the bits of a Gray bus by more than a period. Then two bits change at once at the receiver.

Source Lesson L8.1 and its source: Dassa and Mirsky, A New Approach to Easily Resolve the Hidden Timing Dangers of False Path Constraints on Clock Domain Crossings (DVCon), §II.A

Tool as Truth

"Our regressions run with all clocks, so CDC is covered."

RTL flops have no setup or hold time, so a crossing never fails in RTL simulation. Structural and protocol checks are needed.

Source Mehta, ASIC/SoC Functional Design Verification (2018) ch. 8.5 CDC verification methodology

Learn It, Then Prove It