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%,通常说明物理信息引入不足或约束过松。

Fusion Compiler 物理感知综合数据流与层次化规划 RTL 源码 top.v / sub_module.v 约束与预算 SDC / 接口时序预算 物理感知综合引擎 逻辑映射 + 粗布局 时序驱动优化 缓冲插入 / 尺寸调整 拥塞感知布局 实际线长反标 优化后网表 含物理位置信息 时序报告 WNS / TNS / 线长 层次化设计规划:模块划分与接口时序预算 顶层 Top 模块 A CPU 核 / 数据通路 模块 B 存储控制器 模块 C 外设接口 A→B 预算 0.35ns B→C 预算 0.28ns 接口时序预算 = 顶层周期 − 发送端余量 − 接收端余量 − 时钟不确定性

二、模块划分:从逻辑层次到物理层次

模块划分不是简单地把 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% 的路径需要重新审视划分或约束。

接口预算不是一次性的。每次模块内部逻辑变更后,都应重新评估跨模块路径的 slack 分布,必要时调整预算并同步更新各模块的 SDC。

四、顶层规划:时钟、电源与布线的协同

顶层规划要解决三个问题:时钟树如何分布、电源网络如何覆盖、全局布线通道如何预留。在 Fusion Compiler 中,顶层规划通常在 place_opt 之后、clock_opt 之前进行。关键动作包括:

  • 时钟根节点规划:确定时钟源到各模块的延迟平衡目标,通常要求模块间时钟偏差(Skew)控制在周期的 5% 以内。例如 1.2ns 周期,模块间 skew 目标为 60ps。
  • 电源网格预留:根据各模块的功耗密度,在顶层预留电源条带(Power Stripe)的宽度和间距。高功耗模块下方需要更密的电源网格。
  • 布线通道预留:在模块边界和顶层区域预留 10%~15% 的布线资源,避免后期因拥塞导致无法绕通。

顶层规划完成后,应运行一次全局布线评估(Global Route),检查拥塞热图。若某区域 overflow 超过 5%,需要调整模块位置或增加布线通道。最终,物理综合、模块划分、接口预算和顶层规划四者形成闭环:划分决定预算分配,预算约束综合优化,综合结果反过来验证划分是否合理,顶层规划则为整个层次化设计提供物理承载基础。

判断层次化设计是否健康的三个快速指标:跨模块路径占总路径比例低于 20%;各模块利用率在 60%~75%;顶层全局布线 overflow 低于 3%。若任一指标明显偏离,应优先回到模块划分和预算分配阶段调整,而不是在顶层反复修补。