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

AboutRoadmapCareersInternshipsFAQContactPrivacyTerms
Skip to lesson

Course contents

  • RTL Foundations36
  • Combinational Design25
  • Sequential Design27
  • FSM & Control27
  • Timing & Clocking39
  • Reset & CDC34
    • Reset Architecture
      • Reset Is a System Contract
      • Async Assert, Sync Deassert
      • Reset Tree Planning
      • Reset Sequencing and POR Controller
      • What a Reset Costs
    • Metastability and Synchronisation
    • Asynchronous FIFO
    • CDC Protocols
    • Reset Domain Crossing
    • CDC Verification
  • Memory & Buses57
  • Advanced RTL28
  • Senior & Interview76
  • Glossary and Notation
Loading lesson

←Reset Architecture
  1. Topics
  2. RTL Design
  3. Reset & CDC
  4. Reset Architecture
  5. Reset Is a System Contract
On this page

    Part 6 of 9, lesson 1 of 34Part 6 of 9/Reset & CDC/Lesson 1 of 34Intermediate

    Reset Is a System Contract

    Async and sync reset styles, what each guarantees, and a test with a stopped clock.

    Stop the clock and assert reset: an asynchronous-reset flop clears at once, while a synchronous-reset flop keeps its old value until the clock restarts. Reset is a contract for the whole chip, and the style you pick decides what is safe during clock start-up.

    After this lesson you can: state the four parts of the reset contract and choose between asynchronous and synchronous reset for a given flop.

    What the contract says

    • After reset, every flop that matters has a known value, and every output is defined.

    • Reset asserts whatever the state of the clocks: at power-up there may be no clock yet.

    • Reset releases only when each domain's clock is stable, in an order the design can tolerate.

    • Software and other blocks know how long to wait before using the design.

    Two coding styles

    Asynchronous reset

    Synchronous reset

    Code

    always_ff @(posedge clk or negedge rst_n)

    always_ff @(posedge clk) with if (!rst_n) first

    Acts without a clock

    Yes

    No: needs a clock edge

    Extra logic

    None in the data path (flop has a reset pin)

    A gate on D for every reset flop

    Release timing problem

    Yes: recovery/removal; needs a synchroniser on release

    Ordinary D-path setup/hold still apply; use a synchronised and timed reset input

    Reset glitch risk

    A glitch on rst_n resets the flop

    A glitch is filtered unless it lands on a clock edge

    Typical use

    Control/state flops, anything that must start clean with no clock

    Datapath where area/timing prefer plain flops

    Each slot is half a clock period (5 ns), so a running clock alternates 0 and 1 and a stopped clock stays flat.

    • The clock stops low after slot 1 and stays low in slots 2 to 4.

    • rst_n falls in slot 3, while the clock is stopped. q_async falls in the same slot: no clock edge is needed.

    • q_sync keeps its 1 until the clock restarts and rises in slot 5, and only then clears.

    • rst_n is released in slot 6, on a falling edge, and both flops capture d = 1 at the rise in slot 7.

    The full code sits under Testbench below.

    Synchronous reset syntax is not CDC protection. An asynchronous reset source can violate the reset mux's D-path setup/hold on assertion or release. Synchronise it to this clock and time the resulting path; the falling-edge release in this ideal example deliberately avoids that sampling window.

    Reset only what needs it. Control state, valid bits and FSM state need reset; wide datapath registers that are always written before use do not. Fewer reset flops means a smaller reset tree and less area.

    Common mistakes

    Never mix styles for the same flop by accident. A synchronous reset on a flop in a gated-clock domain never takes effect while the clock is off; an asynchronous reset in a domain without a reset synchroniser can release at an arbitrary instant. Both are common bugs.

    Check yourself You must guarantee a state machine is in IDLE when a clock is slow to start. Which reset style do you use?

    Asynchronous assert (with a synchronised release): it forces IDLE immediately, without waiting for the clock.

    Testbench

    The testbench stops the clock, then checks both reset styles.

    ff_async.sv
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    `timescale 1ns/1ps
    
    module ff_async (input logic clk, rst_n, d, output logic q);
      always_ff @(posedge clk or negedge rst_n)
        if (!rst_n) q <= 1'b0;
        else        q <= d;
    endmodule
    
    module ff_sync (input logic clk, rst_n, d, output logic q);
      always_ff @(posedge clk)
        if (!rst_n) q <= 1'b0;
        else        q <= d;
    endmodule
    

    The test stops the clock before asserting reset. The asynchronous flop clears at once, while the synchronous flop holds its value until the clock restarts.

    That difference decides which style suits logic that must be safe during clock start-up.

    • After reset every flop that matters has a known value. Reset asserts without a clock, and releases only when each domain's clock is stable.

    • Reset only control state, valid bits and FSM state. Datapath registers that are written before use need none, and fewer reset flops means a smaller tree.

    • Never mix styles on one flop by accident: a synchronous reset in a gated-clock domain does nothing while the clock is off.

    Rule of thumb: reset what must be known at start-up, and nothing else.

    • Practice: Reset strategies in RTL: synchronous, asynchronous and gated

    • Practice: Why reset matters in FSMs and how it is handled

    • Interview: run a mock interview on this topic

    Related topics

    • Async assert, sync deassert

    • What a reset costs

    Previous

    155 / 350

    Next: Async Assert, Sync Deassert

    Up next

    Up nextAsync Assert, Sync Deassert

    Sign in to save progress

    Practice this lessonPrevious lessonReport an error

    See also

    • Reset Tree Planning
    • Reset Sequencing and POR Controller
    • What a Reset Costs
    clkrst_nq_asyncq_sync
    Simulation of the lesson's testbench: the clock stops low, rst_n falls, the asynchronous flop clears at once and the synchronous flop clears only at the first edge after the clock restarts