4. 物理感知综合与层次化设计
当设计规模超过单次综合可收敛的容量,或模块间存在大量跨边界时序路径时,传统的“先逻辑综合、再布局布线”的串行流程会反复出现时序反复、拥塞不可预测的问题。物理感知综合(Physically Aware Synthesis)把布局信息提前引入综合阶段,让工具在优化逻辑的同时感知单元位置、线长和拥塞,从而在早期就得到更接近最终签核的时序与面积结果。Synopsys Fusion Compiler 正是把综合、布局、时钟树综合和优化统一在一个数据模型中的实现平台,本节围绕它的物理综合能力、模块划分策略、接口时序预算以及顶层规划展开。
一、Fusion Compiler 物理综合的核心机制
Fusion Compiler 的关键在于“单一数据模型 + 统一优化引擎”。综合阶段不再只依赖统计线负载模型(WLM),而是通过快速布局(Placement)得到粗略的物理位置,再用实际布线估计(Global Route 或基于拥塞的估计)反标回时序计算。这样,一条从寄存器 A 到寄存器 B 的路径,其延迟由单元延迟、实际互连延迟和时钟不确定性共同构成,而不是用统一的 fanout 系数粗略估算。
在脚本层面,物理综合通常由以下命令序列驱动:
set_app_options -name compile.flow.physically_aware -value true
set_app_options -name place.coarse.continue_on_missing_scandef -value true
read_verilog ./rtl/top.v
read_sdc ./constraints/top.sdc
create_clock -name clk -period 1.2 [get_ports clk]
compile_fusion -to place_opt
其中 compile_fusion -to place_opt 表示综合并推进到布局优化阶段。工具会先做逻辑映射,再执行粗布局,随后基于实际位置做时序驱动优化(Timing-Driven Optimization),包括缓冲插入、单元尺寸调整和逻辑重构。判断物理综合是否有效的关键指标包括:WNS/TNS 是否在综合后已接近布局后结果、拥塞溢出(Overflow)是否收敛、以及关键路径的线长占比是否合理。若综合后 WNS 与布局后 WNS 差距超过周期的 10%,通常说明物理信息引入不足或约束过松。
二、模块划分:从逻辑层次到物理层次
模块划分不是简单地把 RTL 层次照搬为物理层次。划分的目标是让每个模块在面积、端口数、时序路径和拥塞分布上尽量均衡,同时减少跨模块的关键路径。常见的划分依据包括:
- 功能内聚性:把数据通路、控制逻辑、存储接口分别成块,避免同一模块内混合大量不同频率域的逻辑。
- 端口数量控制:单个模块的端口数建议控制在 200~500 之间。端口过多会导致顶层布线拥塞,端口过少则模块内部逻辑过于集中。
- 时序路径分布:统计跨模块路径的 slack 分布,若某条跨模块路径的 slack 已接近零,应考虑把发送端和接收端合并到同一模块,或调整预算。
- 物理尺寸约束:模块的宽高比尽量接近 1:1,避免细长形状导致长线绕行。
在 Fusion Compiler 中,可以通过 create_placement_blockage 和 create_bound 为模块指定物理区域,再用 place_opt 在约束范围内完成布局。划分完成后,应检查每个模块的利用率(Utilization)是否在 60%~75% 之间,过高会导致局部拥塞,过低则浪费面积。
三、接口时序预算:把顶层周期拆到边界
接口时序预算是层次化设计中最容易出问题的环节。顶层时钟周期确定后,需要把周期分配给各段路径。以 1.2ns 周期为例,假设时钟不确定性为 0.15ns,发送端寄存器输出延迟为 0.08ns,接收端建立时间为 0.05ns,则可用于互连和组合逻辑的总预算为:
总预算 = 1.2 - 0.15 - 0.08 - 0.05 = 0.92 ns
若模块 A 到模块 B 之间经过两级组合逻辑,每级约 0.12ns,
则互连预算 = 0.92 - 0.24 = 0.68 ns
再按 60% 用于实际布线、40% 留作余量,
则接口约束可设为 0.68 × 0.6 ≈ 0.41 ns
这个 0.41ns 就是写入 SDC 的 set_max_delay 或 set_input_delay/set_output_delay 的依据。预算过紧会导致模块内部过度优化、面积膨胀;预算过松则会把压力全部推到顶层,造成顶层无法收敛。实际项目中,建议对每条跨模块路径单独建预算表,并在综合后对比“预算值”与“实际到达值”,偏差超过 15% 的路径需要重新审视划分或约束。
四、顶层规划:时钟、电源与布线的协同
顶层规划要解决三个问题:时钟树如何分布、电源网络如何覆盖、全局布线通道如何预留。在 Fusion Compiler 中,顶层规划通常在 place_opt 之后、clock_opt 之前进行。关键动作包括:
- 时钟根节点规划:确定时钟源到各模块的延迟平衡目标,通常要求模块间时钟偏差(Skew)控制在周期的 5% 以内。例如 1.2ns 周期,模块间 skew 目标为 60ps。
- 电源网格预留:根据各模块的功耗密度,在顶层预留电源条带(Power Stripe)的宽度和间距。高功耗模块下方需要更密的电源网格。
- 布线通道预留:在模块边界和顶层区域预留 10%~15% 的布线资源,避免后期因拥塞导致无法绕通。
顶层规划完成后,应运行一次全局布线评估(Global Route),检查拥塞热图。若某区域 overflow 超过 5%,需要调整模块位置或增加布线通道。最终,物理综合、模块划分、接口预算和顶层规划四者形成闭环:划分决定预算分配,预算约束综合优化,综合结果反过来验证划分是否合理,顶层规划则为整个层次化设计提供物理承载基础。