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
    • Combinational Timing Overview
      • Propagation Delay and Levels of Logic
      • Zero-Delay Simulation vs Inertial Delay
      • Critical-Path Mindset in RTL
    • Muxes, Decoders and Encoders
    • Arithmetic Blocks
    • Comparators and Shifters
    • Tri-State and Shared Buses
    • Latch Inference
    • Arithmetic Datapaths
  • Sequential Design27
  • FSM & Control27
  • Timing & Clocking39
  • Reset & CDC34
  • Memory & Buses57
  • Advanced RTL28
  • Senior & Interview76
  • Glossary and Notation
Loading lesson

‹Combinational Timing Overview
  1. Topics
  2. RTL Design
  3. Combinational Design
  4. Combinational Timing Overview
  5. Zero-Delay Simulation vs Inertial Delay

Part 2 · Combinational · Intermediate

Zero-Delay Simulation vs Inertial Delay

RTL simulation settles in zero time, but real gates swallow short pulses.

On this page

    Why this matters

    RTL simulation settles every gate in zero time, so a design can pass every test and still glitch, race or miss timing in silicon. Knowing what zero-delay simulation hides tells you which other checks you still owe.

    After this lesson you can: explain delta cycles, tell inertial from transport delay, and say which signals may safely come from combinational logic.

    Zero-delay simulation

    In RTL simulation every assign and always_comb evaluates in zero simulation time. A chain of ten gates settles at the same timestamp as its input change.

    The simulator still has to order the evaluations. It uses delta cycles: tiny, zero-width steps inside one timestamp, in which each dependent assignment is re-evaluated until nothing changes.

    This is why RTL simulation cannot tell you whether a design is fast enough. Timing comes from the synthesized netlist and static timing analysis. Simulation only checks that the function is right.

    Inertial delay

    Gate-level simulation uses real delays. The default model for a Verilog assign #3 y = a; is inertial: if the input pulse is shorter than the delay, the output never changes.

    This approximates real gates, which tend to attenuate very short pulses. The sharp cutoff is an idealized digital simulation rule, not a universal physical guarantee. Measured response depends on the cell, load and pulse shape.

    A transport delay passes every pulse after the delay, even a very short one. An inertial delay swallows pulses shorter than the delay.

    Zero-delay RTL simulation

    Gate-level simulation / real silicon

    Gate delay

    None

    From the cell library

    Glitches

    Mostly invisible (they live inside delta cycles)

    Real, and they can propagate

    Pulses shorter than a gate delay

    Not modelled

    Attenuated in silicon, filtered by the idealized inertial rule

    Used for

    Functional verification

    Timing-annotated functional checks, glitch and power analysis (timing sign-off itself is STA)

    Watch out. It ignores the short pulse and follows the long one 3 units later.

    • Slots 1 to 3: out is x. The #3 assign has not driven it yet.

    • Slots 4 to 7: out reads 0. The 2-unit pulse on in (slots 5 to 6) is shorter than the delay, so it is swallowed.

    • Slots 8 to 10: in is 1 but out is still 0. The 5-unit pulse needs 3 units to cross.

    • Slot 11: out rises, 3 units after in rose.

    • Slots 11 to 15: out follows in at 1.

    • Slot 16: out falls, 3 units after in fell.

    Glitch-tolerant boundaries

    Glitches settle before the capture edge when timing is met; follow these rules.

    • Trust a same-domain registered output when it is stable through the receiving setup and hold window. It samples once per cycle. It then sees only the settled value, so settled glitches are safe.

    • Never drive async controls from raw combinational logic. Async means the control acts at once, not on a clock edge. Clock gates, resets, output enables, decoder strobes, and anything feeding an async input all count. Registering into the destination domain is only the start. Clocks need glitch-free switching logic, resets need a dedicated synchroniser with ordered release, and output enables need settled timing of their own.

    • Or reduce transitions instead of assuming they are glitch-free. Use a Gray-coded counter, where only one bit changes per step. Or assert one-hot requests one at a time from idle. A single-bit change alone does not remove reconvergent hazards. The 2:1 mux below glitches when only its select changes.

    • Know the classic glitch. A static-1 hazard is a short drop on a signal that should stay 1. A 2:1 mux built from AND-OR gates shows it. With both data inputs at 1, the output can briefly drop to 0 when the select changes. The select and its inversion briefly overlap at 0 during the change.

    Watch y. It should stay 1, but it drops to 0 for one slot.

    • Slots 1 to 2: the gates are still settling from x.

    • Slots 3 to 5: y holds 1 with sel at 1 (t0 is 0, t1 is 1).

    • Slot 6: sel drops to 0. Nothing else has moved yet.

    • Slot 7: sel_n is 1 and t1 has fallen to 0. y still reads 1.

    • Slot 8: y dips to 0 for one slot, although t0 is already 1.

    • Slots 9 to 11: t0 holds 1 and y is back to 1.

    Common mistakes

    Common pitfall

    Never put # delays in synthesizable RTL to "fix" a race or to model timing. Synthesis ignores them, so simulation and silicon will disagree. They belong in testbenches and models only.

    Interview

    “Why can a design pass RTL simulation and fail on silicon?” Zero-delay simulation hides glitches, races between asynchronous paths and timing violations. That is why we also run static timing analysis, gate-level checks and CDC tools.

    Check yourself A pulse of width 2 ns reaches a gate with a 3 ns inertial delay. What does the output do?

    Nothing. The pulse is shorter than the delay, so it is absorbed. A 5 ns pulse would appear at the output, delayed by 3 ns.

    Check yourself Three inverters in series change input at t = 5 with no delays. At what time does the final output settle in RTL simulation?

    At t = 5, the same timestamp. Delta cycles order the evaluations inside zero simulation time.

    Check yourself A glitch settles before the clock edge, and a flop samples the net once per cycle. What does the flop capture?

    The settled value, as long as it is stable through setup and hold. A same-domain registered output is safe from settled glitches. Async controls and crossings into another clock, reset or enable domain need their own protocols.

    Testbench

    These testbenches check instant settling and pulse filtering.

    design.sv
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    module tb_delta;
      timeunit 1ns; timeprecision 1ps;
      logic x = 0;
      wire c1, c2, c3;
      assign c1 = ~x;
      assign c2 = ~c1;
      assign c3 = ~c2;                           // three inverters in series
      int errors = 0;
    
      initial begin
        #5;
        x = 1;
        #0;                                      // let delta cycles run
        if (c3 !== 1'b0) begin                   // ~~~1 = 0 : settled at the SAME time (t = 5)
          $display("ERROR: c3=%b at t=%0t, expected 0", c3, $time);
          errors++;
        end
        if (errors != 0) $fatal(1, "FAIL: tb_delta errors=%0d", errors);
        $display("PASS: a chain of assigns settles in zero simulation time (t=%0t)", $time);
        $finish;
      end
    endmodule
    design.v
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    module tb_inertial;
      timeunit 1ns; timeprecision 1ps;
      reg a = 0;
      wire y;
      assign #3 y = a;                           // 3-unit inertial delay
    
      integer rises = 0;
      always @(posedge y) rises = rises + 1;
    
      initial begin
        #10 a = 1; #2 a = 0;                     // 2-unit pulse < 3 : swallowed
        #10 a = 1; #5 a = 0;                     // 5-unit pulse > 3 : passes through
        #10;
        if (rises == 1) $display("PASS: the short pulse was filtered, the long one passed");
        else            $fatal(1, "FAIL: rises=%0d", rises);
        $finish;
      end
    endmodule

    Remember

    • Zero-delay RTL simulation checks function only. Timing comes from static timing analysis on the netlist.

    • An inertial delay swallows pulses shorter than the delay; a transport delay passes every pulse.

    • A 2:1 AND-OR mux can drop for a moment when only its select changes (a static-1 hazard).

    Rule of thumb: never drive a clock gate, reset or output enable from raw combinational logic.

    Keep going

    • Interview: run a mock interview on this topic

    Related topics

    • Propagation delay and levels of logic

    Previous

    38 / 350

    Next: Critical-Path Mindset in RTL

    Up next

    Up nextCritical-Path Mindset in RTL

    Sign in to save progress

    Practice this lessonReport an error
    clkinout
    A 2-unit pulse is swallowed, a 5-unit pulse passes 3 units later
    clkselsel_nt0t1y
    A 2:1 mux output dips for one slot when select flips