3. 模型文件通用结构:文件头、模型定义、子电路、参数声明、注释规范
SPICE 模型文件的结构化程度直接决定了 PDK 兼容性测试的效率与准确性。一个标准化的模型文件应遵循“文件头 → 全局参数 → 子电路/模型定义 → 注释”的层次化布局。本章将逐一拆解各组成部分的格式规范与常见陷阱。
核心原则:模型文件应具备“自描述性”——任何具备 SPICE 基础的工程师无需额外文档即可理解模型用途、适用范围与调用方式。
3.1 文件头(File Header)—— 模型的“身份证”
文件头位于模型文件最顶部,通常包含工艺信息、版本号、创建日期、版权声明以及关键使用约束。标准化文件头应包含以下字段:
| 字段 | 必选/可选 | 内容示例 | 说明 |
|---|---|---|---|
| 工艺名称 | 必选 | TSMC 28nm HPC+ |
明确标识工艺节点与变种 |
| 模型版本 | 必选 | v1.2.3 |
遵循语义化版本号(主版本.次版本.修订) |
| 创建/修订日期 | 必选 | 2025-03-15 |
ISO 8601 格式 |
| 适用范围 | 必选 | TT / FF / SS corner |
列出支持的工艺角 |
| 版权/保密声明 | 可选 | Confidential – XYZ Corp. |
法律合规要求 |
| 仿真器兼容性 | 推荐 | HSPICE / Spectre / ngspice |
避免用户误用不兼容仿真器 |
标准文件头示例(使用注释块):
*----------------------------------------------------------------------------
* PDK: TSMC_28HPC+
* Model File: nmos_rvt.scs
* Version: 1.2.3
* Date: 2025-03-15
* Corner: TT (Typical-Typical)
* Simulator: HSPICE P-2019.06 / Spectre 20.1
* Description: NMOS RVT (Regular Vt) SPICE model for digital core
* Copyright: (c) 2025 XYZ Semiconductor, All Rights Reserved.
*----------------------------------------------------------------------------
兼容性提示:部分仿真器(如 ngspice)对注释行首字符有严格限制。建议统一使用
* 作为注释行起始符,避免使用 $ 或 // 等非标准符号。
3.2 模型定义(Model Definition)—— 核心器件行为
模型定义是 SPICE 文件的核心,使用 .MODEL 语句描述单个器件的电学行为。标准化要求模型定义必须包含:模型名称、类型关键字、层级参数列表。
标准语法格式:
.MODEL <model_name> <type> [<param_name>=<value> ...]
典型示例(NMOS 器件):
.MODEL nmos_rvt_tt NMOS (
+ VERSION = 1.2.3
+ LEVEL = 54
+ TNOM = 25.0
+ TOX = 1.85E-9
+ VTH0 = 0.35
+ U0 = 4.5E-2
+ K1 = 0.45
+ K2 = 0.08
+ LINT = 1.2E-8
+ WINT = 5.0E-9
+ RSH = 7.5
+ CJ = 1.2E-3
+ CJSW = 4.5E-10
+ )
常见兼容性问题:
- 模型名称冲突:不同工艺角使用相同模型名(如
nmos),导致仿真器加载顺序错误。 - LEVEL 值不匹配:BSIM4 模型在 HSPICE 中为 LEVEL=54,在 Spectre 中可能需指定
model=bsim4。 - 参数单位歧义:未显式标注单位(如
TOX=1.85e-9默认米,但部分旧工艺使用埃)。
3.3 子电路(Subcircuit)—— 复杂器件的封装
子电路使用 .SUBCKT / .ENDS 结构封装多器件组合(如 RF 器件、ESD 结构、I/O 缓冲器)。标准化子电路必须明确定义端口顺序、内部节点命名规则以及寄生参数。
标准语法格式:
.SUBCKT <subckt_name> <port1> <port2> ... [PARAMS: <param_list>]
[内部器件与模型实例化]
.ENDS <subckt_name>
典型示例(RF NMOS 带寄生子电路):
.SUBCKT rf_nmos_tt D G S B W=1e-6 L=30e-9 NF=1
* 端口顺序:漏极 栅极 源极 衬底
M1 D G S B nmos_rvt_tt W='W/NF' L=L M=NF
* 寄生电阻
RD D D_int 10
RS S S_int 5
* 寄生电容
CGS G S_int 1e-15
CGD G D_int 1e-15
.ENDS rf_nmos_tt
命名规范:子电路名称建议采用
<器件类型>_<工艺角>_<变种> 格式(如 rf_nmos_tt),避免使用纯数字或特殊字符开头。内部节点建议以 _int 或 _x 后缀标识,防止与顶层节点冲突。
3.4 参数声明(Parameter Declaration)—— 灵活性与可配置性
参数声明允许用户在调用模型或子电路时动态调整关键参数,是 PDK 兼容性测试中最重要的灵活性来源。标准化参数声明应遵循以下规则:
- 默认值必须合理:参数声明必须提供默认值,且默认值对应典型工艺角(TT)。
- 参数类型显式化:使用
PARAMS:关键字声明参数列表,避免隐式参数传递。 - 单位与缩放因子:参数值应使用 SI 单位制,必要时附加缩放因子(如
W=1e-6表示 1μm)。 - 参数范围约束:在注释中标注参数的有效范围,防止用户设置超出模型拟合区间的值。
参数声明示例:
.SUBCKT nmos_var D G S B PARAMS:
+ W = 1e-6 * 沟道宽度 (m),范围: 0.1e-6 ~ 10e-6
+ L = 30e-9 * 沟道长度 (m),范围: 20e-9 ~ 100e-9
+ NF = 1 * 叉指数,范围: 1 ~ 64
+ M = 1 * 并联倍数,范围: 1 ~ 100
+ TEMP = 25.0 * 工作温度 (°C)
* 内部实例化
M1 D G S B nmos_rvt_tt W='W/NF' L=L M=NF*M
.ENDS nmos_var
| 参数名 | 类型 | 默认值 | 典型范围 | 单位 |
|---|---|---|---|---|
W |
实数 | 1e-6 | 0.1e-6 ~ 10e-6 | 米 (m) |
L |
实数 | 30e-9 | 20e-9 ~ 100e-9 | 米 (m) |
NF |
整数 | 1 | 1 ~ 64 | 无 |
TEMP |
实数 | 25.0 | -40 ~ 150 | °C |
3.5 注释规范(Comment Convention)—— 可读性与可维护性
注释是模型文件中最容易被忽视但最重要的部分。标准化注释规范确保模型文件在团队协作、版本迁移和 PDK 兼容性测试中保持可读性。
注释规范核心要求:
- 注释行首符统一:使用
*作为行注释起始符(兼容所有 SPICE 变种),避免使用$(仅 HSPICE 支持)或//(仅 Spectre 支持)。 - 块注释与行内注释结合:文件头使用块注释,参数行使用行内注释说明单位与范围。
- 变更历史记录:在文件头或模型定义前记录每次修改的日期、作者与变更内容。
- 废弃模型标记:使用
* OBSOLETE或* DEPRECATED标记不再推荐使用的模型。
注释规范示例:
*----------------------------------------------------------------------------
* 变更历史
* 2025-03-15 v1.2.3 ZhangSan - 修正 VTH0 温度系数
* 2025-01-10 v1.2.2 LiSi - 添加 FF/SS 工艺角
* 2024-11-01 v1.2.1 WangWu - 初始版本
*----------------------------------------------------------------------------
* OBSOLETE: 旧版模型,请使用 nmos_rvt_tt 替代
* .MODEL nmos_old NMOS ( ... )
兼容性测试陷阱:部分自动化测试脚本会解析注释中的
OBSOLETE 或 DEPRECATED 关键字来跳过废弃模型。如果注释格式不统一(如使用 // OBSOLETE 而非 * OBSOLETE),脚本可能无法正确识别,导致测试失败。
3.6 通用结构完整性检查清单
在 PDK 兼容性测试中,可使用以下清单快速验证模型文件的结构完整性:
| 检查项 | 标准要求 | 检查方法 |
|---|---|---|
| 文件头完整性 | 包含工艺、版本、日期、角 | grep 扫描前 20 行 |
| 模型名称唯一性 | 同一文件内无重复 .MODEL 名 | awk 统计 .MODEL 行 |
| 子电路端口匹配 | .SUBCKT 与 .ENDS 名称一致 | 脚本校验配对 |
| 参数默认值合理性 | 默认值对应 TT 工艺角 | 与 PDK 文档交叉验证 |
| 注释起始符统一 | 全部使用 * |
grep -n '^[^ *]' 检查异常行 |
| 废弃模型标记 | 使用 * OBSOLETE 前缀 |
grep -i obsolete |
最佳实践:建议在 PDK 发布流程中集成自动化结构检查脚本,在模型文件提交时自动执行上述清单检查,从源头杜绝格式不一致问题。