Skip to content
DenseChip
Learn
PracticeCode labInterview

DenseChip

Navigate

Menu

LearnPracticeCode labInterview

Tools

All toolsSV editorCode repoResume
DenseChip

Practice, courses, and chip-design tools in one focused workspace.

LearnPracticeCode labInterviewToolsLearning paths

© 2026 DenseChip

AboutContactPrivacyTerms
Skip to lesson

Course contents

  • RTL Foundations36
  • Combinational Design25
  • Sequential Design27
  • FSM & Control27
  • Timing & Clocking39
  • Reset & CDC34
  • Memory & Buses57
  • Advanced RTL28
  • Senior & Interview76
    • Low-Power RTL Hub
    • DFT and Scan Hub
    • Physical Awareness Hub
    • Waveform Debug Hub
    • STA and ECO Hub
    • RTL-to-Implementation Closure
    • DFT-Ready RTL
    • Capstone: Resilient Streaming Peripheral
    • Principal Design Review
    • Senior RTL Interview Questions & Model Answers
      • Interview: Combinational and Arithmetic
      • Interview: Sequential and Pipelines
      • Interview: FSM and Control
      • Interview: Timing and STA
      • Interview: CDC and Reset
        • A CDC review: what to check
        • Reset assertion vs release
        • Why an async FIFO uses Gray pointers
        • Pulse synchronizers and reset-domain crossings
      • Interview: Memories and Buses
      • Interview: Low-Power Design
      • Interview: Debug and ECO
      • Interview: Coding and Whiteboard
  • Glossary and Notation
Loading lesson

‹Interview: CDC and Reset
  1. Topics
  2. RTL Design
  3. Senior & Interview
  4. Senior RTL Interview Questions & Model Answers
  5. Interview: CDC and Reset
  6. Reset assertion vs release

Part 9 · Senior · Senior

Reset assertion vs release

Why reset asserts asynchronously but releases synchronously, with a reset synchroniser and its test.

On this page

    Why this matters

    A reset that releases asynchronously can leave some flops out of reset and others in on the same edge, and the design starts in an illegal state. The interviewer asks async or sync to see if you treat assertion and release separately.

    After this lesson you can: explain why the usual answer is asynchronous assert with synchronised release, draw the two-flop reset synchroniser, and say when synchronous or no reset is fine.

    The question

    “Async or sync reset, and why?” The interviewer is testing whether assertion and release are treated as separate problems.

    The short answer is the hybrid: async assert for immediacy, sync deassert against metastability. Here is the reasoning behind each half.

    Model answer

    State that must become safe without a running clock needs clock-independent assertion, commonly asynchronous assert with synchronized release. Other control/datapath state may use synchronous reset or remain unreset if validity and write-before-use prevent observation. Choose per register contract, including stopped-clock and power behavior; asynchronous reset is not mandatory on every flop.

    Side

    Requirement

    Circuit

    Assert

    Clock-independent for state requiring it

    Raw reset drives reset-synchronizer stages; synchronized domain reset drives selected downstream async-reset state.

    Release

    Nominally after STAGES clean local edges in the digital model

    Chain shifts in 1; depth/settling and downstream recovery/removal require physical closure (template).

    Each slot is one clock cycle. The input falls and rises between clock edges, so assertion and release show as separate halves.

    • Slots 0 to 2: arst_n rises just before an edge. ff1 captures it at that edge, and srst_n follows one edge later, so release takes two edges.

    • Slot 4: arst_n falls mid-cycle and both stages already read 0 in that same slot, with no waiting edge.

    • Slots 6 to 7: the second release repeats the two-edge pattern, so downstream logic starts on a clock edge.

    One synchroniser serves one clock domain. A second domain gets its own synchroniser from the same source, and interacting domains leave reset in dependency order (sequencing). Data buses that cross domains stay unreset where possible, so a reset value cannot leak across as fake data.

    Follow-ups

    Check yourself Why is the first flop input tied to 1?

    So only the release travels down the chain, one stage per clock edge. Assertion bypasses the chain through the asynchronous clear.

    Check yourself How many stages, and when is two not enough?

    Two is a common starting point. Use characterized PVT parameters, implemented settling time, reset activity and the allocated reliability budget to choose depth. More stages add nominal latency and settling; no stage count guarantees an exact physical release edge.

    Check yourself A clock is slow to start at power-up. Which half saves the design?

    Async assert: it forces control state to a known value at once, without waiting for the first edge. The release then waits for the clock through the synchroniser.

    Common wrong answers

    Common pitfall

    Pitfall: routing the raw asynchronous reset straight to downstream flops, bypassing the synchroniser, so they release asynchronously. Only the synchroniser stages see the raw reset; consumers use the domain's synchronised reset. The synchronizer output rises after its final stage updates; downstream synchronous logic first operates on the following edge. Metastability may delay release beyond the nominal edge; close settling/reliability and recovery/removal at consumers.

    • “One reset style everywhere.” Synchronous reset cannot act on a stopped clock, but is valid when the contract allows waiting. Unreset data is valid when it is written before use and guarded by reset validity state.

    • “One synchroniser shared between two clocks.” Release must align to the clock that uses it. Each domain gets its own synchroniser.

    Solution and testbench

    The finite digital phase sweep releases reset at nine positions between clock edges and checks nominal two-stage release. Select stage depth from characterized reliability and inspect the implemented reset tree, as in reset architecture.

    reset_sync.sv
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    // Asynchronous assert, synchronous release: one reset synchroniser per clock domain.
    module reset_sync #(parameter int STAGES = 2) (
      input  logic clk,
      input  logic arst_n,           // asynchronous reset input (pin, POR, or another domain)
      output logic srst_n            // reset for this clock domain
    );
      // Legal range: STAGES >= 2 (a single flop cannot give the settling the chain exists for).
      if (STAGES < 2) begin : g_bad_stages
        initial $fatal(1, "reset_sync: STAGES must be >= 2");
      end
    
      logic [STAGES-1:0] sr;
      always_ff @(posedge clk or negedge arst_n)
        if (!arst_n) sr <= '0;                      // assert: immediately, no clock needed
        else         sr <= {sr[STAGES-2:0], 1'b1};  // release: shifts in 1s, one stage per clock
      assign srst_n = sr[STAGES-1];
    endmodule
    

    Remember

    • Assertion needs no clock. Release must meet the clock, so it goes through a two-stage synchroniser.

    • Each clock domain gets its own reset synchroniser. Consumers use its output, never the raw reset.

    • Data buses that cross domains stay unreset where possible, so a reset value cannot leak across as data.

    Rule of thumb: assert asynchronously, release synchronously, and give every domain its own release.

    How this was checked

    Phase sweep Run with Icarus Verilog 13.0 (2026-10-16): prints PASS. It releases reset at nine positions between clock edges and checks the nominal two-stage release. It does not inject analog metastability or measure recovery and removal.

    Keep going

    • Practice: Debugging metastability from asynchronous reset deassertion

    • Practice: Reset strategies: sync, async and gated

    • Code lab: Build a reset synchroniser

    • Interview: run a mock interview on this topic

    Related topics

    • Reset architecture

    • Async assert, sync deassert

    Previous

    330 / 350

    Next: Why an async FIFO uses Gray pointers

    Up next

    Up nextWhy an async FIFO uses Gray pointers

    Sign in to save progress

    Practice this lessonReport an error

    See also

    • Pulse synchronizers and reset-domain crossings
    clkarst_nff1srst_n
    A reset that asserts mid-cycle clears both stages at once, while release takes two clock edges after the input rises