1. DC综合工程全景

在数字集成电路设计中,RTL代码描述的是"电路应该做什么",而门级网表描述的是"电路由哪些标准单元、以怎样的连接关系实现"。Design Compiler(DC)承担的正是这两者之间的转换工作——把可综合的寄存器传输级描述,经过工艺库映射、逻辑优化与时序约束驱动,最终生成可交给后端布局布线的门级网表。理解这条链路上每一步的输入、输出与判断依据,是掌握DC综合工程的前提。

一、DC在ASIC与FPGA设计中的定位

DC是Synopsys综合工具链的核心,主要面向ASIC/SoC的标准单元综合流程。它的输入包括三部分:RTL源码(Verilog/VHDL/SystemVerilog)、工艺库(.db格式的target library,如某40nm工艺的典型库)、以及约束文件(SDC,描述时钟、输入输出延迟、时序例外等)。输出则是门级网表(.v)、时序报告、面积报告和约束一致性检查结果。

在FPGA设计中,综合通常由厂商工具(如Vivado、Quartus)完成,DC并非主流选择;但在ASIC流程中,DC处于"前端RTL"与"后端物理实现"之间的关键位置。它不负责布局布线,也不做时钟树综合,但它的综合质量直接决定后端能否收敛。可以这样理解:DC把"功能正确"的RTL,变成"时序可收敛、面积可接受、功耗可控"的门级结构。

二、从RTL到门级网表的完整流程

DC综合的典型流程可分为五个阶段,每个阶段都有明确的输入输出和检查点:

  1. 读入与链接:读取RTL和工艺库,用read_verilog、link建立设计层次与库单元的对应关系。此时若出现"unresolved reference",说明有模块未找到或库不匹配。
  2. 约束加载:通过read_sdc或source加载SDC,定义时钟周期、输入延迟、输出延迟、多周期路径、伪路径等。约束是综合的"目标函数",没有约束的综合等于没有方向。
  3. 编译与优化:执行compile_ultra,DC进行逻辑映射、时序优化、面积优化和功耗优化。这一步会生成初步的门级网表。
  4. 分析与报告:用report_timing、report_area、report_constraint检查时序是否满足、面积是否合理、约束是否被正确理解。
  5. 输出与交付:用write输出门级网表、SDC、SDF等文件,交给后端或仿真验证。

下面这张图展示了DC综合工程中从RTL到门级网表的核心数据流与关键检查点,帮助建立整体认知:

DC综合工程:RTL → 门级网表 数据流与检查点 RTL源码 Verilog / VHDL 工艺库 .db 标准单元 / 宏单元 约束 SDC 时钟 / IO延迟 / 例外 Design Compiler link → 约束加载 compile_ultra 时序 / 面积 / 功耗优化 门级网表 .v 标准单元连接 时序报告 WNS / TNS / 违例路径 面积 / 功耗报告 cell area / leakage 关键检查点 unresolved reference 约束覆盖率 / 时序违例 交付后端 布局布线 / 时钟树综合 时序不满足 → 修改RTL/约束 → 重新综合

三、综合工程的核心交付物

一次完整的DC综合,最终交付的不只是网表文件。工程上通常需要以下交付物:

  • 门级网表(.v):包含标准单元实例和连接关系,是后端布局布线的输入。
  • 综合后SDC:DC会输出实际使用的约束,供后端和时序签核使用。
  • 时序报告:包括WNS(最差负裕量)、TNS(总负裕量)、违例路径数量,是判断综合是否收敛的核心依据。
  • 面积报告:组合逻辑面积、时序逻辑面积、总面积,用于评估PPA。
  • 功耗报告:动态功耗、漏电功耗,在低功耗设计中尤为关键。
  • 约束一致性检查:确认SDC被正确理解,没有未约束的路径或冲突约束。

四、质量指标与判断依据

综合质量不能只看"有没有报错"。工程上通常关注以下指标:

指标含义典型判断
WNS最差路径的时序裕量≥0 表示时序满足;负值需优化
TNS所有违例路径裕量之和越接近0越好,反映整体收敛程度
违例路径数不满足约束的路径数量需结合路径类型判断是否可接受
总面积标准单元总面积与预估面积对比,偏差过大需排查
约束覆盖率被约束的路径比例应接近100%,避免未约束路径
实践提示:在综合初期,建议先用check_design和check_timing确认设计完整性和约束完整性,再执行compile_ultra。很多"综合结果不理想"的问题,根源其实在约束缺失或库不匹配,而不是优化算法本身。

五、一个典型综合脚本的骨架

下面给出一个可参考的DC综合脚本骨架,展示了从读入到输出的关键命令顺序。示例中的工艺库名称和时钟周期为教学假设值,实际工程需替换为项目真实参数:

# 1. 设置库路径与目标库
set target_library "slow.db"
set link_library "* slow.db"
set symbol_library "generic.sdb"

# 2. 读入RTL
read_verilog ./rtl/top.v
current_design top
link

# 3. 加载约束
source ./constraints/top.sdc

# 4. 检查设计与约束
check_design
check_timing

# 5. 综合优化
compile_ultra -gate_clock

# 6. 报告与分析
report_timing -max_paths 10
report_area
report_constraint -all_violators

# 7. 输出交付物
write -format verilog -hierarchy -output ./output/top_netlist.v
write_sdc ./output/top.sdc
write_sdf ./output/top.sdf

这段脚本体现了DC综合工程的基本节奏:先建立环境,再读入设计,然后约束、检查、优化、报告、输出。每一步都有对应的检查点,任何一个环节出问题,都会在后端或时序签核阶段放大。因此,综合工程的核心不是"跑通脚本",而是理解每个阶段在做什么、输出什么、如何判断结果是否可信。

本节小结:DC综合工程是连接RTL与门级网表的桥梁。它的输入是RTL、工艺库和SDC约束,输出是网表、时序报告、面积功耗报告等交付物。质量判断围绕WNS、TNS、违例路径数、面积和约束覆盖率展开。掌握这条数据流和关键检查点,是后续学习约束编写、优化策略和时序分析的基础。