一、逻辑综合:从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_X1 | 1x | 0.5 | 0.12 |
| NAND2_X2 | 2x | 0.8 | 0.08 |
| NAND2_X4 | 4x | 1.4 | 0.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输入开始,经过转换、优化、映射三个阶段,最终输出门级网表。同时,时序优化和面积权衡贯穿始终。
我个人觉得,综合阶段花的时间越多,后面物理设计就越省心。我见过太多项目,综合阶段草草了事,结果到了布局布线阶段发现时序收敛不了,最后只能返工重做。
避坑指南:我曾经在一个项目中,综合时没有设置合理的时钟约束,结果工具把关键路径优化得过于激进,导致功耗超标。后来花了整整两周才把功耗降下来。所以,约束一定要给准,这是综合的第一步。
好了,关于逻辑综合的基本流程和优化策略,就讲到这里。记住,综合不是终点,而是物理设计的起点。一个好的综合结果,能让后续工作事半功倍。
公众号:蓝海资料掘金营,微信deep3321