VHDL · Chapter 3.9 · Signals & Hardware Behavior
Signals as the Model of Real Wires
This is the lesson that ties the module together. Every topic so far has been a facet of one idea: a signal is a wire. Declaration gives the net a home in the hierarchy, a driver is the source that puts a value on it, and delta cycles are how the value updates. Resolution settles what happens when two drivers share the net, inertial and transport delays model how a value propagates along it, and initial values model what it carries before anything drives it. Hold all of that as a single picture, a net with a source and update rules, and you can read any RTL by asking two questions: what drives this wire, and when. This capstone also maps the model onto synthesis, showing how a combinational signal becomes a wire and a clocked signal becomes a register's output.
Foundation14 min readVHDLSignalsWiresSynthesisMental ModelRTL
1. Engineering intuition — one model, many facets
A schematic net is dead simple: it is a wire with exactly one source (or, on a bus, a resolved set of sources) and some fanout that reads it. Everything you learned in this module is just that picture made precise for simulation. When you stop thinking of a signal as a software variable and start seeing it as a net with a driver, the whole language clicks: assignments are drivers projecting values, delta cycles are how the net settles, and metalogical values are the net's honest report of contention or power-on uncertainty.
2. Formal explanation — the facets, assembled
A signal is the simulation model of a net, and each earlier lesson defined one facet of it:
signal data : std_logic_vector(7 downto 0) := (others => 'U');
-- 3.3 declaration/scope : 'data' is a net living in this architecture, visible to its readers
-- 3.5 driver : whichever process/concurrent statement assigns 'data' is its source
-- 3.4 delta cycle : an assignment updates 'data' one delta later, then wakes its fanout
-- 3.6 resolution : if two sources drive 'data', a resolution function combines them ('X' on conflict)
-- 3.7 inertial/transport: a delayed assignment's pulse-handling models the wire's propagation
-- 3.8 init / 'U' : 'data' carries its initial value (here 'U') until a driver actsThere is no separate machinery for each bullet — they are all aspects of "a net, sourced by a driver, updated by the engine."
3. Production-quality RTL — combinational net vs registered net
The single most useful distinction the model gives you is combinational wire versus registered net, decided entirely by where the driver lives:
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all;
-- Combinational signal: a WIRE driven by logic, recomputed whenever inputs change.
sum <= std_logic_vector(unsigned(a) + unsigned(b)); -- a net = an adder's output wire
-- Registered signal: the net is a FLIP-FLOP output, updated only on the clock edge.
process (clk)
begin
if rising_edge(clk) then
acc <= acc + unsigned(a); -- 'acc' is a register's output net
end if;
end process;What hardware does this become? sum is the output wire of a combinational adder; acc is the
output net of an 8-bit register fed by an adder. Same signal abstraction, two structures —
distinguished only by whether the driving statement is combinational or clocked.
4. Hardware interpretation — signals map straight to nets
5. Simulation interpretation — the net's life in one timeline
The event-driven engine (lesson 3.4) plays out the same story for every net: it exists from elaboration with an initial value, takes new values from its driver via delta updates, and wakes its fanout each time it changes.
A net's life: starts 'U', a driver defines it, then it tracks its source
8 cycles6. Debugging example — debugging by thinking in wires
Expected: a net carries the right value. Observed: it is wrong, stale, or 'X'. Method:
treat the signal as a wire and ask the two questions. What drives it? — find the single driving
statement (or, if several, you have an unintended multi-driver, lesson 3.6). When does that driver
update? — combinational (any input change) or clocked (only on the edge); a stale value usually
means the driver did not run (sensitivity list, lesson 3.5) or you expected combinational behaviour
from a registered net. Fix follows from the answer. Engineering takeaway: nearly every
signal bug resolves to "wrong driver" or "driver updated at the wrong time" — the wire model turns
vague symptoms into those two precise questions.
-- Symptom: 'flag' never changes. Wire questions:
-- What drives it? -> this process is its only driver. Good, single source.
-- When does it update? -> process(en) — only wakes on 'en', not on 'cond'.
-- Root cause: 'cond' changes are ignored; driver never re-runs for them.
process (en) begin -- WRONG sensitivity
flag <= en and cond;
end process;
process (en, cond) begin -- FIX: driver re-runs on every input
flag <= en and cond;
end process;7. Common mistakes & what to watch for
- Thinking of signals as software variables. They are nets with drivers; their update is scheduled, not immediate, and their value is whatever a driver projects.
- Ignoring "what drives this." Every net needs a source; an undriven net sits at
'U', and a doubly-driven net resolves (often to'X'). - Confusing combinational and registered nets. The driver's context (clocked or not) decides; expecting a registered net to react combinationally is a classic error.
- Forgetting the engine is event-driven. A net changes only when its driver runs and schedules a new value — not "continuously" in the software sense.
- Treating
'X'/'U'as noise. They are the net's honest report of conflict or uninitialised state; trace them, do not mask them.
8. Engineering insight
The signal-as-wire model is the single most valuable abstraction in RTL design because it makes reading and writing hardware the same activity. Writing RTL is declaring nets and the drivers that source them; synthesis is making those nets and sources physical (wires, gates, registers, buses); debugging is asking what drives a net and when. Once this model is automatic, the rest of VHDL — processes, combinational and sequential logic, FSMs — is just ways to build drivers for nets you have already learned to reason about.
9. Summary
A signal is the simulation model of a real wire: declaration gives it a home, a driver sources it,
delta cycles update it, resolution settles multiple drivers, delay models propagation, and
'U'/initial values model its power-on state. In synthesis a combinational driver makes the net a
wire and a clocked driver makes it a register output. Read any RTL by asking what drives each net
and when it updates.
10. Learning continuity
You can now reason about a single net and its driver completely. Real designs are many nets and drivers, all alive at once — which is the defining property of hardware and the subject of the next module. The Concurrent Execution Model shows how every statement in an architecture runs in parallel, event-driven, exactly like the always-active gates these wires connect — turning the single-wire model you just mastered into a full, concurrently-evaluated design.