Skip to content
VLSI Mentor

VHDL · Chapter 8.5 · Reset Design

Reset Release and Removal Recovery

Asserting an asynchronous reset is always safe, because flip-flops snap to their reset value. Releasing it is the danger. If reset de-asserts too close to a clock edge, the flip-flop is caught between being held in reset and resuming clocking, and can go metastable, just like a data input that violates setup or hold. The corresponding timing checks are recovery, where reset must be released a setup-like time before the edge, and removal, a hold-like time after it. The fix is the reset synchroniser, which asserts reset asynchronously for an immediate effect but de-asserts it synchronously, by clocking the release through two flip-flops so it always leaves reset aligned to the clock. This lesson explains recovery and removal, builds the two-flop synchroniser, and shows why every clock domain needs its own.

Foundation14 min readVHDLReset SynchroniserMetastabilityRecoveryRemovalCDC

1. Engineering intuition — the danger is letting go, not grabbing

Think of asynchronous reset like grabbing a moving part: grabbing (asserting) is fine at any instant — it stops immediately. Releasing is where timing matters: let go right as the clock edge arrives and the flip-flop cannot decide whether it was still reset or about to capture, so it can hover in an undefined middle state (metastable) and resolve unpredictably — and different flip-flops can resolve differently, leaving the design in an inconsistent state. So the rule is: assert reset whenever you like, but make sure it releases at a safe time relative to the clock.

2. Formal explanation — recovery and removal

recovery_removal.txt
Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
-- Around a clock edge, an asynchronous reset's DE-ASSERTION must respect two windows:
--   RECOVERY time: reset must be de-asserted at least t_rec BEFORE the active clock edge
--                  (analogous to setup) so the flip-flop reliably resumes clocking.
--   REMOVAL  time: reset must stay de-asserted at least t_rem AFTER the edge
--                  (analogous to hold) so the release does not disturb that edge's capture.
-- Violating recovery/removal → the flip-flop may go METASTABLE on the release.

Recovery and removal are the reset-release analogues of setup and hold for data. They constrain when asynchronous reset may de-assert relative to the clock edge. An unsynchronised, free-running reset release has no relationship to the clock and will eventually violate them — so the release must be made synchronous.

3. Production RTL — the reset synchroniser

reset_synchroniser.vhd
Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
library ieee; use ieee.std_logic_1164.all;
-- Assert ASYNC (immediate), de-assert SYNC: clock a '1' through two flops after async reset releases.
reset_sync : process (clk, arst_n)        -- arst_n: active-low ASYNCHRONOUS reset in
begin
  if arst_n = '0' then                    -- async ASSERT: clear the synchroniser immediately
    sync_ff  <= '0';
    rst_n    <= '0';
  elsif rising_edge(clk) then             -- sync RELEASE: shift a '1' in over two edges
    sync_ff  <= '1';
    rst_n    <= sync_ff;
  end if;
end process;
-- 'rst_n' is the clean reset used by the rest of the domain: asserts immediately, releases on a clock edge.

What hardware does this become? Two flip-flops whose asynchronous reset pins are driven by the raw arst_n (so they clear instantly on assert), and whose data path shifts a constant '1' through them after reset releases. The output rst_n therefore asserts asynchronously (the instant arst_n goes low) but de-asserts synchronously two clock edges later — by which point the release is aligned to the clock and the two-flop depth lets any metastability on the first flop settle. rst_n then resets the whole domain.

4. Hardware interpretation — the two-flop synchroniser

two flip-flop reset synchroniser: async assert, synchronous releaseraw async resetto both FF reset pins'1'shifted in after releaseFF1 (async reset)may catch metastability onreleaseFF2 (async reset)settles it → cleanrst_n (clean)assert async, de-assertsyncasync assertasync assertclk12
The reset synchroniser. The raw asynchronous reset drives the asynchronous reset pins of two flip-flops, so the synchroniser (and the reset it produces) ASSERTS immediately. When the raw reset releases, a constant '1' is clocked through the two flip-flops, so the produced reset DE-ASSERTS only on a clock edge, two cycles later — aligned to the clock, with the second flop filtering any metastability the first might catch on the release. The result is an internal reset that asserts asynchronously (immediate) and de-asserts synchronously (safe). One synchroniser is needed per clock domain, because each domain's clock defines its own safe release.

