2. SPICE网表基础结构:网表的构成要素与书写规范

各位同学,今天我们来聊聊SPICE网表的基础结构。说白了,网表就是告诉仿真器“电路长什么样”的文本文件。我刚入行那会儿,总觉得网表就是一堆枯燥的字母和数字,后来才发现——网表写得规范,仿真效率能翻倍,调试时间能砍半。

嗯,咱们先看一个完整的网表长什么样,再拆开来讲每个部分。

核心要点:一个完整的SPICE网表必须包含标题行、元件描述、分析语句和结束语句。缺少任何一项,仿真器都会报错。

2.1 网表的七要素

我习惯把网表拆成七个部分,你想想看,就像盖房子需要地基、框架、屋顶一样,网表也有它的“骨架”。

要素 作用 是否必须
标题 网表的第一行,任意字符串,仿真器忽略其电气含义 是
注释 以 * 或 $ 开头,用于说明电路功能 否
元件 描述电阻、电容、晶体管等器件的连接与参数 是
模型 定义半导体器件的工艺参数(如MOS管的阈值电压) 视情况
分析 指定仿真类型(DC、AC、瞬态等) 是
控制 设置仿真选项、输出变量、初始条件等 否
结束 以 .END 或空行标记网表结束 是

你看,七要素里标题、元件、分析、结束是“铁四角”,缺一不可。模型呢?如果你只用无源器件(电阻、电容),可以没有模型。但只要你用了二极管、MOS管,就必须有模型语句。

2.2 网表书写规范与语法规则

这部分我踩过不少坑。记得有一次,我写了一个反相器网表,仿真死活跑不通。折腾了半天,发现是节点编号写成了 VDD 和 GND,但SPICE默认把字母开头的字符串当成元件名……嗯,从那以后我再也不敢乱用节点名了。

2.2.1 基本语法规则

  • 大小写不敏感:R1 和 r1 是同一个元件。但我个人习惯全部大写,方便阅读。
  • 空格或逗号分隔:元件名、节点、参数之间用空格或逗号隔开。例如 R1 1 0 1k 或 R1,1,0,1k。
  • 续行符:一行写不下时,在行尾加 + 表示下一行继续。这个在写复杂模型时特别有用。
  • 注释行:以 * 开头的行为注释,仿真器完全忽略。行内注释用 $。

我的习惯:每个网表开头都写一段注释,说明电路功能、设计者、版本号。流片回来调试时,你会发现这些注释比亲儿子还亲。

2.2.2 元件命名规则

元件名必须以字母开头,后面可以跟字母、数字或下划线。而且,第一个字母决定了元件类型:

首字母 元件类型 示例
R 电阻 R1 1 0 10k
C 电容 C_load 2 0 1p
L 电感 L_choke 3 4 100u
Q 双极型晶体管(BJT) Q1 1 2 3 npn
M MOS场效应管 M1 d g s b nmos
D 二极管 D1 anode cathode diode_model
V 独立电压源 Vdd 1 0 DC 5V
I 独立电流源 I1 2 0 DC 1mA

你想想看,如果我把一个电阻命名为 R_load,仿真器一看首字母是R,就知道这是个电阻。如果我叫它 Load_R,仿真器会报错——因为它不认识以L开头的电阻。

2.2.3 节点编号规则

节点可以是数字(0、1、2…),也可以是字符串(VDD、CLK、OUT)。但有一个特例:节点0(或GND)是全局地,所有电路必须有一个节点连接到地。

曾经踩过的坑:我在一个差分对网表里,把两个晶体管的源极分别命名为S1和S2,忘了连到一起。结果仿真出来的共模增益完全不对。记住:节点名相同才表示电气连接,拼写差一个字符都不行。

2.3 一个完整的网表示例

光说不练假把式。咱们来看一个CMOS反相器的完整网表:

* CMOS反相器网表
* 设计者:张三  版本:v1.0
VDD 1 0 DC 5V
VIN 2 0 PULSE(0 5 0 1n 1n 50n 100n)
M1 3 2 1 1 pmos W=10u L=1u
M2 3 2 0 0 nmos W=5u L=1u
CL 3 0 1p
.MODEL pmos PMOS (VTO=-0.7 KP=50u)
.MODEL nmos NMOS (VTO=0.7 KP=100u)
.TRAN 1n 200n
.PRINT TRAN V(3)
.END

你看,这个网表包含了:

  • 标题行(第一行注释)
  • 元件描述(VDD、VIN、M1、M2、CL)
  • 模型定义(.MODEL pmos/nmos)
  • 分析语句(.TRAN 瞬态分析)
  • 输出控制(.PRINT 打印节点3的电压)
  • 结束语句(.END)

我个人习惯把电源和输入信号放在最前面,然后是晶体管,最后是无源器件。这样别人看网表时,一眼就能找到关键信息。

2.4 网表结构知识图谱

下面这张图总结了网表的整体结构,我建议你把它存下来,写网表时对照着看:

SPICE网表结构知识图谱 SPICE网表 标题(必须) 注释(可选) 元件(必须) 模型(视情况) 分析(必须) 控制(可选) 结束(必须) 书写规范要点 • 元件名首字母决定类型(R=电阻,M=MOS管,Q=BJT…) • 节点0为全局地,所有电路必须接地 • 续行符为行尾加 +,注释用 * 或 $ 写标题 定义元件 设置分析 .END结束 网表编写流程:标题 → 元件 → 分析 → 结束(模型和控制按需插入)

2.5 常见错误与避坑指南

最后,我把自己这些年遇到的网表错误总结一下,你写网表时对照检查:

  • 忘记标题行:仿真器会把第一行当成标题,但如果你第一行写了元件,它不会报错,只是那个元件被忽略了。我曾经因为这个让一个运放少了输入对管,仿真结果完全不对。
  • 节点悬空:所有节点必须至少连接两个元件。只有一个连接的节点叫“浮空节点”,仿真器会警告甚至报错。
  • 模型名拼写错误:.MODEL nmos NMOS 和 .MODEL nmos NOMS 差一个字母,仿真器直接罢工。
  • 单位后缀:SPICE支持 k(千)、m(毫)、u(微)、n(纳)、p(皮)。注意 m 是毫,M 也是毫(不是兆!)。兆要用 MEG。

调试小技巧:仿真报错时,先检查网表最后一行是不是 .END。我见过太多人把 .END 写成 END 或 .end(虽然大小写不敏感,但少了点号就不行)。