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综合的典型流程可分为五个阶段,每个阶段都有明确的输入输出和检查点:
- 读入与链接:读取RTL和工艺库,用
read_verilog、link建立设计层次与库单元的对应关系。此时若出现"unresolved reference",说明有模块未找到或库不匹配。 - 约束加载:通过
read_sdc或source加载SDC,定义时钟周期、输入延迟、输出延迟、多周期路径、伪路径等。约束是综合的"目标函数",没有约束的综合等于没有方向。 - 编译与优化:执行
compile_ultra,DC进行逻辑映射、时序优化、面积优化和功耗优化。这一步会生成初步的门级网表。 - 分析与报告:用
report_timing、report_area、report_constraint检查时序是否满足、面积是否合理、约束是否被正确理解。 - 输出与交付:用
write输出门级网表、SDC、SDF等文件,交给后端或仿真验证。
下面这张图展示了DC综合工程中从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综合工程的基本节奏:先建立环境,再读入设计,然后约束、检查、优化、报告、输出。每一步都有对应的检查点,任何一个环节出问题,都会在后端或时序签核阶段放大。因此,综合工程的核心不是"跑通脚本",而是理解每个阶段在做什么、输出什么、如何判断结果是否可信。