4. 网表基础:SPICE网表格式解析、Verilog网表格式解析、网表层级结构理解

做LVS比对,说白了就是拿版图提取的网表和原始电路网表做“找茬”游戏。但你要是连网表都看不懂,这游戏就没法玩。我见过不少新人,一打开SPICE网表就头大,密密麻麻全是器件和节点。其实没那么可怕,今天我就带你把它拆开揉碎了讲清楚。

4.1 SPICE网表格式解析

SPICE网表是芯片后端最底层的“语言”。它描述的是:什么器件,连在什么节点上,参数是多少。LVS工具读的原始电路网表,绝大多数都是SPICE格式。

一个标准的SPICE网表,长这样:

* 这是一个简单的反相器网表
.SUBCKT INV A Z VDD VSS
M1 Z A VDD VDD PMOS W=0.5u L=0.18u
M2 Z A VSS VSS NMOS W=0.2u L=0.18u
.ENDS INV

* 顶层电路
.SUBCKT TOP VDD VSS
XI1 A B VDD VSS INV
XI2 B C VDD VSS INV
.ENDS TOP

我来逐行拆解一下:

  • 第一行:以 * 开头的是注释,工具会忽略它。我习惯在网表头部写清楚功能、作者、版本,方便后续追溯。
  • .SUBCKT:定义一个子电路模块。后面跟模块名和端口列表。比如 INV A Z VDD VSS,意思是反相器有四个端口:输入A、输出Z、电源VDD、地VSS。
  • M1/M2:MOS管描述。格式是 M<名字> <漏极> <栅极> <源极> <衬底> <模型名> W=<宽度> L=<长度>。注意,PMOS和NMOS的衬底分别接VDD和VSS,这是CMOS工艺的基本要求。
  • .ENDS:结束子电路定义。
  • XI1/XI2:实例化子电路。格式是 X<名字> <端口连接> <子电路名>。这里 XI1 A B VDD VSS INV 就是把INV模块放进来,端口A接A,输出接B,电源接VDD,地接VSS。

核心要点:SPICE网表里,节点名就是“线”的名字。同一个节点名出现在不同器件上,就表示它们连在一起。LVS比对时,工具就是靠这些节点名来匹配连接关系的。

我在项目中遇到过一种情况:版图提取的网表里,电源节点叫 VDD!,但原始网表里叫 VDD。就多了一个感叹号,LVS报了一大堆“节点不匹配”的错误。排查了半天才发现是命名不一致。所以,网表里的节点名一定要统一,这是基本功。

4.2 Verilog网表格式解析

Verilog网表在数字芯片设计中更常见。它不像SPICE那样描述晶体管,而是描述门级逻辑单元和它们之间的连线。说白了,Verilog网表是“数字版”的网表。

举个例子:

module TOP (VDD, VSS, A, C);
input A;
output C;
inout VDD, VSS;

wire B;

INV U1 (.A(A), .Z(B), .VDD(VDD), .VSS(VSS));
INV U2 (.A(B), .Z(C), .VDD(VDD), .VSS(VSS));

endmodule

你看,这和SPICE网表是不是很像?只是语法不同:

  • module/endmodule:定义模块,相当于SPICE里的.SUBCKT/.ENDS。
  • input/output/inout:声明端口方向。注意,Verilog网表里电源和地通常声明为 inout,因为它们在芯片内部是双向的。
  • wire:声明内部连线。这里 wire B 就是U1的输出和U2的输入之间的那根线。
  • INV U1 (...):实例化一个叫INV的单元,名字叫U1。括号里是端口连接,格式是 .端口名(连线名)。比如 .A(A) 表示INV的A端口接到顶层的A线上。

小技巧:Verilog网表里,端口名和连线名可以不一样。比如 .A(IN1) 也是合法的。但为了可读性,我建议尽量保持一致。否则LVS报错时,你光是对应端口名就得花半天时间。

你可能会问:“为什么数字后端要用Verilog网表,而不是直接用SPICE?” 原因很简单:效率。一个几百万门的数字芯片,如果用SPICE网表描述,文件大小会大到无法处理。Verilog网表只描述逻辑连接,不关心晶体管尺寸,所以文件小、处理快。但最终LVS比对时,工具会把Verilog网表“翻译”成SPICE网表,或者直接比对两种格式——这取决于工具的能力。

4.3 网表层级结构理解

网表不是一坨乱麻,它是有层级的。理解层级结构,是高效排查LVS错误的关键。我见过有人拿着扁平化的网表,对着几万个器件一个一个查,那效率太低了。

层级结构说白了就是“套娃”:顶层模块调用子模块,子模块再调用更小的模块,直到最底层的标准单元或晶体管。比如:

TOP (芯片顶层)
├── CORE (核心逻辑)
│   ├── CPU (处理器)
│   │   ├── ALU (运算器)
│   │   │   ├── AND2 (与门)
│   │   │   ├── OR2 (或门)
│   │   │   └── INV (反相器)
│   │   └── REG (寄存器)
│   └── MEM (存储器)
└── IO (输入输出)
    ├── PAD (焊盘)
    └── ESD (静电保护)

这张图我用SVG画出来,方便你直观理解:

TOP (芯片顶层) CORE (核心逻辑) MEM (存储器) IO (输入输出) CPU (处理器) ALU (运算器) REG (寄存器) AND2 OR2 INV PAD (焊盘) ESD (静电保护)

为什么要理解层级?因为LVS报错时,它会告诉你错误发生在哪个层级。比如它说“TOP/CORE/CPU/ALU/INV 的M1尺寸不匹配”。你一看就知道,问题出在ALU模块里的那个反相器上。你直接定位到那个模块,打开它的网表,检查M1的W和L值,问题就解决了。

注意:有些LVS工具会把网表“扁平化”处理,也就是把所有层级都展开,变成一层。这时候报错信息里就没有层级路径了,只有器件名。排查起来会非常痛苦。所以我建议,在LVS设置里一定要开启“保留层级”选项。这是我踩过的坑,有一次忘了开,结果一个简单的尺寸错误查了整整两天。

另外,网表层级和版图层级必须一致。什么意思呢?如果原始网表里有一个叫 ALU 的子模块,那么版图里也必须有一个对应的 ALU 模块。如果版图里把ALU的晶体管打散了,没有单独画成一个模块,LVS就会报“层级不匹配”的错误。这时候你需要决定:是改版图,还是改网表?我个人建议尽量保持版图和网表的层级一致,这样后续的ECO(工程变更)会方便很多。

嗯,网表基础就讲到这里。记住三句话:SPICE网表看器件和节点,Verilog网表看逻辑和连线,层级结构看模块和调用。把这三点吃透了,LVS比对你就已经成功了一半。


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