3. 逻辑综合策略与脚本架构
逻辑综合是把RTL代码映射到目标工艺库标准单元网表的关键环节,它决定了后续布局布线的起点质量。在Synopsys工具链中,Design Compiler(DC)是经典的综合引擎,而Fusion Compiler(FC)则把综合、布局、优化整合在一个统一的物理感知流程中。理解两者的流程差异、约束编写方式以及时序驱动与面积优化的权衡策略,是芯片实现项目交付的基础能力。
一、DC与FC的流程定位差异
Design Compiler工作在“逻辑域”,输入是RTL与工艺库,输出是门级网表与SDC约束。它的综合过程大致分为三个阶段:翻译(translate)把RTL转为通用布尔网络;逻辑优化(logic optimization)在时序、面积、功耗约束下做结构化与门级映射;映射(mapping)把优化后的逻辑绑定到目标库的具体单元。DC默认不知道物理位置信息,因此线延迟只能靠WLM(Wire Load Model)或TLU+估算,这是它与物理实现脱节的主要来源。
Fusion Compiler则把综合放进物理感知的上下文里:读入RTL后先做快速综合与布局(place),得到真实的单元位置和互连线长估计,再回到逻辑优化阶段迭代。这样时序驱动综合不再依赖粗略的线负载模型,而是用实际布局后的RC信息反标,显著减少综合与布局之间的时序鸿沟。对于先进工艺节点,FC的物理感知综合几乎是默认选择;DC则更多用于早期架构探索、模块级快速评估或不需要物理信息的场景。
二、约束编写:SDC是综合的“合同”
SDC(Synopsys Design Constraints)是综合工具理解设计意图的唯一入口。约束写错,综合结果再漂亮也没有意义。核心约束分为四类:
- 时钟约束:
create_clock -period 2.0 -name clk [get_ports clk]定义时钟周期;create_generated_clock处理分频/倍频时钟;set_clock_uncertainty预留抖动与偏斜余量。 - 输入/输出延迟:
set_input_delay -clock clk 0.5 [get_ports data_in]告诉工具外部逻辑占用了多少时间;set_output_delay同理约束输出路径。 - 时序例外:
set_false_path排除异步跨时钟域路径;set_multicycle_path允许组合逻辑跨多周期;set_max_delay/set_min_delay用于特殊路径。 - 环境与负载:
set_driving_cell、set_load、set_max_transition、set_max_capacitance描述真实驱动与负载条件。
一个常见的教学示例:假设时钟周期2.0ns,输入延迟0.3ns,输出延迟0.4ns,时钟不确定度0.15ns,则寄存器到寄存器路径的可用时间约为2.0 - 0.15 = 1.85ns,输入到寄存器路径为2.0 - 0.3 - 0.15 = 1.55ns。这些数字直接决定综合工具在优化时的目标。
三、时序驱动综合与面积优化的权衡
时序驱动综合的核心思想是:工具在映射和优化时,优先满足时序约束,再在剩余空间里压缩面积。DC/FC中通过compile_ultra或compile_ultra -gate_clock等命令启动,配合set_max_area设定面积上限。实际项目中,面积和时序往往互相拉扯:过度追求时序会导致单元尺寸增大、面积膨胀;过度压面积又可能让关键路径恶化。
有效的策略是分层处理:先让工具在compile_ultra下自由优化,观察时序报告(report_timing)中的WNS(最差负裕量)和TNS(总负裕量);如果WNS已经为正且TNS为0,再逐步收紧set_max_area或使用optimize_netlist -area做面积回收。对于FC流程,还可以利用物理感知的place_opt在布局后重新优化关键路径,此时面积和时序的权衡更接近真实芯片。
report_qor中的时序、面积、功耗三项。若WNS < 0,优先修时序;若WNS ≥ 0且TNS = 0,再考虑面积优化。不要在没有满足时序的情况下强行压面积。
四、脚本架构与可复现性
综合脚本的可复现性直接决定项目交付质量。一个健壮的DC/FC脚本通常包含以下结构:变量定义区(工艺库路径、设计名、时钟周期)、库加载区(set target_library、set link_library)、RTL读入区(analyze -format verilog + elaborate)、约束加载区(source constraints.sdc)、综合执行区(compile_ultra)、报告输出区(report_timing、report_area、report_power)以及网表写出区(write -format verilog)。
# 示例:DC综合脚本骨架(教学示例,非实测)
set DESIGN "top"
set CLK_PERIOD 2.0
set search_path [list . ./rtl ./lib]
set target_library "sc9_cln40ll_base_tt_1p1v25c.db"
set link_library "* $target_library"
analyze -format verilog [list ./rtl/${DESIGN}.v]
elaborate $DESIGN
current_design $DESIGN
link
source ./constraints/${DESIGN}.sdc
set_max_area 0
compile_ultra -gate_clock
report_timing -max_paths 10 > ./rpt/${DESIGN}_timing.rpt
report_area > ./rpt/${DESIGN}_area.rpt
report_power > ./rpt/${DESIGN}_power.rpt
write -format verilog -hierarchy -output ./netlist/${DESIGN}_syn.v
write_sdc ./netlist/${DESIGN}_syn.sdc
脚本中应避免硬编码绝对路径,使用变量和相对路径便于迁移;约束文件与脚本分离,方便不同项目复用;每次综合后保留报告文件,作为版本对比和问题追溯的依据。对于FC流程,脚本还需加入物理库加载、create_floorplan或initialize_floorplan、place_opt等步骤,但整体架构与DC保持一致。
五、常见问题与排障方向
综合阶段最常见的问题包括:时序无法收敛、面积超预算、约束冲突导致工具报错、跨时钟域路径被误约束。排障时先看report_timing的路径起点和终点,确认是否属于真实关键路径;再检查SDC中是否存在set_false_path覆盖了本该约束的路径;最后确认工艺库版本与RTL是否匹配。对于FC流程,还要检查物理库是否完整、布局是否合理,因为物理感知综合的结果高度依赖初始布局质量。
逻辑综合不是一次性动作,而是“约束—综合—报告—调整”的迭代过程。掌握DC与FC的流程差异、SDC的编写逻辑以及时序与面积的权衡方法,才能为后续布局布线提供高质量的起点网表。