3. RTL设计与综合概念:Verilog基础回顾,综合的基本概念,逻辑综合与物理综合的区别

各位同学好,我是你们的后端设计讲师。今天咱们聊聊RTL设计与综合。说实话,很多刚入行的朋友觉得这章是“纯理论”,没啥意思。但我得说,综合这步要是理解不透,后面做物理设计时会踩很多坑。我自己就吃过这个亏,所以今天咱们好好掰扯掰扯。

3.1 Verilog基础回顾——够用就行

Verilog这东西,你不需要背得滚瓜烂熟。作为后端工程师,我们看RTL代码的目的只有一个:看懂它描述的是什么硬件结构。说白了,就是能判断出这段代码综合出来是触发器、组合逻辑还是状态机。

我个人习惯把Verilog分成三类结构来记:

  • 组合逻辑:用 assign 或者 always @(*) 描述。比如一个加法器、一个多路选择器。
  • 时序逻辑:用 always @(posedge clk) 描述。典型的就是D触发器。
  • 模块例化:把小的模块拼成大的系统。

举个例子,一个简单的D触发器写法:

module dff (
    input  clk,
    input  rst_n,
    input  d,
    output reg q
);
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            q <= 1'b0;
        else
            q <= d;
    end
endmodule

嗯,这里要注意:always 块里的赋值一定要用 <=(非阻塞赋值),这是硬件描述语言和软件语言最大的区别。我在项目中见过有人写成 =,结果仿真和综合结果不一致,查了半天才发现是这里的问题。

小技巧:看RTL代码时,先找时钟和复位信号。时钟决定了时序逻辑的节奏,复位决定了初始状态。这两个信号搞清楚了,代码结构就清晰了一半。

3.2 综合的基本概念——把代码变成电路

综合是什么?说白了,就是把我们写的Verilog代码,翻译成由标准单元库里的门级网表。这个过程有点像翻译官:你把中文(RTL)说给他听,他给你翻译成英文(门级网表)。

综合工具(比如Synopsys的Design Compiler)会做三件事:

  1. 翻译:把RTL代码解析成布尔表达式和状态机。
  2. 优化:根据你给的约束(比如时钟频率、面积目标),对电路进行逻辑化简、资源共享等操作。
  3. 映射:把优化后的逻辑,映射到工艺库里的具体单元(比如AND门、OR门、触发器)。

举个例子,你写了一个 assign y = a & b | c & d;,综合工具可能会把它优化成 y = (a & b) | (c & d) 的两级逻辑,然后映射成两个AND门加一个OR门。但如果你的时序约束很紧,工具可能会选择用更快的单元(比如用AOI复合门)来替代。

核心要点:综合不是简单的“一对一翻译”,而是带优化的映射。同样的RTL代码,不同的约束条件,综合出来的网表可能完全不同。

我记得有一次做项目,前端同事写的代码里有一个很大的case语句。我给了很紧的时序约束,结果综合工具自动把它优化成了优先级编码器,面积大了不少。后来我调整了约束,工具才把它综合成并行结构。你看,约束直接影响结果。

3.3 逻辑综合 vs 物理综合——两个阶段,两种思维

很多初学者会问:逻辑综合和物理综合到底有啥区别?我简单解释一下。

逻辑综合(Logic Synthesis)是我们刚才说的那一步:从RTL到门级网表。它不考虑物理位置,只关心逻辑功能、时序和面积。工具会假设所有单元的延迟是固定的(从库文件里查到的),连线延迟是估算的(基于线负载模型)。

物理综合(Physical Synthesis)则是在布局布线之后,或者与布局布线同步进行的一步。它把物理位置信息(比如单元放在哪、连线有多长)考虑进来,重新优化网表。因为这时候连线延迟不再是估算,而是真实的RC参数。

我用一个表格来对比:

对比项 逻辑综合 物理综合
输入 RTL代码 + 约束 门级网表 + 物理信息
输出 门级网表 优化后的门级网表
延迟模型 线负载模型(估算) 实际RC参数(精确)
主要优化 逻辑结构、面积、功耗 时序收敛、布线拥塞
工具举例 Design Compiler IC Compiler II, Fusion Compiler

为什么会这样?你想想看,逻辑综合阶段连单元放在哪都不知道,它只能靠“猜”连线延迟。而物理综合阶段,单元已经摆好了,连线长度是确定的,这时候的优化才更靠谱。

避坑指南:我曾经在一个项目中,逻辑综合阶段时序全部满足,结果布局布线后时序崩了。原因就是逻辑综合用的线负载模型太乐观,实际连线比估算的长得多。从那以后,我每次做逻辑综合都会留10%~15%的时序余量,给物理阶段留点空间。

3.4 知识体系总览

为了让大家更直观地理解本章的知识结构,我画了一张图:

RTL设计与综合知识体系 Verilog RTL代码 逻辑综合(Logic Synthesis) 翻译 + 优化 + 映射 线负载模型(估算延迟) 输出:门级网表 物理综合(Physical Synthesis) 考虑物理位置和连线 实际RC参数(精确延迟) 优化时序和拥塞

从这张图可以看得很清楚:RTL代码经过逻辑综合变成门级网表,再结合物理信息进行物理综合,最终得到优化后的网表。每一步都有它存在的意义,缺一不可。

3.5 小结

这一章我们聊了三件事:Verilog怎么看、综合是什么、逻辑综合和物理综合有啥不同。说白了,就是从“写代码”到“变成电路”的桥梁。你不需要成为Verilog高手,但一定要理解综合工具是怎么工作的。这样你在写RTL时,才会下意识地写出对后端友好的代码。

嗯,今天就到这里。记住我那句老话:综合不是终点,而是物理设计的起点。后面咱们会一步步深入,把整个流程串起来。


公众号:蓝海资料掘金营,微信deep3321