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 网表结构知识图谱
下面这张图总结了网表的整体结构,我建议你把它存下来,写网表时对照着看:
2.5 常见错误与避坑指南
最后,我把自己这些年遇到的网表错误总结一下,你写网表时对照检查:
- 忘记标题行:仿真器会把第一行当成标题,但如果你第一行写了元件,它不会报错,只是那个元件被忽略了。我曾经因为这个让一个运放少了输入对管,仿真结果完全不对。
- 节点悬空:所有节点必须至少连接两个元件。只有一个连接的节点叫“浮空节点”,仿真器会警告甚至报错。
- 模型名拼写错误:
.MODEL nmos NMOS和.MODEL nmos NOMS差一个字母,仿真器直接罢工。 - 单位后缀:SPICE支持
k(千)、m(毫)、u(微)、n(纳)、p(皮)。注意m是毫,M也是毫(不是兆!)。兆要用MEG。
调试小技巧:仿真报错时,先检查网表最后一行是不是 .END。我见过太多人把 .END 写成 END 或 .end(虽然大小写不敏感,但少了点号就不行)。