Inside the Synthesizer — 4 Phases
Elaboration — Building the Design Database
Read RTL Files
Tool reads all Verilog/VHDL files. Syntax and semantic checks run. Module definitions are registered in the tool database.
Elaborate Hierarchy
Top module is elaborated. Parameters are resolved (e.g., WIDTH=8). Generate loops are expanded. Each sub-module instance is linked to its definition.
Infer Flip-Flops & Latches
The tool recognizes sequential always blocks and infers DFFs, scan-FFs, or latches. Clock enable, reset polarity, and set/reset priority are determined from the RTL.
Build GTECH Network
RTL operators (+, *, >>, ?:) are mapped to GTECH primitives (GTECH_AND, GTECH_OR, GTECH_DFF, GTECH_MUX). This tech-independent network is then optimized.
## Design Compiler — Read & Elaborate set_app_var link_library "* my_stdcell.db" set_app_var target_library "my_stdcell.db" analyze -format verilog {top.v alu.v regfile.v} elaborate TOP -parameters "WIDTH=32" link check_design ## look for undriven nets, multiple drivers
## Cadence Genus — Read & Elaborate read_libs "my_stdcell.lib" read_hdl {top.v alu.v regfile.v} elaborate check_design -all
Generic Logic Optimization (GTECH)
Before touching any library cells, the tool optimizes the Boolean network in a technology-independent space. This produces a minimal logic structure that the tech mapper can then efficiently implement.
| Technique | What It Does | Effect |
|---|---|---|
| Boolean Simplification | Applies Karnaugh/Quine-McCluskey / BDD-based minimization to reduce logic cones | ↓ gate count, ↓ delay |
| Constant Propagation | Evaluates logic with tied-high/low signals at compile time and removes dead logic | ↓ area, removes X-propagation |
| Don't-Care Optimization | Uses unreachable states (SDC false paths) as don't-cares to simplify logic | ↓ area, ↓ power |
| Common Sub-expression | Identifies shared logic cones and merges them to share gates | ↓ area |
| Redundancy Removal | Removes redundant logic that doesn't affect observable outputs | ↓ area |
| Retiming | Moves flip-flops across combinational logic to balance pipeline stage delays | ↑ Fmax, balanced paths |
Technology Mapping — GTECH → Standard Cells
| Synthesis Output | File Format | Used By | Contains |
|---|---|---|---|
| Gate-Level Netlist | .v (Verilog) | P&R (Innovus/ICC2) | Instantiated std-cell connections |
| Timing Constraints | .sdc | P&R, STA | Clocks, I/O delays, false paths |
| Standard Delay Format | .sdf | Gate-level simulation | Cell & wire delays for sim |
| Timing Report | .rpt | Engineer review | WNS, TNS, critical paths |
| Area Report | .rpt | Engineer review | Cell count, total area (µm²) |
| Power Report | .rpt | Engineer review | Dynamic + leakage (µW/mW) |
Design Compiler Compile Strategies
| Command | Effort | Runtime | When to Use |
|---|---|---|---|
compile | Medium | Fast | Early exploration, quick QoR check |
compile -inc | Medium | Fast | Incremental fixes after ECO changes |
compile_ultra | High | Slow | Final signoff synthesis, max timing QoR |
compile_ultra -retime | Highest | Slowest | Sequential optimization — move FFs across combo |
compile -map_effort medium | Controlled | Medium | Balance runtime vs QoR in large designs |
## Typical DC synthesis script source constraints.sdc # apply timing constraints compile_ultra -no_autoungroup # preserve hierarchy for P&R ## Reports report_timing -max_paths 10 report_area report_power report_constraint -all_violators # DRC: fanout, transition violations ## Write outputs write -format verilog -hierarchy -output netlist.v write_sdc top.sdc write_sdf top.sdf
## Cadence Genus — equivalent flow read_libs "stdcell_tt.lib" read_hdl {top.v sub.v} elaborate read_sdc "constraints.sdc" syn_gen # generic synthesis syn_map # technology mapping syn_opt # timing optimization report_timing write_hdl netlist.v write_sdc top.sdc
Common RTL Issues That Hurt Synthesis
| Issue | Symptom in Synthesis | Fix |
|---|---|---|
| Combinational feedback / loops | Unreachable states, infinite loops, warning: combinational loop | Add registered stage or synchronous reset to break feedback |
| Unintended latches | Latch inferred from incomplete case/if — holds value, causes timing issues | Use default assignments at top of always block; use case with default |
| Multiple drivers | Multi-driver error on a net — undefined logic value | Ensure only one always block drives each net; use tri-state with enable |
| Very wide datapaths | 64b multipliers infer huge cells; long critical paths | Pipeline multiplier stages; use DesignWare components (dw_mult) |
| Gated clocks in RTL | Clock gating inferred incorrectly; DFT problems | Use ICG (Integrated Clock Gating) cells; set dont_touch on clock gates |
| Asynchronous resets across hierarchy | Reset trees inferred differently at each level | Use synchronous resets or dedicated reset synchronizer modules |