4. SPICE 网表结构:标准语法、子电路与模型调用

SPICE 网表是集成电路设计中最底层的电路描述语言。无论是 BSIM 模型还是 PSP 模型,最终都必须通过标准的 SPICE 网表语法被仿真器识别和调用。本章将系统讲解标准 SPICE 网表的结构、子电路定义规则以及模型调用的核心方法,为后续的模型移植操作打下坚实的语法基础。

4.1 标准 SPICE 网表语法基础

一个完整的 SPICE 网表由若干行组成,每行代表一个电路元件、模型定义或控制语句。网表文件通常以 .sp、.cir 或 .net 为扩展名。其基本结构遵循以下规则:

  • 标题行:网表的第一行必须是标题行,仿真器会忽略该行的电路含义,仅作为注释。
  • 注释行:以星号 * 开头的行被视作注释,不参与仿真。
  • 元件语句:格式为 <元件类型><节点连接> <参数值>。
  • 模型语句:格式为 .MODEL <模型名> <模型类型> <参数列表>。
  • 控制语句:以点 . 开头,如 .DC、.AC、.TRAN、.OPTIONS 等。
  • 结束行:网表必须以 .END 语句结束。
关键语法规则:
  • 节点编号必须为整数,0 号节点固定为全局地(GND)。
  • 元件名称的第一个字母代表元件类型(如 R 表示电阻,M 表示 MOSFET)。
  • 参数值可以使用科学计数法(如 1e-6 表示 1μ)。
  • 行末可以使用反斜杠 \ 进行续行。

以下是一个标准 SPICE 网表的完整示例:

* Simple NMOS Inverter Netlist
VDD 1 0 DC 5V
VIN 2 0 DC 0V PULSE(0 5 0 1n 1n 10n 20n)
M1 3 2 0 0 NMOS W=10u L=0.18u
R1 1 3 10k
.MODEL NMOS NMOS (VTO=0.7 KP=200e-6)
.DC VIN 0 5 0.1
.TRAN 0.1n 50n
.END

4.2 子电路定义与封装

子电路(Subcircuit)是 SPICE 中实现模块化设计的关键机制。通过 .SUBCKT 和 .ENDS 语句,可以将一组元件封装成一个可重复调用的单元。在模型移植中,子电路常用于封装 MOSFET 的寄生网络或外围电路。

4.2.1 子电路语法结构

子电路的定义格式如下:

.SUBCKT <子电路名> <外部节点列表>
  ... 内部元件定义 ...
.ENDS <子电路名>
  • 外部节点列表:子电路对外连接的端口,调用时必须按顺序映射。
  • 内部元件:子电路内部的电阻、电容、MOSFET 等元件,节点编号仅在子电路内部有效。
  • 嵌套规则:子电路内部可以嵌套调用其他子电路,但禁止递归定义。
模型移植提示: 当 BSIM 模型与 PSP 模型的引脚顺序不一致时(例如 BSIM 的 bulk 端在 PSP 中需要额外处理),可以通过子电路重新映射引脚顺序,避免修改底层模型卡。

4.2.2 子电路调用方法

子电路通过 X 开头的元件语句进行调用:

X<名称> <节点映射> <子电路名>

例如,调用一个名为 INV 的反相器子电路:

X1 1 2 0 INV

其中 1、2、0 分别对应子电路定义中的第一个、第二个和第三个外部节点。

4.2.3 子电路参数传递

SPICE 支持通过 .SUBCKT 语句定义参数默认值,并在调用时覆盖:

.SUBCKT INV IN OUT VDD VSS W=10u L=0.18u
M1 OUT IN VSS VSS NMOS W={W} L={L}
M2 OUT IN VDD VDD PMOS W={2*W} L={L}
.ENDS INV

* 调用时覆盖参数
X1 A B VDD 0 INV W=20u L=0.13u
子电路定义与调用结构图 .SUBCKT 定义 子电路名: INV 外部节点: IN OUT VDD VSS 内部元件: M1 (NMOS) W={W} L={L} M2 (PMOS) W={2*W} L={L} 参数: W=10u L=0.18u .ENDS INV 调用 X 调用实例 X1 A B VDD 0 INV 节点映射关系: A → IN (输入) B → OUT (输出) VDD → VDD (电源) 0 → VSS (地) 参数覆盖: W=20u L=0.13u

4.3 模型调用规则

在 SPICE 网表中,MOSFET 模型通过 .MODEL 语句定义,然后在元件语句中通过模型名进行引用。模型调用是 BSIM 向 PSP 移植的核心环节。

4.3.1 模型语句格式

