Vivado Synthesis Decision Guide
Based on UG901 (v2025.2). This skill helps choose the right synthesis strategies, options, and attributes. For attribute syntax see REFERENCE.md; for HDL coding templates (RAM/DSP/ROM/SRL/FSM/etc.) see examples/ directory — consult the index table in REFERENCE.md to locate the right file.
synth_design Complete Options
Hierarchy Control
| Option | Values | Default | Effect | |
|---|
-flatten_hierarchy | none/full/rebuilt | rebuilt | none: preserve RTL hierarchy. full: flatten to top only. rebuilt: flatten then rebuild similar hierarchy (best QoR + readability) | |
Timing Optimization
| Option | Values | Default | Effect | |
|---|
-directive | See strategy table below | Default | Selects preconfigured optimization strategy | |
-global_retiming | auto/on/off | auto | Register balancing across combinational logic. Auto = on for Versal, off for others | |
-no_timing_driven | flag | — | Disables timing-driven synthesis (faster, worse timing) | |
Resource Control
| Option | Values | Default | Effect | |
|---|
-max_bram | integer | -1 (max) | Limit Block RAM usage | |
-max_uram | integer | -1 (max) | Limit UltraRAM usage (UltraScale+) | |
-max_dsp | integer | -1 (max) | Limit DSP block usage | |
-shreg_min_size | integer | 3 | Min chain length for SRL inference | |
-srl_style | register/rl/srl_reg/reg_srl/reg_srl_reg | — | Global SRL implementation style | |
-cascade_dsp | auto/tree/force | auto | DSP adder chain implementation | |
-max_bram_cascade_height | integer | -1 | Max BRAM cascade depth | |
-max_uram_cascade_height | integer | -1 | Max UltraRAM cascade depth | |
-no_srlextract | flag | — | Disable all SRL extraction | |
-no_lc | flag | — | Disable LUT combining | |
FSM & Logic
| Option | Values | Default | Effect | |
|---|
-fsm_extraction | auto/one_hot/sequential/gray/johnson/user_encoding/off | auto | FSM encoding strategy | |
-resource_sharing | auto/on/off | auto | Arithmetic operator sharing | |
-keep_equivalent_registers | flag | off | Prevent merging of equivalent registers | |
-control_set_opt_threshold | auto/integer/0 | auto | Fanout threshold for control set optimization. 0 = disable | |
Clock & IO
| Option | Values | Default | Effect | |
|---|
-bufg | integer | 12 | Max global clock buffers to infer | |
-gated_clock_conversion | off/on/auto | off | Convert gated clocks to enables | |
Design Entry
| Option | Values | Default | Effect | |
|---|
-top | module name | — | Top module | |
-part | part number | — | Target FPGA part | |
-constrset | fileset name | — | Constraint fileset to use | |
-include_dirs | paths | — | Verilog include search dirs | |
-generic | name=value | — | Override Verilog parameters / VHDL generics | |
-verilog_define | macro[=text] | — | Define Verilog macros | |
-mode | default/out_of_context | default | OOC mode: no IO buffers | |
Special Modes
| Option | Values | Default | Effect | |
|---|
-rtl | flag | — | Elaborate only, don't synthesize | |
-lint | flag | — | Run RTL Linter only (see section below) | |
-incremental_mode | default/quick/off | default | Incremental synthesis mode | |
-sfcu | flag | — | Single-file compilation unit mode | |
Debug & Performance
| Option | Values | Default | Effect | |
|---|
-debug_log | flag | — | Extra debug info in log | |
-assert | flag | — | Enable VHDL assertions | |
Multi-Threading
tcl
set_param general.maxThreads 8 ;# 1-8 threads for synthesis
Strategy Decision Table
Use `-directive <strategy>` to select:
| Scenario | Strategy | Key Effect | |
|---|
| Default / first try | default | Balanced optimization | |
| Fast iteration / debug | runtimeoptimized | Fewer optimizations, faster runtime | |
| Resource-constrained | AreaOptimized_high | Force ternary adders, includes AreaMapLargeShiftRegToBRAM + AreaMultThresholdDSP | |
| Resource-constrained (moderate) | AreaOptimized_medium | Area-optimized MUX, ternary adders, lower multiplier→DSP threshold | |
| Timing-critical | PerformanceOptimized | Logic level reduction at expense of area | |
| Routing congestion | AlternateRoutability | Less MUXF/CARRY usage for better routability | |
| Minimum area | LogicCompaction | Compact CARRY+LUT into fewer SLICEs (negative timing impact) | |
| DSP-heavy | AreaMultThresholdDSP | Lower threshold for multiplier→DSP inference | |
| Carry-chain issues | FewerCarryChains | Higher threshold to use LUTs instead of carry chains | |
| Large shift registers | AreaMapLargeShiftRegToBRAM | Implement large shift regs in Block RAM | |
Note: Directive values are case-sensitive in v2025.2. Use exactly as shown above.
Synthesis Attributes Quick Reference (by scenario)
Preventing Optimization
| Attribute | Values | Where | When to Use | |
|---|
DONT_TOUCH | TRUE/FALSE | RTL+XDC | Prevent optimization AND preserve through P&R. Strongest protection | |
KEEP | TRUE/FALSE | RTL only | Prevent signal absorption into LUTs. Synthesis-only, NOT forwarded to P&R | |
KEEP_HIERARCHY | TRUE/SOFT/FALSE | RTL+XDC | SOFT (recommended): allow constant propagation. TRUE: block all cross-boundary optimization | |
Resource Inference Control
| Attribute | Values | Where | When to Use | |
|---|
RAM_STYLE | block/distributed/registers/ultra/mixed/auto | RTL+XDC | Force specific RAM implementation | |
ROM_STYLE | block/distributed/ultra | RTL+XDC | Force specific ROM implementation | |
USE_DSP | yes/no/logic/simd | RTL+XDC | Force/prevent DSP block usage. logic=XOR→DSP, simd=SIMD mode | |
SHREG_EXTRACT | yes/no | RTL+XDC | Enable/disable SRL inference | |
SRL_STYLE | register/srl/srl_reg/reg_srl/reg_srl_reg/block | RTL+XDC | Specific SRL implementation | |
RAM_DECOMP | power/area | RTL+XDC | RAM split: power = address decode (saves power), area = smallest | |
CASCADE_HEIGHT | integer (0=disable) | RTL+XDC | BRAM/URAM cascade chain length (UltraScale+ only) | |
RW_ADDR_COLLISION | auto/yes/no | RTL only | Read-write collision handling | |
Timing Optimization
| Attribute | Values | Where | When to Use | |
|---|
RETIMING_FORWARD | integer (0=off) | RTL+XDC | Move register forward through logic | |
RETIMING_BACKWARD | integer (0=off) | RTL+XDC | Move register backward through logic | |
CRITICAL_SIG_OPT | true/false | RTL+XDC | Shannon decomposition on critical feedback loops. Trades area for timing | |
MAX_FANOUT | integer (-1=no limit) | RTL+XDC | Fanout limit → triggers register replication. Best on local signals only | |
Debug
| Attribute | Values | Where | When to Use | |
|---|
MARK_DEBUG | TRUE/FALSE | RTL+XDC | Mark nets for ILA debug probing | |
ASYNC_REG | TRUE/FALSE | RTL+XDC | Mark CDC synchronizer registers | |
FSM
| Attribute | Values | Where | When to Use | |
|---|
FSM_ENCODING | one_hot/sequential/gray/johnson/user_encoding/none | RTL+XDC | Override FSM encoding | |
FSM_SAFE_STATE | auto_safe_state/reset_state/power_on_state/default_state | RTL+XDC | Add invalid state recovery logic | |
IO & Clock
| Attribute | Values | Where | When to Use | |
|---|
IOB | TRUE/FALSE | RTL only | Pack register into IOB | |
IO_BUFFER_TYPE | NONE | RTL only | Disable automatic IO buffer insertion | |
CLOCK_BUFFER_TYPE | BUFG/BUFH/BUFIO/BUFMR/BUFR/none | RTL+XDC | Specify clock buffer type | |
GATED_CLOCK | yes | RTL+XDC | Mark signal as clock for gated clock conversion | |
Enable & Reset
| Attribute | Values | Where | When to Use | |
|---|
DIRECT_ENABLE | yes | RTL+XDC | Force signal to CE pin of register | |
DIRECT_RESET | yes | RTL+XDC | Force signal to reset pin of register | |
EXTRACT_ENABLE | yes/no | RTL+XDC | Control enable extraction to CE pin | |
EXTRACT_RESET | yes/no | RTL+XDC | Control reset extraction (sync reset only) | |
DSP Folding
| Attribute | Values | Where | When to Use | |
|---|
DSP_FOLDING | yes/no | RTL only | Fold two MAC structures into one DSP | |
DSP_FOLDING_FASTCLOCK | yes/no | RTL only | Designate fast clock port for DSP folding | |
Verilog Case Control
| Attribute | Values | Where | When to Use | |
|---|
FULL_CASE | (presence) | RTL only | All case values covered — suppress latch inference | |
PARALLEL_CASE | (presence) | RTL only | Build as parallel if-elsif, no priority | |
Other
| Attribute | Values | Where | When to Use | |
|---|
BLACK_BOX | (presence) | RTL only | Force module to black box | |
TRANSLATE_OFF/ON | comment-based | RTL only | Exclude code from synthesis | |
Block-Level Synthesis (BLOCK_SYNTH)
Apply per-instance synthesis settings via XDC:
tcl
set_property BLOCK_SYNTH.<option> <value> [get_cells <instance>]
| Option | Type | Values | Description | |
|---|
| STRATEGY | STRING | DEFAULT/AREA_OPTIMIZED/ALTERNATE_ROUTABILITY/PERFORMANCE_OPTIMIZED | Per-instance strategy | |
| RETIMING | INT | 0/1 | Enable/disable retiming | |
| ADDER_THRESHOLD | INT | 4-128 | Adder size → CARRY chain threshold | |
| COMPARATOR_THRESHOLD | INT | 4-128 | Comparator size → CARRY chain threshold | |
| SHREG_MIN_SIZE | INT | 3-32 | SRL inference threshold | |
| FSM_EXTRACTION | STRING | OFF/ONE_HOT/SEQUENTIAL/GRAY/JOHNSON/AUTO | FSM encoding | |
| LUT_COMBINING | INT | 0/1 | Enable/disable LUT combining | |
| CONTROL_SET_THRESHOLD | INT | 0-128 | Control set optimization threshold | |
| MAX_LUT_INPUT | INT | 4-6 | 4=no LUT5/6, 5=no LUT6, 6=all | |
| MUXF_MAPPING | INT | 0/1 | Enable/disable MUXF7/F8/F9 | |
| KEEP_EQUIVALENT_REGISTER | INT | 0/1 | Merge or retain equivalent registers | |
| PRESERVE_BOUNDARY | INT | any | Mark hierarchy as changing (for incremental) | |
| LOGIC_COMPACTION | INT | 1 | Compact CARRY+LUT into fewer SLICEs | |
| SRL_STYLE | STRING | REGISTER/SRL/SRL_REG/REG_SRL/REG_SRL_REG | SRL implementation | |
Note: BLOCK_SYNTH hardens the instance hierarchy. Use only where needed.
OOC (Out-of-Context) Synthesis
When to use: Large IP modules, 3rd-party netlists, modules that rarely change.
tcl
# Non-Project Mode
synth_design -top <module> -part <part> -mode out_of_context
# Project Mode: right-click module → Set As Out-of-Context for Synthesis
Key rules:
- OOC modules are synthesized independently, treated as black boxes in top-level synthesis
- No IO buffers are created
- Incremental synthesis is NOT supported for OOC runs
- Do NOT use OOC if module has AMD IP in lower levels
- Do NOT use OOC if module ports use user-defined types
Incremental Synthesis
Detects RTL changes and only re-synthesizes modified sections. Reduces runtime and QoR fluctuation.
tcl
# Project Mode: Settings → Synthesis → Incremental synthesis
# Non-Project Mode:
synth_design -top <top> -part <part> -incremental_mode default
| Mode | Effect | |
|---|
default | Full incremental (detect + selective re-synthesis) | |
quick | Faster, less thorough incremental | |
off | Full re-synthesis | |
Note: Not supported for OOC runs.
RTL Linter
Pre-synthesis code quality check:
tcl
synth_design -lint -top <top> -part <part>
# For OOC runs:
synth_design -lint -srcset [get_property SRCSET [get_runs my_IP_core_synth_1]]