Skip to content

VHDL · Chapter 3.7 · Signals & Hardware Behavior

Inertial vs Transport Delay

When you schedule a value with a delay, VHDL has to decide what happens to a brief pulse that comes and goes inside the delay window, and it offers two models. Inertial delay, the default, rejects any pulse shorter than the delay, modelling the inertia of a real gate that swallows glitches narrower than its own propagation time. Transport delay passes everything, faithfully delaying even a one-picosecond spike, modelling an ideal wire. Choosing the wrong one makes glitches vanish or appear in your simulation. This lesson shows both models on a waveform, explains how the reject clause tunes the rejection limit, and is clear that, like all scheduled delays, these are simulation-only and synthesis ignores them.

Foundation14 min readVHDLInertial DelayTransport DelayGlitchafterSimulation

1. Engineering intuition — does a glitch survive the delay?

A real logic gate cannot switch infinitely fast: a pulse at its input that is narrower than the gate's own propagation delay does not have enough "energy" to flip the output — the gate's inertia swallows it. A wire, by contrast, has no such filtering: whatever goes in comes out, just later. VHDL gives you both behaviours so your delay models match what you are modelling.

The question every after must answer is therefore: if a new value arrives before a previously scheduled one has appeared, does the brief intervening pulse propagate? Inertial says no (filter it); transport says yes (pass it).

2. Formal explanation — the two models and the reject clause

inertial_vs_transport.vhd
Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
y <= x after 5 ns;                 -- INERTIAL (default): pulses on x shorter than 5 ns are rejected
y <= transport x after 5 ns;       -- TRANSPORT: every change on x is reproduced 5 ns later
y <= reject 2 ns inertial x after 5 ns;  -- custom: reject pulses shorter than 2 ns, delay 5 ns
  • Inertial is the default for signal <= expr after t. It rejects pulses shorter than t (the rejection limit defaults to the delay t).
  • Transport (transport keyword) reproduces every transition delayed by t, regardless of width.
  • reject t1 inertial … after t2 decouples the two: reject pulses narrower than t1 while delaying by t2 (with t1 <= t2), so you can model a gate whose rejection time differs from its delay.

3. Production-quality RTL — when each model fits

modelling_choices.vhd
Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
-- Modelling a GATE with ~3 ns delay that filters sub-3 ns glitches:
y_gate <= (a and b) after 3 ns;                    -- inertial (default) — realistic gate
 
-- Modelling an interconnect / delay line that must preserve a narrow strobe:
strobe_dl <= transport strobe after 1 ns;          -- transport — keep the pulse intact
 
-- A gate that filters very short spikes but has a longer output delay:
y_filt <= reject 1 ns inertial noisy after 4 ns;   -- reject <1 ns, delay 4 ns

What hardware does this become? Nothing structural — after and its delay model are not synthesizable (lesson 2.13); synthesis drops the delay entirely. These statements live in testbenches, behavioural models, and gate-level/SDF-annotated simulations, where the delay model governs whether modelled glitches propagate.

4. Hardware interpretation — inertia vs pure delay

