1、逻辑综合概述:什么是逻辑综合?逻辑综合在数字IC设计流程中的位置。逻辑综合的输入与输出。

1.1 到底什么是逻辑综合?

说白了,逻辑综合就是把你的 RTL 代码——也就是 Verilog 或 VHDL 写的那堆「行为描述」——翻译成真正的门级网表。

我刚开始接触这行的时候,总觉得综合就是个「翻译工具」。后来踩过几次坑才明白,它远不止翻译那么简单。它还要做优化、做映射、做时序估算。你想想看,你写了个 always @(posedge clk),综合工具得帮你决定:这个寄存器是用 D 触发器还是用锁存器?用哪种工艺库里的单元?驱动能力选多大?

嗯,这里要注意:综合不是编译。编译只是检查语法,综合是真正在「造电路」。

核心定义:逻辑综合是将 RTL(寄存器传输级)描述,通过综合工具,映射到特定工艺库的标准单元,生成门级网表的过程。同时,它还要保证这个网表满足你设定的时序、面积、功耗等约束。

1.2 逻辑综合在数字IC设计流程中的位置

整个数字IC设计流程,我习惯把它分成三段:前端、中端、后端。逻辑综合正好卡在「前端」和「后端」的中间。

前端你写 RTL、做仿真验证。后端你做布局布线、做物理验证。综合就是那个「承上启下」的环节。

我记得有一次项目赶进度,前端团队觉得 RTL 仿真跑通了就直接往后端丢。结果综合出来的时序一塌糊涂,关键路径全是红的。后来我们不得不回头改 RTL,一来一回浪费了两周。所以我现在特别强调:综合是设计流程的「质检站」,不是走过场的。

具体位置如下:

阶段 主要工作 输出
前端设计 RTL编码、功能仿真、DFT插入 RTL代码、仿真波形
逻辑综合 RTL编译、约束设置、综合优化 门级网表、SDC约束、综合报告
后端设计 布局布线、时钟树综合、物理验证 GDSII版图

个人经验:我建议在综合阶段就做一次粗略的时序分析。虽然这时候的时序模型还不准,但能帮你提前发现那些「明显有问题」的路径。别等到后端跑完才发现,那时候改起来成本就高了。

1.3 逻辑综合的输入——你给工具喂什么?

综合工具不是凭空变出网表的。你得给它三样东西:

  • RTL代码:这是核心输入。Verilog 或 VHDL 写的设计描述。注意,综合工具只认可综合的语法,你写的 testbench 它可不认。
  • 工艺库:这是「食材」。比如台积电的 28nm 库、中芯国际的 55nm 库。库里面定义了每个标准单元的延迟、面积、功耗、驱动能力等参数。
  • 约束文件:这是「菜谱」。你告诉工具:时钟频率是多少?输入输出延迟是多少?哪些路径是假的(false path)?哪些是多周期路径(multicycle path)?

我见过不少新手,RTL 写得挺漂亮,但约束文件写得一塌糊涂。综合出来的结果自然没法用。说白了,约束就是你和综合工具沟通的语言,写不好,工具就不知道你想要什么。

一个典型的约束文件长这样:

# 时钟定义
create_clock -name clk -period 10 [get_ports clk]

# 输入延迟
set_input_delay -clock clk -max 2.0 [get_ports data_in]

# 输出延迟
set_output_delay -clock clk -max 3.0 [get_ports data_out]

# 假路径
set_false_path -from [get_clocks rst_n]

1.4 逻辑综合的输出——工具给你什么?

综合跑完之后,工具会吐出几样东西:

  • 门级网表:这是最核心的输出。一个 .v 或 .vg 文件,里面全是标准单元的实例化。比如 DFF_X1 U1 (.D(n1), .CK(clk), .Q(n2));
  • SDC约束文件:综合工具会根据你的原始约束,加上它自己推导出的信息,生成一个更完整的 SDC 文件。这个文件会传给后端做布局布线。
  • 综合报告:包括时序报告、面积报告、功耗报告、扇出报告等。我每次都会仔细看时序报告里的「最差路径」(worst path),看看是不是有哪里需要优化。

注意:综合输出的网表是「逻辑正确」的,但还不是「物理正确」的。它没有考虑走线延迟、时钟偏差这些物理效应。所以综合后的时序分析只能算「预估」,真正的时序签收还得靠后端做完之后的 STA。

1.5 综合工具是怎么工作的?

简单说三步:

  1. 编译:工具读入你的 RTL,解析成一种中间表示形式。这一步会做语法检查、宏展开、参数替换等。
  2. 逻辑优化:工具开始「动脑子」了。它会做资源共享、常数传播、状态机优化、重定时等操作。说白了就是想办法让你的电路更小、更快、更省电。
  3. 工艺映射:把优化后的逻辑,映射到工艺库里的标准单元。这一步会考虑驱动强度、扇出限制、时序模型等。

我曾经遇到过一个案例:一个简单的加法器,RTL 写的是 sum <= a + b + c + d;。综合工具自动把它优化成了 (a+b) + (c+d) 的树形结构,而不是 (((a+b)+c)+d) 的链式结构。为什么?因为树形结构的路径更短,时序更好。这就是工具在帮你做优化。

避坑指南:我曾经因为 RTL 里写了一个很大的 case 语句,综合出来面积爆炸。后来发现是工具把 case 译码成了优先级编码器,而不是并行选择器。解决办法很简单:加一个 parallel_case 综合指令。嗯,这种细节,不踩坑真的记不住。

1.6 小结

逻辑综合,说白了就是把你写的「行为」变成「电路」。它在设计流程中承上启下,输入是 RTL + 库 + 约束,输出是网表 + SDC + 报告。

我个人觉得,综合阶段是设计质量的第一道关口。RTL 写得再漂亮,综合做不好,后面全是白搭。所以,花时间把约束写清楚、把报告看仔细,绝对值得。

下一章,我们会深入聊聊综合工具的具体操作流程,以及那些常见的「坑」该怎么避开。