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 避坑指南:综合后的检查

综合跑完,别急着往后端扔。我建议你做三件事:

  1. 检查未映射的线网: 跑一下 report_timingreport_area。如果发现大量 UNCONNECTEDWIRE_AND,说明你的RTL里有悬空信号,或者综合工具没理解你的意图。
  2. 形式验证: 用Formality或Conformal做一次RTL vs 网表的等价性检查。我曾经有一次,因为手改了一行网表(ECO),结果功能对不上了,幸亏形式验证抓了出来,不然流片回来就是废片。
  3. 看log文件: 别只看图形界面。log里经常有 Warning: … inferred latch 或者 Warning: … multiple drivers。这些警告,十个里有八个是设计隐患。
一个小技巧: 综合完成后,用 write -f verilog 输出网表,然后用 write_sdc 输出时序约束。这两个文件是后端流程的「入场券」。我习惯在综合脚本里加一句 redirect -file ./reports/check_design.rpt {check_design},把所有的设计规则检查结果存下来,方便回头排查。

嗯,逻辑综合这块,说白了就是「把想法变成现实」的第一步。你写RTL时觉得「这功能很简单啊」,但综合工具会告诉你:「你这个写法,面积会爆炸」或者「这条路径时序收敛不了」。多听听工具的意见,你会少走很多弯路。