VLSI · Front-End Design · Stages 01–04

Logic Synthesis

This page covers the front end of the VLSI design flow — the four stages that turn an idea into a verified, technology-mapped gate-level netlist ready for physical design: 01 Specification, 02 RTL Design, 03 Functional Verification, and 04 Logic Synthesis. Each stage below goes into the methodology, typical inputs/outputs, and common pitfalls, with a diagram to make the flow concrete. Two deep-dive subtopics — standard cell library selection and advanced synthesis techniques — are covered on their own pages, linked below.

01 Specification Define requirements ↓ jump to section 02 RTL Design Verilog / VHDL ↓ jump to section 03 Functional Verification Simulate & check ↓ jump to section 04 Logic Synthesis RTL → netlist ↓ jump to section

Click any stage to jump straight to its section below.

Stage 01 of 04

Specification

Specification is the first and most consequential stage in the VLSI design flow: it defines what the chip is supposed to do before any architecture or RTL work begins. A complete specification covers functional requirements, performance targets (speed, throughput, latency), a power budget, area/cost targets, the target process node/foundry, and memory and I/O requirements. Every later stage — RTL, verification, synthesis, physical design — is ultimately judged against this document, which is why ambiguity or missing requirements here are the most expensive kind of mistake to make: a gap discovered after RTL is written costs far more to fix than a gap caught on paper.

⤢ Click to zoom Specification refines from broad intent to concrete implementation Product / Market Requirements Architecture Spec Microarchitecture Spec RTL Implementation → Stage 02 what & why how, in code

Each layer narrows the previous one: product requirements say what the chip must achieve; the architecture spec decides the technical approach; the microarchitecture spec defines components, datapaths, and control logic; RTL is the first stage where any of this becomes actual code.

What a complete spec covers

DocumentDefines
Product / market requirementsTarget application, competitive positioning, high-level functional and cost goals
Architecture specThe technical approach chosen to meet those goals — instruction set, bus protocols, memory hierarchy, major functional blocks
Microarchitecture specInternal structure of each block: datapaths, control logic, pipeline stages, and how modules interact — this is the document RTL engineers actually implement against
Design / IP specPer-block interface definitions, register maps, timing requirements, and verification requirements for individual RTL units

Best practices & pitfalls

The further a requirements gap travels before it's caught, the more it costs to fix — a change that's a text edit at the spec stage can mean re-writing RTL, re-running verification, and re-synthesizing if it's caught after logic synthesis. Specs should be unambiguous enough that two independent engineers implementing against them would produce interoperable results, and should explicitly separate "must have" requirements from "nice to have" ones so trade-offs during implementation have a clear priority order.

Stage 02 of 04

RTL Design

Register-Transfer Level (RTL) design describes a synchronous digital circuit's behavior in terms of how data moves between hardware registers each clock cycle, and what logic operates on it in transit — without describing the transistor-level implementation of that logic. It's written in a hardware description language (Verilog, VHDL, or SystemVerilog) and is synthesizable: an RTL description can be mechanically converted into a gate-level netlist by the tools in Stage 04.

⤢ Click to zoom RTL describes what moves between registers, and when REG A D flip-flops Combinational Logic assign / always_comb REG B D flip-flops clk both registers sample on the same clock edge

The core RTL idea: on every active clock edge, REG B captures the combinational function of REG A's previous value. RTL code describes exactly this — what moves between registers and when — leaving the gate-level "how" to logic synthesis.

Coding guidelines that matter for synthesizable RTL

GuidelineWhy it matters
Non-blocking assignment (<=) for sequential logicEvaluates all right-hand sides first, then updates all left-hand sides at the end of the time step — models real flip-flop behavior correctly and avoids simulation/synthesis mismatches
Synchronous reset preferred for ASICSampled on the clock edge like any other data path, so static timing analysis can check it normally; asynchronous resets need extra reset-recovery/removal timing checks and dedicated reset-tree handling
Complete combinational sensitivity / assignmentsAn incomplete if/case statement in combinational logic infers an unintended latch instead of the intended pure logic — a classic and hard-to-spot bug
One clear clocking scheme per blockMixing clock edges or clock domains inside a single always block makes both synthesis and timing closure far harder; cross-domain signals need explicit synchronizers
Parameterize widths and depthsMakes the same RTL block reusable across configurations without hand-editing bit widths, reducing copy-paste bugs

Best practices & pitfalls

RTL sits in the middle of the design abstraction stack — more concrete than a behavioral/architectural model, more abstract than a gate netlist — and the whole point of writing good RTL is that it should simulate correctly and synthesize into exactly the hardware the designer intended, with no surprises. Static lint checks (Stage 03) catch most of the classic mistakes above automatically and should run continuously during RTL development, not just once at the end.

Stage 03 of 04

Functional Verification

