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 等元件,节点编号仅在子电路内部有效。
- 嵌套规则:子电路内部可以嵌套调用其他子电路,但禁止递归定义。
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
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)。
4.3.3 模型参数传递优先级
SPICE 中模型参数的传递遵循明确的优先级规则:
- 元件语句中的实例参数(如
W=10u L=0.18u)优先级最高。 - .MODEL 语句中的模型参数(如
VTO=0.7)优先级次之。 - 仿真器内置默认值优先级最低。
这一规则在模型移植中非常重要:当 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 |
4.5 模型移植中的网表适配策略
在将 BSIM 网表转换为 PSP 网表时,需要针对以下关键点进行调整:
- 修改 Level 值:将
Level=54改为Level=69。 - 替换几何参数:将
PD/PS替换为NRS/NRD,增加NF、SA、SB、SD等参数。 - 调整模型参数名:例如
TOX→TOXE,U0→MUE等。 - 添加噪声模型配置: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