inertial delay rejecting a narrow pulse versus transport delay passing itdefault 'after''transport after'input: narrow glitchpulse width < delayinertial (gate)rejects pulse < delay →glitch removedtransport (wire)passes all → glitchreproduced, delayed12
The two delay models applied to the same narrow input pulse. Inertial delay (a gate's behaviour) rejects any pulse shorter than the delay, so a sub-delay glitch is filtered out of the output entirely. Transport delay (an ideal wire) reproduces every transition shifted later in time, so the same glitch appears at the output, just delayed. Inertial models the energy/inertia of switching logic; transport models lossless propagation.

5. Simulation interpretation — projecting onto the driver's waveform

Both models are about how a new transaction interacts with ones already pending on the driver's projected waveform (lesson 3.5). Inertial assignment, when it schedules a new value, removes recently-scheduled transactions that would form a too-short pulse; transport simply appends the new transaction, preserving all of them.

simulation timeline for a delayed assignment under inertial versus transportInput change schedules delayed valueInput changeschedules delayed…y <= ... after tApply delay modelinertial: prune sub-limitpulse · transport: keep allDriver projectedwaveform updatedfiltered (inertial) or full(transport)Delay t elapsesreal time advances to thetransactionSignal updatedvalue applied to the netFanout wakesreaders re-evaluate12
The simulation timeline with a delay model. A process schedules a delayed transaction onto the driver's projected waveform. Under inertial, the engine checks whether the new value cancels a pulse shorter than the rejection limit and prunes it; under transport, every transition is kept. After the delay elapses, the (possibly filtered) value is applied to the signal and the fanout wakes — the same driver/delta machinery, with a pulse-filtering step for inertial.

Same 2 ns glitch, 5 ns delay: inertial rejects it, transport reproduces it

8 cycles
Same 2 ns glitch, 5 ns delay: inertial rejects it, transport reproduces itx has a short 2 ns glitch (narrower than the 5 ns delay)x has a short 2 ns gli…transport: the glitch appears, delayed 5 nstransport: the glitch …inertial: the glitch was rejected; only the sustained change passesinertial: the glitch w…x01001111y_inertial00000001y_transport00010011t0t1t2t3t4t5t6t7
x carries a brief glitch followed later by a sustained change. With transport delay, y reproduces BOTH events shifted by 5 ns. With inertial delay, the sub-5 ns glitch is rejected — only the sustained level survives. Choosing inertial vs transport literally decides whether modelled glitches exist on your waveform.

6. Debugging example — the glitch that should (not) be there

Expected: a testbench injects a narrow strobe and the model passes it to the next stage. Observed: the strobe vanishes — the downstream block never sees it. Root cause: the delay was modelled with the default inertial after, whose rejection limit (equal to the delay) swallowed the sub-delay strobe. Fix: model the path as a delay line with transport, or set a small reject limit so legitimate narrow pulses survive. Engineering takeaway: if narrow pulses mysteriously disappear (or unexpectedly appear) in a delay model, the inertial-vs-transport choice is the first thing to check — the default inertial filters anything shorter than the delay.

strobe_disappears.vhd
Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
-- WRONG (for a delay line): default inertial rejects the narrow strobe.
strobe_o <= strobe after 5 ns;             -- a <5 ns strobe is filtered out
-- RIGHT: a wire/delay line preserves the pulse.
strobe_o <= transport strobe after 5 ns;   -- strobe reproduced intact, 5 ns later

7. Common mistakes & what to watch for

  • Forgetting inertial is the default. Plain after filters pulses shorter than the delay; if you need them preserved, say transport.
  • Using transport where you want glitch filtering. Transport passes every spike — wrong for modelling a real gate that should reject them.
  • Confusing rejection limit with delay. They are equal by default but separable via reject t1 inertial … after t2; use it to model gates whose filtering time differs from delay.
  • Expecting either model to synthesize. after and its delay model are simulation-only; synthesis ignores them. Real glitch behaviour comes from actual gate delays post-synthesis.
  • Modelling timing-critical hardware with after instead of clocked logic. Use registers for real timing; reserve delay models for behavioural/gate-level simulation.

8. Engineering insight

Inertial and transport are VHDL's way of letting a behavioural model match physical reality: gates have inertia and filter glitches, wires do not. Defaulting to inertial is deliberate — it matches the common case (modelling logic) and keeps spurious sub-delay glitches out of simulation. Reach for transport only when you are explicitly modelling lossless propagation (a delay line, an interconnect). And keep the whole topic on the simulation side of the line: these delays shape modelled waveforms, never synthesized hardware. Understanding them also sharpens your reading of gate-level/SDF simulations, where inertial rejection explains why some glitches seen in zero-delay RTL never appear in the timing-annotated netlist.

9. Summary

after supports two delay models. Inertial (the default) rejects pulses shorter than the rejection limit (default: the delay), modelling a gate's glitch-filtering inertia; transport reproduces every transition delayed, modelling an ideal wire. The reject clause tunes the rejection limit independently of the delay. Both are simulation constructs that synthesis ignores; the choice decides whether modelled glitches propagate.

10. Learning continuity

You have now seen how a signal's value (multiple drivers) and its timing (inertial/transport) behave in the non-ideal cases. One piece of the signal model remains: what value a signal holds before anything drives it, and how the unknown propagates. The next lesson, Initial Values, U, and Uninitialized Hardware, examines 'U' and 'X' — why real flip-flops power up unknown, why an initializer is a simulation/FPGA convenience rather than an ASIC guarantee, and how to stop unknowns from contaminating a design.