5. Simulation interpretation — assert at once, release on the edge

Reset synchroniser: rst_n asserts immediately, de-asserts on a clock edge two cycles later

8 cycles
Reset synchroniser: rst_n asserts immediately, de-asserts on a clock edge two cycles laterarst_n low → rst_n asserts IMMEDIATELY (async)arst_n low → rst_n assertsIMMEDIATELY (async)after arst_n releases, a '1' shifts through; rst_n de-asserts on the edge (sync)after arst_n releases, a'1' shifts through; rst_nde-asserts on the edge…clkarst_n00111111sync_ff00011111rst_n00001111t0t1t2t3t4t5t6t7
rst_n (the domain's reset) goes active the instant arst_n asserts — immediate, clock-free. After arst_n releases, the constant '1' propagates through the two synchroniser flip-flops, so rst_n de-asserts cleanly on a clock edge, two cycles later. The synchronous release is what avoids the recovery/removal metastability of an unsynchronised reset.

6. Debugging example — the unsynchronised reset release

Expected: the design comes out of reset cleanly and identically every time. Observed: intermittent, seed/voltage/temperature-dependent start-up failures; occasionally some flip-flops act reset for one extra cycle while others do not, leaving an inconsistent initial state. Root cause: a raw asynchronous reset de-asserted with no relationship to the clock, violating recovery/removal on some flip-flops and driving them metastable, so they resolved unpredictably (and at slightly different times across the chip). Fix: route reset through a reset synchroniser per clock domain — assert async, de-assert sync — so every flip-flop leaves reset on a clean, common clock edge. Engineering takeaway: an asynchronous reset must be released synchronously; an unsynchronised release is a metastability bug that hides as flaky power-up behaviour.

synchronise_the_release.vhd
Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
-- Use the synchroniser output (rst_n), NOT the raw async reset, throughout the domain.
process (clk, rst_n) begin
  if rst_n = '0' then state <= IDLE;
  elsif rising_edge(clk) then state <= next_state; end if;
end process;

7. Common mistakes & what to watch for

  • Releasing async reset without synchronising. The core bug; always de-assert synchronously via a reset synchroniser.
  • One synchroniser shared across clock domains. Each clock domain needs its own (its clock defines the safe release); share none.
  • Using a single flop. Two (or more) flops give the metastability on the release time to settle; one is not enough.
  • Synchronising the assert. Assertion should be asynchronous (immediate); only the release is synchronised.
  • Forgetting reset is like a CDC problem. Reset release is effectively an asynchronous-to-synchronous crossing; treat it with the same synchroniser discipline as clock-domain crossing.

8. Engineering insight & continuity

Reset release is a metastability problem in disguise: asserting an asynchronous reset is free, but releasing it near a clock edge violates recovery/removal exactly as a data change violates setup/hold. The reset synchroniser resolves it cleanly — assert asynchronously for immediacy, de-assert synchronously for safety — and it is required once per clock domain. This is the mechanism that makes the hybrid reset of the previous lesson robust. The module now closes by consolidating everything into a strategy: the final lesson, Reset Best Practices, covers polarity conventions, selective reset, distribution, and the per-domain synchroniser as a coherent reset methodology, before the curriculum moves to Finite State Machines.

Standards & specifications

Governing standard
IEEE Std 1076 (VHDL)(opens IEEE in a new tab)

Defines the VHDL language — types, the simulation cycle, and the semantics a conforming analyser and simulator must implement. Synthesis restrictions and vendor coding rules are tool behaviour, not language rules.

This page also covers RTL structure, verification approach and debugging technique. Those are engineering practice built on the standard, not requirements the standard itself imposes.

Where this fits

Part of the VHDL curriculum.