.MODEL <模型名> <模型类型> <参数名1=参数值1> <参数名2=参数值2> ...

其中模型类型决定了仿真器调用的物理模型引擎:

模型类型 对应物理模型 典型应用
NMOS / PMOS MOSFET Level 1/2/3 早期数字电路
NMOS / PMOS (Level=49) BSIM3v3 0.18μm ~ 0.13μm 工艺
NMOS / PMOS (Level=54) BSIM4 90nm 及以下工艺
NMOS / PMOS (Level=69) PSP 65nm 及以下模拟/RF 设计

4.3.2 MOSFET 元件调用语法

MOSFET 元件语句的标准格式为:

M<名称> <漏极> <栅极> <源极> <衬底> <模型名> [几何参数] [其他参数]

四个电极节点的顺序必须严格遵守:漏极 (D) → 栅极 (G) → 源极 (S) → 衬底 (B)。

BSIM 与 PSP 的节点顺序差异: 虽然 BSIM4 和 PSP 都使用 D-G-S-B 的四端顺序,但 PSP 模型对衬底节点(B)的物理建模更为精细。在移植时,如果原 BSIM 网表中衬底节点直接接地,而 PSP 模型需要区分 P 型衬底和 N 型阱,则必须通过子电路或额外的电阻电容网络进行适配。

4.3.3 模型参数传递优先级

SPICE 中模型参数的传递遵循明确的优先级规则:

  1. 元件语句中的实例参数(如 W=10u L=0.18u)优先级最高。
  2. .MODEL 语句中的模型参数(如 VTO=0.7)优先级次之。
  3. 仿真器内置默认值优先级最低。

这一规则在模型移植中非常重要:当 BSIM 和 PSP 的几何参数名称不同时(例如 BSIM 的 PD、PS 与 PSP 的 NRS、NRD),可以通过实例参数直接覆盖,而不必修改模型卡。

4.4 BSIM 与 PSP 网表结构对比

以下表格对比了 BSIM4 和 PSP 在网表层面的关键差异:

对比项 BSIM4 (Level=54) PSP (Level=69)
模型类型 NMOS / PMOS NMOS / PMOS
Level 值 54 69
电极顺序 D G S B D G S B
几何参数 W, L, PD, PS, AS, AD W, L, NF, NRS, NRD, SA, SB, SD
温度参数 TNOM 在模型卡中 TNOM 在模型卡中,支持 DTEMP 实例参数
噪声模型 内置 flicker 噪声 需显式设置 NOIMOD=1
BSIM4 与 PSP 网表调用对比 BSIM4 网表调用 .MODEL NMOS_BSIM4 NMOS ( + Level=54 + VTO=0.7 TOX=4e-9 + ... ) M1 D G S B NMOS_BSIM4 + W=10u L=0.18u PD=20u PS=20u + AS=5p AD=5p 移植 PSP 网表调用 .MODEL NMOS_PSP NMOS ( + Level=69 + VTO=0.7 TOXE=4e-9 + ... ) M1 D G S B NMOS_PSP + W=10u L=0.18u NF=1 + NRS=1 NRD=1 SA=0.5u SB=0.5u

4.5 模型移植中的网表适配策略

在将 BSIM 网表转换为 PSP 网表时,需要针对以下关键点进行调整:

网表移植四步法:
  1. 修改 Level 值:将 Level=54 改为 Level=69。
  2. 替换几何参数:将 PD/PS 替换为 NRS/NRD,增加 NF、SA、SB、SD 等参数。
  3. 调整模型参数名:例如 TOX → TOXE,U0 → MUE 等。
  4. 添加噪声模型配置:PSP 需要显式设置 NOIMOD=1 以启用 flicker 噪声。

以下是一个完整的移植前后对比示例:

* BSIM4 原始网表
.MODEL NMOS_BSIM4 NMOS (
+ Level=54
+ VTO=0.7 TOX=4e-9
+ U0=0.05 ... )

M1 D G S B NMOS_BSIM4 W=10u L=0.18u PD=20u PS=20u AS=5p AD=5p

* 移植为 PSP 网表
.MODEL NMOS_PSP NMOS (
+ Level=69
+ VTO=0.7 TOXE=4e-9
+ MUE=0.05 NOIMOD=1 ... )

M1 D G S B NMOS_PSP W=10u L=0.18u NF=1 NRS=1 NRD=1 SA=0.5u SB=0.5u SD=0.5u
工程实践建议: 在大型网表中,建议使用脚本(如 Perl 或 Python)批量替换参数名和几何参数,避免手动修改引入错误。同时,保留原始 BSIM 网表作为基准,通过对比仿真结果验证移植的正确性。