一、逻辑综合:从RTL到门级网表的“翻译官”

逻辑综合,说白了就是把我们写的RTL代码,翻译成芯片能用的门级网表。这个过程有点像把中文小说翻译成英文——既要保留原意,又要符合目标语言的表达习惯。

我个人习惯把综合分成三个阶段:转换、逻辑优化、门级映射。这三个阶段环环相扣,任何一个环节出问题,后面物理设计都会很难受。

1.1 转换阶段:RTL的“语法分析”

综合工具拿到RTL代码后,先做语法检查。就像编译器检查C语言代码一样,工具会看你的Verilog或VHDL有没有语法错误。

我记得刚入行时,写过一段代码:

always @(posedge clk) begin
    if (rst) 
        q <= 0;
    else 
        q <= d;
end

工具会把这个always块解析成一个D触发器。但如果你写的是组合逻辑,比如:

assign y = a & b | c;

工具就会把它解析成与门和或门的组合。这个阶段,工具其实是在构建一个布尔函数表达式,还没涉及到具体的门电路。

1.2 逻辑优化阶段:化简与重构

这个阶段是综合的核心。工具会对布尔表达式进行化简,去掉冗余的逻辑。

举个例子,你写了:

assign y = (a & b) | (a & ~b);

工具会把它优化成:

assign y = a;

为什么会这样?因为不管b是0还是1,结果都只取决于a。这种化简在复杂设计中能节省大量面积。

关键点:逻辑优化分为两类——

  • 与工艺无关的优化:比如布尔化简、资源共享
  • 与工艺相关的优化:比如根据标准单元库的驱动能力调整门尺寸

我曾经遇到过一个项目,RTL代码里写了大量的case语句,综合后面积超标。后来发现是case语句没有写default分支,工具生成了很多锁存器。加上default后,面积直接降了30%。

1.3 门级映射阶段:从逻辑到物理

这个阶段,工具会把优化后的逻辑表达式,映射到目标工艺库的标准单元上。

比如,一个2输入的与非门(NAND2),在库里有多种尺寸:

单元名称驱动能力面积(μm²)延迟(ns)
NAND2_X11x0.50.12
NAND2_X22x0.80.08
NAND2_X44x1.40.05

工具会根据时序约束,选择合适的尺寸。时序紧张的地方用大尺寸单元,不紧张的地方用小尺寸单元。这就是面积与速度的权衡

二、时序优化策略:让芯片跑得快

综合中的时序优化,说白了就是让信号在门之间传得快一点。我总结了几个常用策略:

2.1 路径重定时(Retiming)

这个技术挺有意思。它通过移动寄存器位置,来平衡各段路径的延迟。

举个例子,假设有两级逻辑:

// 原始设计
always @(posedge clk) begin
    reg1 <= a & b;      // 延迟 0.5ns
    reg2 <= reg1 | c;   // 延迟 0.7ns
end

第一级延迟0.5ns,第二级0.7ns。时钟周期如果是1ns,第二级就有点紧张。工具可以把寄存器往前移:

// 重定时后
always @(posedge clk) begin
    reg1 <= a & b | c;  // 延迟 0.6ns
    reg2 <= reg1;       // 延迟 0.1ns
end

这样两段路径都变成了0.6ns,时序就均衡了。

小技巧:重定时对流水线设计特别有效。我建议在综合时开启retiming选项,但要注意它可能会改变仿真行为。

2.2 逻辑结构重构

有时候,换个写法就能改善时序。比如:

// 链式结构,延迟大
assign y = a & b & c & d & e;

// 树形结构,延迟小
assign y = (a & b) & (c & d) & e;

链式结构需要4级门延迟,树形结构只需要3级。在关键路径上,这种优化能省下不少时间。

2.3 单元尺寸调整(Gate Sizing)

这是综合工具最常用的优化手段。大尺寸单元驱动能力强,但面积大、功耗高。小尺寸单元反之。

工具会先使用小尺寸单元,然后在时序违例的路径上,逐步替换成大尺寸单元。这个过程叫增量式优化

注意:不要把所有单元都设成大尺寸。我曾经见过一个新手,为了时序把整个设计都用了X4单元,结果面积翻倍、功耗超标,最后还得改回来。

三、面积与速度的权衡:没有免费的午餐

在芯片设计里,速度和面积是一对矛盾体。你想跑得快,就得用大尺寸单元,面积就大。你想省面积,就得用小尺寸单元,速度就慢。

我一般遵循这几个原则:

  • 关键路径优先:只对时序紧张的路径使用大尺寸单元
  • 非关键路径用最小尺寸:能省则省
  • 共享资源:比如多个模块共用同一个加法器
  • 使用多阈值电压单元:高速路径用低阈值,低速路径用高阈值

嗯,这里要注意一点:面积优化不能只看单元数量,还要看布线资源。有时候单元少了,但布线绕来绕去,反而更慢。

四、知识体系总览

下面这张图,是我对本章内容的总结。它展示了逻辑综合的完整流程,以及各阶段之间的关系。

逻辑综合知识体系 阶段一:转换 RTL语法解析 构建布尔表达式 阶段二:优化 布尔化简 资源共享 阶段三:映射 工艺库匹配 单元尺寸选择 时序优化策略 • 路径重定时 (Retiming) • 逻辑结构重构 • 单元尺寸调整 • 多阈值电压单元 面积与速度权衡 • 关键路径优先 • 非关键路径最小化 • 资源共享 • 多Vt单元混合使用 输出产物 门级网表 时序约束文件 面积报告 功耗报告 核心思想 综合不是简单的翻译,而是在时序、面积、功耗之间寻找最优平衡点 好的综合结果,能为后续物理设计打下坚实基础

这张图把整个流程串起来了。从RTL输入开始,经过转换、优化、映射三个阶段,最终输出门级网表。同时,时序优化和面积权衡贯穿始终。

我个人觉得,综合阶段花的时间越多,后面物理设计就越省心。我见过太多项目,综合阶段草草了事,结果到了布局布线阶段发现时序收敛不了,最后只能返工重做。

避坑指南:我曾经在一个项目中,综合时没有设置合理的时钟约束,结果工具把关键路径优化得过于激进,导致功耗超标。后来花了整整两周才把功耗降下来。所以,约束一定要给准,这是综合的第一步。

好了,关于逻辑综合的基本流程和优化策略,就讲到这里。记住,综合不是终点,而是物理设计的起点。一个好的综合结果,能让后续工作事半功倍。


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