| name | vivado-synth |
| description | 当用户需要 Vivado 综合策略选择、综合属性配置、synth_design 选项调优、资源推断控制(RAM/DSP/SRL/BRAM)、层次结构优化(flatten_hierarchy、KEEP_HIERARCHY)、OOC(离屏)综合、增量综合、RTL linting、块级综合(BLOCK_SYNTH)或任何综合优化决策时使用此技能。当用户提及综合策略、综合指令、综合属性、资源映射控制、FSM 编码、重定时或询问如何优化综合结果以获得更好的面积/时序/功耗时触发。此技能提供决策知识——如需执行 TCL 命令,请使用 vivado-tcl 技能。 |
Vivado 综合决策指南
基于 UG901(v2025.2)。此技能帮助选择正确的综合策略、选项和属性。属性语法请参阅 REFERENCE.md;HDL 编码模板(RAM/DSP/ROM/SRL/FSM 等)请参阅 examples/ 目录——请参阅 REFERENCE.md 中的索引表来定位正确的文件。
synth_design 完整选项
层次结构控制
| 选项 | 值 | 默认值 | 效果 |
|---|
-flatten_hierarchy | none/full/rebuilt | rebuilt | none:保留 RTL 层次结构。full:仅展平到顶层。rebuilt:展平后重建相似层次结构(最佳 QoR + 可读性) |
时序优化
| 选项 | 值 | 默认值 | 效果 |
|---|
-directive | 见下方策略表 | Default | 选择预配置的优化策略 |
-global_retiming | auto/on/off | auto | 跨组合逻辑的寄存器平衡。Auto = Versal 开启,其他关闭 |
-no_timing_driven | 标志 | — | 禁用时序驱动的综合(更快,但时序更差) |
资源控制
| 选项 | 值 | 默认值 | 效果 |
|---|
-max_bram | 整数 | -1(最大) | 限制 Block RAM 使用 |
-max_uram | 整数 | -1(最大) | 限制 UltraRAM 使用(UltraScale+) |
-max_dsp | 整数 | -1(最大) | 限制 DSP 块使用 |
-shreg_min_size | 整数 | 3 | SRL 推断的最小链长度 |
-srl_style | register/rl/srl_reg/reg_srl/reg_srl_reg | — | 全局 SRL 实现风格 |
-cascade_dsp | auto/tree/force | auto | DSP 加法器链实现 |
-max_bram_cascade_height | 整数 | -1 | 最大 BRAM 级联深度 |
-max_uram_cascade_height | 整数 | -1 | 最大 UltraRAM 级联深度 |
-no_srlextract | 标志 | — | 禁用所有 SRL 提取 |
-no_lc | 标志 | — | 禁用 LUT 组合 |
FSM 与逻辑
| 选项 | 值 | 默认值 | 效果 |
|---|
-fsm_extraction | auto/one_hot/sequential/gray/johnson/user_encoding/off | auto | FSM 编码策略 |
-resource_sharing | auto/on/off | auto | 算术运算符共享 |
-keep_equivalent_registers | 标志 | off | 防止等效寄存器合并 |
-control_set_opt_threshold | auto/整数/0 | auto | 控制集优化的扇出阈值。0 = 禁用 |
时钟与 IO
| 选项 | 值 | 默认值 | 效果 |
|---|
-bufg | 整数 | 12 | 最大全局时钟缓冲器推断数量 |
-gated_clock_conversion | off/on/auto | off | 将门控时钟转换为使能 |
设计入口
| 选项 | 值 | 默认值 | 效果 |
|---|
-top | 模块名称 | — | 顶层模块 |
-part | 器件型号 | — | 目标 FPGA 器件 |
-constrset | 文件集名称 | — | 要使用的约束文件集 |
-include_dirs | 路径 | — | Verilog include 搜索目录 |
-generic | name=value | — | 覆盖 Verilog 参数 / VHDL 通用参数 |
-verilog_define | macro[=text] | — | 定义 Verilog 宏 |
-mode | default/out_of_context | default | OOC 模式:无 IO 缓冲器 |
特殊模式
| 选项 | 值 | 默认值 | 效果 |
|---|
-rtl | 标志 | — | 仅 elaboration,不综合 |
-lint | 标志 | — | 仅运行 RTL Linter(见下方部分) |
-incremental_mode | default/quick/off | default | 增量综合模式 |
-sfcu | 标志 | — | 单文件编译单元模式 |
调试与性能
| 选项 | 值 | 默认值 | 效果 |
|---|
-debug_log | 标志 | — | 日志中的额外调试信息 |
-assert | 标志 | — | 启用 VHDL 断言 |
多线程
set_param general.maxThreads 8 ;# 1-8 个线程用于综合
策略决策表
使用 -directive <strategy> 选择:
| 场景 | 策略 | 关键效果 |
|---|
| 默认/首次尝试 | default | 平衡优化 |
| 快速迭代/调试 | runtimeoptimized | 更少优化,更快运行 |
| 资源受限 | AreaOptimized_high | 强制三元加法器,包括 AreaMapLargeShiftRegToBRAM + AreaMultThresholdDSP |
| 资源受限(中等) | AreaOptimized_medium | 面积优化的 MUX,三元加法器,更低的乘法器→DSP 阈值 |
| 时序关键 | PerformanceOptimized | 以面积为代价减少逻辑层级 |
| 布线拥塞 | AlternateRoutability | 更少使用 MUXF/CARRY 以提高可布线性 |
| 最小面积 | LogicCompaction | 将 CARRY+LUT 压缩到更少的 SLICE(负时序影响) |
| DSP 密集 | AreaMultThresholdDSP | 更低的乘法器→DSP 推断阈值 |
| 进位链问题 | FewerCarryChains | 更高阈值,使用 LUT 代替进位链 |
| 大型移位寄存器 | AreaMapLargeShiftRegToBRAM | 在 Block RAM 中实现大型移位寄存器 |
注意: 策略值在 v2025.2 中区分大小写。请严格按照上述使用。
综合属性快速参考(按场景)
防止优化
| 属性 | 值 | 位置 | 何时使用 |
|---|
DONT_TOUCH | TRUE/FALSE | RTL+XDC | 防止优化并保持到 P&R。最强保护 |
KEEP | TRUE/FALSE | RTL 仅 | 防止信号吸收到 LUT。仅综合,不转发到 P&R |
KEEP_HIERARCHY | TRUE/SOFT/FALSE | RTL+XDC | SOFT(推荐):允许常量传播。TRUE:阻止所有跨边界优化 |
资源推断控制
| 属性 | 值 | 位置 | 何时使用 |
|---|
RAM_STYLE | block/distributed/registers/ultra/mixed/auto | RTL+XDC | 强制特定 RAM 实现 |
ROM_STYLE | block/distributed/ultra | RTL+XDC | 强制特定 ROM 实现 |
USE_DSP | yes/no/logic/simd | RTL+XDC | 强制/防止 DSP 块使用。logic=XOR→DSP,simd=SIMD 模式 |
SHREG_EXTRACT | yes/no | RTL+XDC | 启用/禁用 SRL 推断 |
SRL_STYLE | register/srl/srl_reg/reg_srl/reg_srl_reg/block | RTL+XDC | 特定 SRL 实现 |
RAM_DECOMP | power/area | RTL+XDC | RAM 拆分:power = 地址解码(省电),area = 最小 |
CASCADE_HEIGHT | 整数(0=禁用) | RTL+XDC | BRAM/URAM 级联链长度(仅 UltraScale+) |
RW_ADDR_COLLISION | auto/yes/no | RTL 仅 | 读写冲突处理 |
时序优化
| 属性 | 值 | 位置 | 何时使用 |
|---|
RETIMING_FORWARD | 整数(0=关闭) | RTL+XDC | 通过逻辑向前移动寄存器 |
RETIMING_BACKWARD | 整数(0=关闭) | RTL+XDC | 通过逻辑向后移动寄存器 |
CRITICAL_SIG_OPT | true/false | RTL+XDC | 关键反馈环上的 Shannon 分解。以面积换时序 |
MAX_FANOUT | 整数(-1=无限制) | RTL+XDC | 扇出限制 → 触发寄存器复制。仅推荐用于本地信号 |
调试
| 属性 | 值 | 位置 | 何时使用 |
|---|
MARK_DEBUG | TRUE/FALSE | RTL+XDC | 标记网络用于 ILA 调试探针 |
ASYNC_REG | TRUE/FALSE | RTL+XDC | 标记 CDC 同步器寄存器 |
FSM
| 属性 | 值 | 位置 | 何时使用 |
|---|
FSM_ENCODING | one_hot/sequential/gray/johnson/user_encoding/none | RTL+XDC | 覆盖 FSM 编码 |
FSM_SAFE_STATE | auto_safe_state/reset_state/power_on_state/default_state | RTL+XDC | 添加无效状态恢复逻辑 |
IO 与时钟
| 属性 | 值 | 位置 | 何时使用 |
|---|
IOB | TRUE/FALSE | RTL 仅 | 将寄存器打包到 IOB |
IO_BUFFER_TYPE | NONE | RTL 仅 | 禁用自动 IO 缓冲器插入 |
CLOCK_BUFFER_TYPE | BUFG/BUFH/BUFIO/BUFMR/BUFR/none | RTL+XDC | 指定时钟缓冲器类型 |
GATED_CLOCK | yes | RTL+XDC | 将信号标记为门控时钟以进行转换 |
使能与复位
| 属性 | 值 | 位置 | 何时使用 |
|---|
DIRECT_ENABLE | yes | RTL+XDC | 强制信号到寄存器 CE 引脚 |
DIRECT_RESET | yes | RTL+XDC | 强制信号到寄存器复位引脚 |
EXTRACT_ENABLE | yes/no | RTL+XDC | 控制使能提取到 CE 引脚 |
EXTRACT_RESET | yes/no | RTL+XDC | 控制复位提取(仅同步复位) |
DSP 折叠
| 属性 | 值 | 位置 | 何时使用 |
|---|
DSP_FOLDING | yes/no | RTL 仅 | 将两个 MAC 结构折叠到一个 DSP |
DSP_FOLDING_FASTCLOCK | yes/no | RTL 仅 | 指定 DSP 折叠的快速时钟端口 |
Verilog Case 控制
| 属性 | 值 | 位置 | 何时使用 |
|---|
FULL_CASE | (存在性) | RTL 仅 | 所有 case 值已覆盖 — 抑制锁存器推断 |
PARALLEL_CASE | (存在性) | RTL 仅 | 构建为并行 if-elsif,无优先级 |
其他
| 属性 | 值 | 位置 | 何时使用 |
|---|
BLACK_BOX | (存在性) | RTL 仅 | 强制模块为黑盒 |
TRANSLATE_OFF/ON | 基于注释 | RTL 仅 | 从综合中排除代码 |
块级综合(BLOCK_SYNTH)
通过 XDC 对每个实例应用综合设置:
set_property BLOCK_SYNTH.<option> <value> [get_cells <instance>]
| 选项 | 类型 | 值 | 描述 |
|---|
| STRATEGY | 字符串 | DEFAULT/AREA_OPTIMIZED/ALTERNATE_ROUTABILITY/PERFORMANCE_OPTIMIZED | 每个实例的策略 |
| RETIMING | 整数 | 0/1 | 启用/禁用重定时 |
| ADDER_THRESHOLD | 整数 | 4-128 | 加法器大小→进位链阈值 |
| COMPARATOR_THRESHOLD | 整数 | 4-128 | 比较器大小→进位链阈值 |
| SHREG_MIN_SIZE | 整数 | 3-32 | SRL 推断阈值 |
| FSM_EXTRACTION | 字符串 | OFF/ONE_HOT/SEQUENTIAL/GRAY/JOHNSON/AUTO | FSM 编码 |
| LUT_COMBINING | 整数 | 0/1 | 启用/禁用 LUT 组合 |
| CONTROL_SET_THRESHOLD | 整数 | 0-128 | 控制集优化阈值 |
| MAX_LUT_INPUT | 整数 | 4-6 | 4=无 LUT5/6,5=无 LUT6,6=全部 |
| MUXF_MAPPING | 整数 | 0/1 | 启用/禁用 MUXF7/F8/F9 |
| KEEP_EQUIVALENT_REGISTER | 整数 | 0/1 | 合并或保留等效寄存器 |
| PRESERVE_BOUNDARY | 整数 | 任意 | 将层次结构标记为更改(用于增量) |
| LOGIC_COMPACTION | 整数 | 1 | 将 CARRY+LUT 压缩到更少 SLICE |
| SRL_STYLE | 字符串 | REGISTER/SRL/SRL_REG/REG_SRL/REG_SRL_REG | SRL 实现 |
注意: BLOCK_SYNTH 硬化实例层次结构。仅在需要时使用。
OOC(离屏)综合
何时使用: 大型 IP 模块、第三方网表、很少更改的模块。
# 非工程模式
synth_design -top <module> -part <part> -mode out_of_context
# 工程模式:右键模块 → Set As Out-of-Context for Synthesis
关键规则:
- OOC 模块独立综合,在顶层综合中视为黑盒
- 不创建 IO 缓冲器
- 不支持 OOC 运行的增量综合
- 如果模块的下层有 AMD IP,不要使用 OOC
- 如果模块端口使用用户定义类型,不要使用 OOC
增量综合
检测 RTL 更改,仅重新综合修改的部分。减少运行时间和 QoR 波动。
# 工程模式:Settings → Synthesis → Incremental synthesis
# 非工程模式:
synth_design -top <top> -part <part> -incremental_mode default
| 模式 | 效果 |
|---|
default | 完整增量(检测 + 选择性重新综合) |
quick | 更快,不太彻底的增量 |
off | 完整重新综合 |
注意: 不支持 OOC 运行。
RTL Linter
综合前代码质量检查:
synth_design -lint -top <top> -part <part>
# 对于 OOC 运行:
synth_design -lint -srcset [get_property SRCSET [get_runs my_IP_core_synth_1]]
检测到的关键规则: 锁存器推断(INFER-1)、组合循环(INFER-4)、算术溢出(ASSIGN-1)、混合时钟边沿(CLOCK-1)、混合异步复位(RESET-1)、未连接端口(ASSIGN-12)。完整规则表请参阅 REFERENCE.md。
豁免:
create_waiver -type LINT -id ASSIGN-1 -rtl_hierarchy x/y
write_waivers -type LINT -file waivers.tcl
综合阶段约束
仅这些约束在综合期间使用:
| 类型 | 命令 |
|---|
| 时序 | create_clock、create_generated_clock、set_input_delay、set_output_delay、set_false_path、set_multicycle_path、set_max_delay、set_clock_groups、set_clock_latency、set_disable_timing |
| 对象访问 | all_clocks、all_inputs、all_outputs、get_cells、get_ports、get_clocks、get_nets、get_pins |
重要: 对综合后的设计进行时序分析使用估计的布线延迟——仅布线后时序是准确的。
属性传播规则
- 在层次结构上放置属性仅影响其边界,不影响内部信号(除了:
DSP_FOLDING、RAM_STYLE、ROM_STYLE、SHREG_EXTRACT、USE_DSP —— 这些确实影响内部信号)
- 如果同一属性在 RTL 和 XDC 中设置不同值 → XDC 胜出
KEEP 和 DONT_TOUCH 必须在 RTL 中设置(XDC 不支持它们——对象会在 XDC 读取前被优化掉)