Functional verification confirms that the RTL actually implements the specification's intended behavior before it's committed to synthesis and physical design — and it's routinely the most resource-intensive phase of modern chip development, often consuming more engineering effort than RTL design itself. Two broad methodologies are used together: simulation-based (dynamic) verification, which exercises the RTL with stimulus and checks the results, and formal verification (static), which mathematically proves properties about the RTL without needing any stimulus at all.

⤢ Click to zoom A typical (UVM-style) simulation testbench Sequencer Driver DUT Monitor Coverage Scoreboard Reference Model predicts expected output compares actual vs. expected Formal verification runs in parallel: proves properties (SVA) directly against the RTL — no stimulus, driver, or monitor required

Stimulus flows in from the left (sequencer → driver → DUT); results flow out to the right (DUT → monitor → scoreboard / coverage). The scoreboard checks DUT output against a reference model; the coverage collector tracks how much of the intended behavior has actually been exercised.

Verification techniques

TechniqueWhat it does
Constrained-random verification (CRV)Generates randomized-but-legal stimulus to reach scenarios a human wouldn't think to write directed tests for
Coverage-driven verification (CDV)Uses functional coverage (covergroups) and code coverage (line/toggle/branch/FSM) to measure what's actually been exercised, closing the loop between "tests ran" and "behavior was verified"
SystemVerilog Assertions (SVA)Checks temporal properties ("if A happens, B must follow within N cycles") continuously during simulation, catching bugs far closer to their root cause than a scoreboard mismatch would
Formal / property checkingMathematically proves (or disproves) a property against all possible input sequences — no vectors needed — strongest for control logic, protocol compliance, and hard-to-reach corner cases
LintingStatic analysis of the RTL itself (before simulation) catching unintended latches, incomplete case statements, and other structural issues early and cheaply
CDC / RDC checksClock-domain-crossing and reset-domain-crossing analysis catch synchronization bugs that are typically invisible to ordinary functional simulation

Best practices & pitfalls

Coverage closure is a loop, not a milestone: run tests, measure coverage, analyze the holes, add or adjust tests or constraints, and repeat until both code and functional coverage reach their sign-off targets (with any waivers explicitly justified). Formal and simulation are complementary, not competing — formal is exhaustive but works best on bounded, control-heavy logic, while simulation scales to full-chip, data-heavy scenarios formal can't practically cover.

Stage 04 of 04

Logic Synthesis

Logic synthesis translates verified RTL into a gate-level netlist built from real cells in a target standard-cell library, optimized for power, performance, and area (PPA) under the constraints the designer provides. A single RTL design can map to many functionally equivalent but structurally different netlists, each with different PPA characteristics — the constraints given to the synthesis tool are what steer it toward the netlist that's actually wanted, which is why an incomplete or wrong constraint set is one of the most common sources of a bad synthesis result.

RTL (verified) SDC constraints Technology library Translate & Optimize technology-independent generic gates (GTECH) Technology Mapping map generic gates to real standard cells in the library Post-Mapping Optimization timing-driven sizing/buffering, area recovery Gate-Level Netlist → Physical Design (Stage 05 of the VLSI flow)

Click a labeled box to open its page or section. Synthesis flows through translation into generic technology-independent gates, mapping onto the actual standard-cell library, and a final timing-driven optimization pass — all steered by the SDC constraints supplied alongside the RTL.

Common SDC constraint types

ConstraintPurpose
create_clockDefines a clock's period and waveform — the single most important constraint, since nearly everything else is measured relative to it
set_input_delay / set_output_delayModels the timing budget consumed outside the block being synthesized, at its inputs and outputs
set_max_transition / set_max_capacitanceBounds signal slew and load so the mapped gates stay within the cell library's characterized operating range
set_false_pathTells the tool a timing path is functionally never exercised, so it isn't wastefully optimized
set_multicycle_pathTells the tool a path is allowed more than one clock cycle to settle, relaxing an otherwise-unreachable timing requirement
set_case_analysisFixes a signal to a constant value for optimization purposes, letting the tool simplify logic that's only reachable in one configuration

Best practices & pitfalls

Unconstrained paths are the classic synthesis trap: if a path isn't covered by any timing constraint, the tool has no reason to optimize it at all, and it can silently become the worst path in the design without ever showing up as a violation. Over-constraining has the opposite problem — asking for more margin than actually needed burns area and power chasing a target that was never real. Because synthesis and static timing analysis use closely related but not identical timing engines, correlating synthesis-reported timing against a signoff STA run early is standard practice rather than waiting until physical design to find a mismatch.

Where this leads next: the gate-level netlist from this stage feeds directly into physical design — floorplanning, the power delivery network, placement, clock-tree synthesis, and routing — covered on the VLSI design flow page, with power-specific signoff detailed under Power Integrity and EMIR Analysis.
Deep Dives

Subtopics

Two topics from Stage 04 are big enough to warrant their own pages.

Sources

General industry research — this page is not sourced from vendor-specific internal documentation.

Sources for the standard cell library and advanced synthesis technique subtopics are listed on their own pages: Standard Cell Library Selection and Advanced Synthesis Techniques & Corner Cases.