一、DC综合概述:逻辑综合的本质与定位

大家好,我是你们的讲师。今天咱们聊聊DC综合的入门话题。

逻辑综合,说白了就是把RTL代码翻译成门级网表。你写的是always块、assign语句,但芯片里只有与门、或门、触发器这些基本单元。怎么把高级语言变成底层电路?这就是综合干的事。

1.1 什么是逻辑综合

逻辑综合有三个步骤:

  • 转换(Translation):把Verilog/VHDL读进来,变成GTECH网表。GTECH是Synopsys内部的一种通用网表格式,不依赖具体工艺库。
  • 逻辑优化(Logic Optimization):对电路做简化。比如a & a 直接变成a,或者把冗余的路径砍掉。我见过有人写代码时习惯性加一堆冗余逻辑,优化后面积能省30%。
  • 映射(Mapping):把优化后的电路映射到目标工艺库上。比如用TSMC 28nm的库,还是用SMIC 55nm的库,映射结果完全不同。

核心要点:综合不是简单的翻译,它包含了大量的优化决策。同样的RTL,不同的约束、不同的工艺库,综合出来的网表可能天差地别。

1.2 DC在数字IC设计流程中的位置

数字IC设计流程大致是这样的:

  1. 需求分析 → 架构设计
  2. RTL编码(Verilog/VHDL)
  3. 逻辑综合(DC登场)
  4. 形式验证(Formality)
  5. 静态时序分析(PrimeTime)
  6. 布局布线(ICC/Innovus)
  7. 物理验证(DRC/LVS)
  8. 流片

DC处在RTL编码之后、布局布线之前。这个位置很关键——它是从行为级描述到物理实现的桥梁。你想想看,如果综合这一步没做好,后面布局布线再怎么折腾也救不回来。

我个人习惯把DC比作「翻译官」。RTL是设计师的想法,工艺库是代工厂的能力,DC负责让两者对上话。我在项目中遇到过好几次,RTL写得挺漂亮,但综合出来时序一塌糊涂。后来发现是约束没给对,DC根本不知道你想要的频率是多少。

1.3 DC综合的基本流程

DC综合的基本流程,我总结为六步:

步骤 操作 说明
1 设置库文件 指定目标库、链接库、符号库等
2 读取设计 读入RTL文件或已综合的网表
3 定义约束 时钟、输入输出延迟、面积、功耗等
4 综合优化 DC自动执行转换、优化、映射
5 分析结果 查看时序报告、面积报告、功耗报告
6 保存数据 输出网表、SDC约束、SDF延迟文件

嗯,这里要注意:步骤3的约束定义是最容易出问题的。我曾经因为忘了定义时钟的uncertainty,导致综合出来的电路在实际芯片上跑不到目标频率。那次教训挺深刻的。

下面是一个最简单的DC脚本示例:

# 设置库文件
set target_library "tsmc28nm.db"
set link_library "* $target_library"

# 读取设计
read_verilog top.v
current_design top

# 定义约束
create_clock -period 10 [get_ports clk]
set_input_delay 2 -clock clk [all_inputs]
set_output_delay 2 -clock clk [all_outputs]

# 综合
compile_ultra

# 报告
report_timing > timing.rpt
report_area > area.rpt

# 保存
write -hierarchy -output top_netlist.v
write_sdc top.sdc

这个脚本虽然简单,但已经包含了综合的核心步骤。实际项目中,约束会复杂得多——多时钟域、异步复位、false path、multicycle path等等。这些我们后面章节会详细讲。

个人建议:刚开始学DC时,别急着写复杂脚本。先跑通一个最简单的例子,理解每一步在干什么。我当年就是太心急,一上来就想搞定多时钟域综合,结果折腾了两周没跑通。后来老老实实从单时钟开始,反而进步更快。

1.4 避坑指南

综合过程中有几个常见的坑,我帮你列出来:

  • 库文件路径错误:DC找不到.db文件,直接报错退出。建议用绝对路径,或者统一管理库文件。
  • 约束不完整:比如忘了约束异步复位信号,DC会默认给它加很紧的约束,导致面积暴增。
  • 综合策略选择不当:compile_ultra和compile有什么区别?前者优化更激进,适合高性能设计;后者保守一些,适合低功耗设计。选错了可能适得其反。
  • 忽略警告:DC的警告信息很多,但有些是致命的。比如「Unresolved reference」说明某个模块没找到,这时候千万别跳过。

我曾经因为忽略了一个「Inferred latch」的警告,结果综合出来的电路多了一堆锁存器。流片回来功能全乱套。从那以后,我对DC的警告信息格外敏感。

1.5 小结

这一章我们讲了逻辑综合的本质、DC在流程中的位置,以及基本流程。说白了,DC就是把你的RTL代码变成真正的电路。但这个过程不是机械的翻译,它需要你给出正确的约束、选择合适的策略、仔细分析结果。

下一章我们会深入DC的启动文件和库设置。到时候我会分享一些我多年积累的库配置技巧,保证让你少走弯路。