3. 逻辑综合与网表:综合工具介绍、网表生成、网表与RTL的对应关系
好,咱们接着聊。前面你写好了RTL,仿真也过了,感觉万事大吉了是吧?
别急,真正的「硬仗」才刚开始。RTL代码说白了是一份「设计蓝图」,而芯片制造厂要的是「施工图纸」。这个从蓝图到图纸的转换过程,就是逻辑综合。
我个人习惯把综合比作「翻译+优化」。你给工具一份RTL,它先读懂你要什么功能,然后从自己的元件库里挑出合适的标准单元(比如与门、或门、触发器),最后再根据你的要求(速度、面积、功耗)把这些单元摆成最优的结构。嗯,这一步做不好,后面后端跑断腿也救不回来。
3.1 综合工具:三足鼎立
市面上主流的综合工具,说白了就三家。我这些年基本都用过,各有各的脾气。
| 工具名称 | 厂商 | 我的评价 |
|---|---|---|
| Design Compiler (DC) | Synopsys | 行业老大哥,生态最全,文档最多。我入行时用的就是它,稳定可靠,但脚本语法有点老派。 |
| Genus | Cadence | 后起之秀,Tcl脚本更现代,综合速度很快。我在一个28nm的项目里用过,QoR(质量结果)跟DC不相上下。 |
| Yosys | 开源 | 适合教学和FPGA原型验证。流片项目别碰,它不支持先进工艺的库,但用来理解综合原理非常棒。 |
我的建议: 如果你刚入门,先死磕DC。因为市面上90%的旧项目和老工程师都在用DC。学会了DC,看Genus的脚本基本一天就能上手。
3.2 网表生成:从代码到元件
综合工具吃进去的是RTL,拉出来的是网表。网表长什么样?说白了就是一个巨大的文本文件,里面全是例化语句。
举个例子,你写了一段简单的RTL:
module my_logic (input a, b, output y);
assign y = a & b;
endmodule
综合之后,网表大概长这样:
module my_logic ( a, b, y );
input a, b;
output y;
wire n_0;
AND2X1 U1 ( .A(a), .B(b), .Y(y) );
endmodule
看到了吗?AND2X1 就是标准单元库里的一个两输入与门。工具自动帮你把逻辑表达式映射到了具体的物理单元上。
注意: 网表里没有「if-else」,没有「case」。所有的行为级描述都被展开成了组合逻辑和触发器的互连。我曾经见过一个新人,在综合后的网表里找always块,找了半天没找到,急得满头大汗。记住,网表是结构级的,不是行为级的。
3.3 网表与RTL的对应关系:一对多与多对一
这是很多工程师容易迷糊的地方。RTL和网表不是一一对应的。
一对多: 同一段RTL,用不同的综合策略(比如面积优先 vs 速度优先),会生成完全不同的网表。我做过一个对比实验:同样的加法器,面积优化模式下用了32个门,速度优化模式下用了56个门,但延迟降低了40%。
多对一: 不同的RTL写法,可能综合出完全相同的网表。比如:
// 写法A
assign y = (sel) ? a : b;
// 写法B
always @(*) begin
if(sel) y = a;
else y = b;
end
这两种写法,综合工具最终都会映射成一个二选一的多路选择器(MUX2)。所以别纠结语法风格,工具比你想象的聪明。
核心要点: 综合的本质是「逻辑等价变换」。RTL描述的是「你要什么功能」,网表描述的是「用什么元件实现这个功能」。只要功能等价,网表可以千变万化。
3.4 避坑指南:综合后的检查
综合跑完,别急着往后端扔。我建议你做三件事:
- 检查未映射的线网: 跑一下
report_timing和report_area。如果发现大量UNCONNECTED或WIRE_AND,说明你的RTL里有悬空信号,或者综合工具没理解你的意图。 - 形式验证: 用Formality或Conformal做一次RTL vs 网表的等价性检查。我曾经有一次,因为手改了一行网表(ECO),结果功能对不上了,幸亏形式验证抓了出来,不然流片回来就是废片。
- 看log文件: 别只看图形界面。log里经常有
Warning: … inferred latch或者Warning: … multiple drivers。这些警告,十个里有八个是设计隐患。
一个小技巧: 综合完成后,用
write -f verilog 输出网表,然后用 write_sdc 输出时序约束。这两个文件是后端流程的「入场券」。我习惯在综合脚本里加一句 redirect -file ./reports/check_design.rpt {check_design},把所有的设计规则检查结果存下来,方便回头排查。
嗯,逻辑综合这块,说白了就是「把想法变成现实」的第一步。你写RTL时觉得「这功能很简单啊」,但综合工具会告诉你:「你这个写法,面积会爆炸」或者「这条路径时序收敛不了」。多听听工具的意见,你会少走很多弯路。