3. SPICE 网表基础语法:从标题行到节点编号

各位同学,今天我们来聊聊 SPICE 网表的基础语法。说白了,网表就是电路仿真世界的「通用语言」。你画了个原理图,最终都要翻译成网表,仿真器才能读懂。我刚开始学 SPICE 时,总觉得这玩意儿不就是个文本文件嘛,后来踩了不少坑才明白——语法细节决定仿真成败。

3.1 网表的基本骨架

一个完整的 SPICE 网表,由五个核心部分组成。我习惯把它们叫做「五件套」:

组成部分 关键字/格式 作用
标题行 第一行任意文本 标识电路名称或描述
注释 以 * 或 $ 开头 添加说明,仿真器忽略
电路描述 元件语句 + 模型语句 定义电路拓扑和参数
控制语句 .TRAN、.AC、.DC 等 设置仿真类型和参数
结束语句 .END 告诉仿真器:网表到此为止

重要提醒:标题行是强制要求的!哪怕你写个空格或一个字母都行,但绝对不能省略。我曾经见过有人删了标题行,结果仿真器直接报错退出——嗯,这个坑我替你们踩过了。

3.2 标题行:网表的「身份证」

标题行就是网表的第一行。它没有固定格式,随便写什么都行。但我建议你养成好习惯:写上电路名称、版本号、日期。

Simple RC Low-Pass Filter - v1.0 - 2025-01-15

为什么强调这个?你想想看,半年后你翻出一个网表文件,如果第一行是 test circuit,你还能记得这是测什么的吗?反正我记不住。

3.3 注释:给自己留条后路

注释以星号 * 或美元符号 $ 开头。仿真器看到这两个符号,直接跳过整行或行内剩余内容。

* This is a comment line
R1 1 0 1k   $ This is an inline comment

我的习惯:复杂电路我会在关键节点加注释,比如 $ Vcc = 5V, node 10。调试时不用来回翻原理图,省事很多。

3.4 电路描述:核心中的核心

电路描述部分就是元件清单。每个元件占一行,格式非常固定:

<元件名> <正节点> <负节点> <参数>

举个例子:

R1 1 0 1k
C1 1 0 10u
V1 1 0 DC 5V

这里 R1 是电阻,接在节点 1 和地(0)之间,阻值 1kΩ。元件名的第一个字母决定了元件类型——这是 SPICE 的硬规则。

首字母 元件类型 示例
R 电阻 Rload 2 0 100
C 电容 Cbypass 2 0 0.1u
L 电感 Lchoke 1 2 10m
V 独立电压源 Vdd 1 0 DC 3.3
I 独立电流源 Iin 0 1 DC 1m
M MOSFET M1 d g s b nmos
Q BJT Q1 c b e npn

注意:元件名不能以数字开头!1R 是非法的,必须写成 R1。另外,元件名长度一般不超过 8 个字符,虽然现代 SPICE 放宽了限制,但老版本会截断——我吃过这个亏。

3.5 控制语句:告诉仿真器怎么干活

控制语句以点号 . 开头。它们不描述电路,而是告诉仿真器:做什么分析、输出什么结果。

.TRAN 1u 10m        $ 瞬态分析,步长1us,时长10ms
.AC DEC 10 1 1MEG   $ 交流分析,10倍频/十倍频,1Hz~1MHz
.DC Vdd 0 5 0.1     $ 直流扫描,Vdd从0V到5V,步长0.1V
.PROBE               $ 保存所有节点电压用于波形查看
.OPTIONS RELTOL=1m  $ 设置相对误差容限

我个人建议:控制语句放在电路描述之后、.END 之前。虽然 SPICE 不强制顺序,但这样读起来最顺。

3.6 结束语句:画上句号

结束语句就一行:

.END

注意,.END 后面不能有任何字符(注释也不行)。有些 SPICE 变体允许 .ENDS,但标准 SPICE 只认 .END。

避坑指南:我曾经在一个 500 行的网表里漏写了 .END,结果仿真器一直读到文件末尾,把后面的空白行当成元件描述,报了一堆莫名其妙的错误。排查了半小时才找到原因——从那以后,我写完网表第一件事就是检查 .END 有没有漏掉。

3.7 节点编号规则:电路的「坐标系统」

节点编号就是给电路中的连接点起名字。SPICE 的规则其实很简单:

  • 0 或 GND:全局地节点,每个电路必须有且只有一个地节点
  • 正整数:如 1、2、10、100,局部节点
  • 字母开头的字符串:如 Vcc、Vout、clk,命名节点

举个例子:

Vcc 1 0 DC 5V
R1 1 2 1k
C1 2 0 10u
Rload 2 0 10k

这里节点 1 是电源正极,节点 2 是输出端,节点 0 是地。用数字还是用名字?我个人的经验是:

  • 小电路(少于 10 个节点):用数字,简单直接
  • 大电路(超过 10 个节点):用名字,可读性强

关键规则:节点编号不能以数字开头!5V 是非法的,但 V5 合法。另外,节点名区分大小写吗?标准 SPICE 不区分,但有些变体区分——为了保险,我统一用小写。

3.8 完整网表示例

把上面所有知识点串起来,一个完整的网表长这样:

RC Low-Pass Filter Example
* Author: Zhang San
* Date: 2025-01-15
*
V1 in 0 DC 5V AC 1V
R1 in out 1k
C1 out 0 10u
Rload out 0 10k
*
.TRAN 1u 10m
.AC DEC 10 1 1MEG
.PROBE
.END

你看,结构非常清晰:标题行 → 注释 → 元件描述 → 控制语句 → 结束语句。每个部分各司其职,缺一不可。

3.9 知识体系总览

下面这张图帮你把本章的知识点串起来:

SPICE网表基础语法知识体系 SPICE 网表基础语法结构 SPICE 网表 标题行(第一行) 注释(* 或 $) 电路描述(元件语句) 控制语句(.TRAN/.AC等) 结束语句(.END) 节点编号规则 0/GND = 全局地 | 正整数 = 局部节点 | 字母开头字符串 = 命名节点(如 Vcc、Vout)

这张图把网表的五个组成部分和节点编号规则都串起来了。你写网表时,就按这个结构从上往下写,保证不会乱。

3.10 常见错误与避坑

最后,我总结几个新手最容易犯的错误:

  • 漏写标题行:仿真器直接报错,没有商量余地
  • 节点 0 悬空:电路没有地,仿真结果全是 NaN
  • 元件名首字母错误:比如用 R1 表示电阻,写成 r1 在某些版本中不识别
  • 参数单位写错:1k 是 1000,1K 在某些版本中是开尔文温度——嗯,我当年就犯过这个错
  • 漏写 .END:仿真器读到文件尾,报一堆莫名其妙的语法错误

特别提醒:节点编号不要用 0 以外的数字作为地!有些同学习惯用 GND 作为节点名,但 SPICE 只认 0 为全局地。如果你用 GND,它只是一个普通节点,和 0 是两回事——这个坑我见过不止一次。