VHDL · Chapter 16.9 · Synthesis and RTL Implementation
VHDL-2008 for Synthesis
The VHDL-2008 standard adds features that make synthesizable RTL cleaner and safer. The headline feature is process(all), automatic complete sensitivity that eliminates the missed-signal latch and mismatch bug entirely. Beyond it are unconstrained record and array elements for more flexible reuse, unary reduction operators that and or or a whole vector in one token, the matching case for clean don't-care selection, simplified packages and context clauses that bundle use clauses, and built-in string and hex conversion functions. Most of these are synthesizable and remove boilerplate or whole classes of bug, with the main caveat being that tool support varies, so VHDL-2008 must be enabled. This lesson surveys the practical 2008 features for RTL, shows which are synthesizable, and explains why turning the standard on is worthwhile.
Foundation14 min readVHDLVHDL-2008Synthesisprocess(all)RTLLanguage
1. Engineering intuition — the language got safer; use it
A lot of classic VHDL bugs are really language friction — a sensitivity list you had to maintain by hand, a
std_logic_unsigned workaround, boilerplate use clauses repeated everywhere. VHDL-2008 files most of that
friction away, and crucially it does so for synthesizable code, not just simulation. The single biggest win is
process(all): the simulator now reads exactly the signals the gates depend on, so the incomplete-sensitivity
latch/mismatch bug simply cannot happen. The mindset is straightforward — if your tools support it (and modern
ones largely do), enable VHDL-2008 and let the language remove whole categories of mistake and boilerplate,
rather than coding defensively around a 1990s standard.
2. Formal explanation — the practical 2008 features for RTL
-- process(all): AUTOMATIC complete sensitivity → no missed-signal latch / sim-synth mismatch (16.3/15.5).
process (all) begin
y <= '0';
if sel = '1' then y <= a; end if; -- sensitivity is exactly the read signals, always
end process;
-- UNARY REDUCTION operators: and/or/xor of a whole vector in one token.
all_ones <= and v; -- '1' iff every bit of v is '1' (was: a loop / and_reduce)
any_set <= or v;
-- MATCHING case? : '-' is a true DON'T-CARE in selection (clean priority/decode).
case? opcode is
when "1---" => op <= JUMP; -- top bit set, rest don't-care
when "01--" => op <= BRANCH;
when others => op <= NOP;
end case?;
-- UNCONSTRAINED record elements + arrays of unconstrained (more flexible reuse, 13.3).
-- GENERIC packages/types (12.5); CONTEXT clauses bundle common 'use' clauses.
-- Built-in to_string / to_hstring; std_logic textio folded into std_logic_1164 (no separate package).Key synthesizable 2008 features: process(all) (automatic complete sensitivity), unary reduction
(and/or/xor of a vector), matching case? (don't-care selection), unconstrained record/array
elements, generic packages/types, context clauses, and built-in to_string/to_hstring with
std_logic textio in std_logic_1164.
3. Production usage — cleaner, safer RTL with 2008
-- 1990s style: hand-maintained sensitivity + helper functions + extra packages.
-- process (sel, a, b) ... -- forget a signal → latch/mismatch
-- all_ones <= and_reduce(v); -- helper function
-- use ieee.std_logic_textio.all; -- separate package for std_logic line I/O
-- VHDL-2008: the same intent, less boilerplate, fewer bug surfaces.
process (all) begin -- can't forget a signal
y <= (others => '0');
case? mode is
when "1--" => y <= a; -- don't-care matching, no manual masking
when others => y <= b;
end case?;
end process;
all_ones <= and v; -- built-in reduction
-- to_hstring(x) for messages; std_logic textio already in std_logic_1164.What hardware does this become? The same hardware as the equivalent 1993 code — these features are mostly
language ergonomics, not new primitives. process(all) builds the identical combinational logic but guarantees
the simulator matches it (killing the latch/mismatch class of bug); and v synthesizes to the same wide-AND as a
reduction loop; case? to the same decode as masked comparisons. The value is fewer bug surfaces and less
boilerplate for an equivalent netlist. The one real caveat is tool support: VHDL-2008 must be enabled in
the compiler/synthesizer, and a few features have uneven support — but the core RTL ones (process(all), reduction,
case?) are widely available.
4. Structural interpretation — 2008 features feeding cleaner synthesis
5. Why this is structural, not timing
The VHDL-2008 features are language ergonomics — better ways to express the same hardware — so the
feature/structure diagram above is the right picture, not a waveform. They do not change run-time behavior (the
netlist is equivalent); they change how safely and concisely you write it, and in the case of process(all),
they guarantee sim/synth agreement that you previously had to maintain by hand. The benefit is a design-time,
structural property of the code — fewer bug surfaces, less boilerplate — not a new signal behavior.
6. Debugging example — 2008 syntax without enabling 2008 (or assuming full support)
Expected: process(all), case?, and reduction operators compile and synthesize. Observed: the tool
rejects the syntax (process(all) not recognized, case? a parse error), or a 2008 feature compiles in
simulation but the synthesizer does not support it. Root cause: the project was set to an older VHDL
revision (1993/2002), so 2008 syntax is invalid; or a less-common 2008 feature was used that the chosen
synthesis tool does not implement. Fix: enable VHDL-2008 in the compiler and synthesizer settings, and
stick to the widely-supported synthesizable 2008 features (process(all), reduction operators, case?) for
RTL, checking tool support before relying on the more exotic ones. Engineering takeaway: 2008 features need the
standard enabled and have uneven tool support — turn on VHDL-2008 and prefer the well-supported RTL
features; verify support before depending on the rest.
-- BUG: process(all) / case? rejected because the project compiles as VHDL-93.
-- FIX: set the language standard to VHDL-2008 in compiler + synthesis settings;
-- use the widely-supported features (process(all), and/or reduction, case?) for RTL.7. Common mistakes & what to watch for
- Not enabling VHDL-2008. 2008 syntax fails under older revisions; set the standard in both compiler and synthesizer.
- Assuming uniform tool support. Support varies; prefer well-supported RTL features (
process(all), reduction,case?) and verify the rest. - Mixing standards inconsistently. Keep a project on a consistent revision; mixing can cause confusing errors.
- Overlooking
process(all). It eliminates the missed-sensitivity latch/mismatch bug — adopt it as the default for combinational processes. - Forgetting folded packages. In 2008,
std_logictextioandto_hstringare instd_logic_1164; you may not need the separatestd_logic_textio.
8. Engineering insight & continuity
VHDL-2008 makes synthesizable RTL cleaner and safer for equivalent hardware: process(all) removes the
missed-sensitivity latch/mismatch bug, unary reduction and case? cut helper functions and masking, and generic
packages, context clauses, and built-in string conversions reduce boilerplate — with the caveat that the standard
must be enabled and tool support varies. Adopting the well-supported features is low-risk, high-reward. This
completes Module 16: Synthesis and RTL Implementation and the entire Advanced group (Modules 12–16): you
can now parameterize, structure data, verify, debug, and synthesize RTL with full understanding of the path from
code to gates. The curriculum advances to the Expert track, beginning with Module 17 — FPGA-Oriented VHDL
Design: mapping RTL onto real FPGA architecture — block RAM, DSP, clocking, and clock-domain crossing.