4. 逻辑综合基础:从 RTL 到门级网表的映射过程

各位同学,今天我们来聊聊逻辑综合。说白了,就是把我们写的 RTL 代码,变成芯片能用的门级网表。这个过程,是数字芯片后端设计的起点,也是决定芯片成败的关键一步。

我记得刚入行那会儿,总觉得综合就是点一下按钮的事。直到有一次,我写的 RTL 代码综合出来的面积比预期大了三倍,老板差点让我重写。从那以后,我才真正开始研究综合到底在干什么。

4.1 综合的本质:三个步骤

逻辑综合,其实就三步:翻译优化映射。听起来简单,但每一步都有门道。

核心流程:

  • 翻译(Translation):把 RTL 代码转成布尔表达式,也就是逻辑函数。
  • 优化(Optimization):对布尔表达式进行化简,去掉冗余逻辑。
  • 映射(Mapping):把优化后的逻辑,匹配到工艺库里的标准单元上。

你想想看,RTL 代码里写的是 assign y = a & b | a & c,综合工具会先把它翻译成 y = a & (b | c),然后再去找一个合适的与或门来实现。这就是映射。

4.2 翻译阶段:从 HDL 到布尔表达式

这个阶段,工具会解析你的 Verilog 或 VHDL 代码。它会把 always 块、assign 语句、case 语句等,统统转成内部的布尔表达式。

我个人习惯,在写 RTL 时就会注意代码风格。比如,组合逻辑尽量用 assign 语句,时序逻辑用 always @(posedge clk)。这样工具翻译起来更顺畅,不容易出歧义。

小技巧:写 RTL 时,避免使用过于复杂的嵌套 if-else。工具翻译这种代码时,容易生成深度很大的逻辑链,影响时序。

4.3 优化阶段:逻辑化简与结构调整

优化是综合的核心。工具会做两件事:逻辑化简结构调整

逻辑化简,就是把布尔表达式变简单。比如 y = a & b | a & !b,化简后就是 y = a。工具会利用布尔代数里的各种定理,比如吸收律、分配律,来减少逻辑门的数量。

结构调整,则是为了满足时序或面积的要求。比如,工具可以把一个很大的与或门,拆成几个小门,来减少扇出。或者,把几个小门合并成一个复杂门,来减少面积。

我曾经遇到过一个项目,综合出来的路径延迟特别大。后来发现,是因为 RTL 里写了一个 64 位的加法器,工具直接映射成了一个超大的加法器单元。我建议改成树形加法器结构,延迟一下子就降下来了。

4.4 映射阶段:匹配工艺库

映射,就是把优化后的逻辑,匹配到工艺库里的标准单元。工艺库里有各种门:与门、或门、与非门、或非门、触发器、锁存器等等。每个单元都有它的面积、延迟、功耗参数。

工具会做一个权衡:是用一个复杂的门(面积小但延迟大),还是用几个简单的门(面积大但延迟小)。这个权衡,取决于你设定的综合策略。

策略 目标 典型做法
面积优先 最小化芯片面积 尽量使用复杂门,减少单元数量
时序优先 满足时钟频率要求 使用驱动能力强的单元,减少路径延迟
功耗优先 降低动态和静态功耗 使用低功耗单元,减少翻转活动

注意:映射阶段,工具会生成一个网表文件,通常是 Verilog 格式。这个网表里,所有的逻辑都是用标准单元实例化出来的。你可以在网表里看到类似 AND2X1 U1 (.A(a), .B(b), .Y(y)) 这样的语句。

4.5 综合约束:告诉工具你想要什么

综合不是瞎综合,你得告诉工具你的目标。这就是综合约束。最常用的约束是时序约束,比如时钟周期、输入延迟、输出延迟。

举个例子,如果你的芯片要跑 1GHz,时钟周期就是 1ns。你得告诉工具:所有路径的延迟,都不能超过 1ns。工具就会拼命优化,直到满足这个要求。

如果约束太紧,工具可能会报错,说无法满足。这时候,你就得放宽约束,或者修改 RTL 代码。我曾经有一次,为了满足一个 500MHz 的约束,把整个数据通路重写了一遍。嗯,那感觉,记忆犹新。

4.6 综合策略:面积、时序、功耗的博弈

综合策略,说白了就是你在面积、时序、功耗之间做取舍。没有完美的策略,只有最适合你项目的策略。

我个人习惯,在项目初期会用面积优先策略,先看看芯片大概有多大。到了后期,再用时序优先策略,确保能跑到目标频率。功耗优化,通常是在最后阶段做。

你想想看,如果一开始就追求低功耗,工具可能会用很多低驱动能力的单元,导致时序很难收敛。所以,分阶段优化是比较稳妥的做法。

4.7 综合输出:网表与报告

综合完成后,工具会输出两个东西:门级网表综合报告

门级网表,就是你的芯片的“电路图”。它描述了所有标准单元之间的连接关系。这个网表,后续会交给布局布线工具,去生成物理版图。

综合报告,则记录了综合过程中的各种信息:面积、时序、功耗、扇出、扇入等等。你得仔细看报告,看看有没有违反约束的地方。

避坑指南:我曾经有一次,综合报告显示时序都满足了,但布局布线后却出现了时序违例。后来发现,是因为综合时用的线负载模型太乐观了。所以,我建议在综合时,使用稍微悲观一点的线负载模型,给后端留点余量。

4.8 知识体系图:综合流程概览

下面这张图,展示了从 RTL 到门级网表的完整流程。你可以看到,综合不是一步到位的,而是反复迭代的过程。

逻辑综合流程概览 RTL 代码 翻译 (Translation) 优化 (Optimization) 映射 (Mapping) 门级网表 综合约束 工艺库 综合策略 迭代优化

从图中可以看到,综合不是线性的。工具会根据约束和策略,反复在优化和映射之间迭代,直到满足所有要求。如果发现时序不满足,工具会回溯到优化阶段,重新调整逻辑结构。

4.9 总结

逻辑综合,就是把 RTL 代码变成门级网表的过程。它分为翻译、优化、映射三步。每一步都有它的难点和技巧。

我个人觉得,做好综合的关键,是理解工具在做什么,以及如何通过约束和策略来引导工具。不要把它当成黑盒子,要把它当成你的合作伙伴。

嗯,今天就讲到这里。下一章,我们会深入讨论综合约束的具体写法,以及如何避免常见的综合陷阱。


专注资料整理