1. SPICE 网表基础:网表结构、元件声明、节点编号规则、注释语法
SPICE 网表是描述电路拓扑与元件参数的文本化语言,是器件建模与仿真的核心输入。一个合法的网表必须遵循严格的语法规则,任何格式错误都会导致仿真中断或结果异常。本节将系统讲解网表的结构骨架、元件声明方式、节点编号约定以及注释语法,为后续的语法调试打下坚实基础。
1.1 网表结构:标题行、元件行、控制行、结束行
一个完整的 SPICE 网表由四个逻辑区域组成,顺序固定,缺一不可。下表总结了各区域的职责与语法要点:
| 区域 | 位置 | 语法要点 | 示例 |
|---|---|---|---|
| 标题行 | 第一行 | 任意字符串,不能以数字或点号开头;被仿真器忽略,仅作标识 | CMOS Inverter Netlist |
| 元件行 | 标题行之后 | 每行声明一个元件,格式:<类型> <节点1> <节点2> ... <模型名> <参数> |
M1 D G S B NMOS W=1u L=0.18u |
| 控制行 | 元件行之后 | 以点号 . 开头,定义仿真类型、模型参数、分析指令等 |
.model NMOS NMOS (VTO=0.7 KP=200u) |
| 结束行 | 最后一行 | 必须为 .END,表示网表结束 |
.END |
调试要点: 标题行不能省略,否则仿真器会将第一行元件行误读为标题。结束行
.END 后不能有任何字符(包括空格和注释),否则部分仿真器会报“未识别语句”错误。
以下是一个完整的 SPICE 网表示例,展示了四个区域的衔接:
Simple NMOS I-V Curve Test
VDS D 0 DC 1.0
VGS G 0 DC 0.8
M1 D G 0 0 NMOS W=10u L=1u
.model NMOS NMOS (VTO=0.5 KP=120u GAMMA=0.4)
.dc VGS 0 1.2 0.05
.probe
.end
1.2 元件声明:类型前缀与节点顺序
SPICE 使用单字母前缀区分元件类型,每个元件行的节点顺序由元件类型决定,不可随意调换。下表列出了最常用的元件前缀及其节点连接规则:
| 前缀 | 元件类型 | 节点顺序(按网表书写顺序) | 示例 |
|---|---|---|---|
R |
电阻 | 正节点 负节点 阻值 | R1 1 0 1k |
C |
电容 | 正节点 负节点 容值 | C1 1 0 10p |
L |
电感 | 正节点 负节点 感值 | L1 1 0 5n |
D |
二极管 | 阳极 阴极 模型名 | D1 1 0 DIODE_MODEL |
M |
MOSFET | 漏极 栅极 源极 衬底 模型名 | M1 D G S B NMOS_MODEL |
Q |
BJT | 集电极 基极 发射极 模型名 | Q1 C B E NPN_MODEL |
V |
独立电压源 | 正节点 负节点 电压值/波形 | VDD VDD 0 DC 3.3 |
I |
独立电流源 | 正节点 负节点 电流值/波形 | IIN 0 1 DC 1m |
常见错误: MOSFET 的节点顺序是 漏-栅-源-衬,不是栅-漏-源-衬。初学者常将栅极和漏极位置互换,导致仿真结果完全错误。调试时请优先核对元件行的节点顺序。
1.3 节点编号规则:数字节点与命名节点
SPICE 中的节点用于连接元件,节点编号必须遵循以下规则:
- 数字节点: 0 必须为地节点(全局参考点),不可用于其他连接。其他正整数(1, 2, 3, …)可作为内部节点。
- 命名节点: 使用字母开头的字符串(如
VDD、OUT、CLK),长度不超过 1024 字符(视仿真器而定),不区分大小写。 - 全局节点: 以
$G_或$开头的节点名(如$G_VDD)可在子电路间共享。 - 节点命名限制: 不能以数字开头,不能包含空格、制表符、括号、等号等特殊字符。
下表对比了合法与不合法的节点命名:
| 节点名 | 合法性 | 说明 |
|---|---|---|
0 |
✅ 合法 | 全局地节点,每个网表必须至少有一个 0 节点 |
VDD |
✅ 合法 | 字母开头,无特殊字符 |
net_123 |
✅ 合法 | 下划线允许使用 |
3V3 |
❌ 非法 | 以数字开头,仿真器会解析为数字节点 3 和字符串 V3 |
VDD+OUT |
❌ 非法 | 包含加号,被解析为表达式 |
CLK (1) |
❌ 非法 | 包含空格和括号 |
调试技巧: 当仿真器报“Node not found”或“Invalid node name”时,首先检查节点名是否以数字开头或包含特殊字符。使用纯数字节点(如 1, 2, 3)可以避免命名冲突,但可读性较差,建议在小型测试电路中使用。
1.4 注释语法:行注释与行内注释
SPICE 支持两种注释方式,用于提高网表可读性:
- 行注释: 以星号
*开头,整行被仿真器忽略。通常用于文件头说明、版本信息、修改记录。 - 行内注释: 以美元符号
$开头,从$到行尾的内容被忽略。用于对单个元件或参数做简短说明。
* This is a full-line comment
* Netlist: NMOS I-V Curve, Rev 1.2
VDS D 0 DC 1.0 $ Drain voltage = 1.0V
VGS G 0 DC 0.8 $ Gate voltage = 0.8V
M1 D G 0 0 NMOS W=10u L=1u $ NMOS transistor
.model NMOS NMOS (VTO=0.5 KP=120u) $ Model definition
.dc VGS 0 1.2 0.05 $ DC sweep analysis
.end
注意: 部分 SPICE 变体(如 HSPICE)支持以
// 或 # 作为注释符,但标准 SPICE 只识别 * 和 $。跨平台调试时,建议仅使用标准注释语法,避免兼容性问题。
1.5 网表结构总览图
下图以 SVG 形式展示了 SPICE 网表的完整结构,从标题行到结束行的逻辑流向,以及各区域的典型内容:
1.6 常见语法错误速查表
在编写 SPICE 网表时,以下语法错误最为高频。建议在调试时逐项排查:
| 错误类型 | 典型表现 | 排查方向 |
|---|---|---|
| 缺少标题行 | 仿真器将第一行元件行当作标题忽略 | 确保第一行是任意字符串,不是元件声明 |
| 缺少结束行 | 仿真器报 "Unexpected end of file" | 在文件末尾添加 .END |
| 节点名以数字开头 | 报 "Invalid node name" 或解析异常 | 将节点名改为字母开头,如 VDD 而非 3V3 |
| MOSFET 节点顺序错误 | 仿真结果与预期完全不符 | 核对顺序:漏极 栅极 源极 衬底 |
| 控制行前有空格 | 控制行被当作元件行解析 | 确保 . 在行首,前面无空格 |
| 注释符使用不当 | 仿真器报 "Unrecognized statement" | 使用 * 做行注释,$ 做行内注释 |
| 元件前缀错误 | 报 "Unknown device type" | 检查前缀是否在支持列表中(R/C/L/D/M/Q/V/I) |
调试工作流: 当仿真报错时,按以下顺序排查:① 检查
.END 是否存在且无多余字符;② 检查标题行是否存在;③ 检查所有控制行是否以 . 开头且无前导空格;④ 检查所有元件行的节点顺序是否与类型匹配;⑤ 检查节点名是否合法。按照这个流程,90% 的语法错误可以在 2 分钟内定位。