Appearance
第 3 章:SPICE 模型提取策略
来源:
mystic_ug.pdf(W‑2024.09),Chapter 3 SPICE Model Extraction Strategy。
本章说明 Mystic 运行环境中的各个核心对象(数据库、SimData、Model、Simulator、Optimizer 等)如何协同构建一套完整的 SPICE 模型提取策略,并介绍参数空间探索、机器学习辅助加速等高级用法。
3.1 数据库
Mystic 通过 TCAD→SPICE 数据库整合目标数据,并在多阶段提取之间追踪模型参数。若在 Sentaurus Workbench (SWB) 中运行,数据库配置会随 -d 选项自动传入;若使用独立模式,则需手动配置连接(见 Sentaurus Workbench API Documentation)。
在提取环境里,mdb 对象用于存取数据库记录。典型流程包含最多五个提取阶段:每阶段拟合部分参数,并写回数据库以便下游阶段复用。图 4(原文)展示了 MOSFET 三阶段提取示例,上传数据阶段是 Mystic 提取的前置条件。
3.1.1 层级结构与初始模型
数据库分为三层:
- Project:对应一次完整提取策略或 SWB 中的单个节点,主要保存初始模型卡。
- Dataset:表示某个提取阶段,通常由 SWB 创建并通过
-ds传给 Mystic。 - Data Object:具体的目标/拟合数据条目。
在第一次策略运行前,可用 mdb.StoreInitialModel(Model) 将 -m 传入的模型卡存进项目,供后续阶段引用。每个 Dataset 也会链接到上一阶段,便于通过 mdb.GetFitModel() 取回上一阶段的拟合结果。
3.1.2 元数据结构
Data object 由两部分组成:
data字段:字典形式,存储自变量与因变量数组。metadata字段:层级字典,记录仿真条件或标签(图 5)。
常用键包括:
| 字段 | 说明 |
|---|---|
temperature | 仿真温度(开尔文,必填)。 |
bias | 静态偏置字典,键须与端点同名(必填)。 |
instances | 模型实例参数(必填,可为空字典)。 |
nodes | 端点顺序,需与 bias 键匹配(必填)。 |
ivar / dvar | 主从变量标签,上传时自动补齐。 |
| 其他键 | 任意键值对用于筛选(例如 type: nMOS)。 |
正确理解这些键,才能在上传/加载时提供完整上下文。
3.1.3 加载与存储接口
Mystic 通过 mdb.Load 与 mdb.GetFitData 操作 SimData 对象:
mdb.Load(...):在首阶段加载上传项目中的原始目标数据。mdb.GetFitData(...):在后续阶段加载部分拟合结果。
两者都接受任意筛选条件,可针对项目名、数据字段或元数据。层级字段(如 bias、instances)使用双下划线分层,例如:
python
IdVgld = mdb.Load(
temperature=300,
bias__drain=0.05,
instances__l=25e-9,
ivar="vgate",
dvar="idrain"
)所有匹配条目都会返回,类型为 SimData。提取结束后,可用 mdb.StoreFitData 把拟合数据写回数据库。
3.2 目标数据(SimData)
Mystic 接受 PLT 类或 CSV 类目标数据(见第 2 章);支持的提取类型包括 I‑V、C‑V、瞬态与射频散射参数。上传阶段会附带温度、实例参数等元数据,保证 Mystic 能在 PrimeSim HSPICE 中复现仿真条件。
mdb.Load / mdb.GetFitData 返回的 SimData 对象通常包含以下列:
- 自变量(
ivar) - 目标因变量(测量或 TCAD 结果)
- 拟合因变量(PrimeSim HSPICE 输出)
- 逐点误差
当 Mystic 根据 SimData 生成 PrimeSim HSPICE 网表时,会自动创建对应的偏置、激励与输出指令(图 6),确保误差计算一致。默认为相对误差,可通过 SimData.SetOptions(error_method=...) 全局或单独设置。点误差支持的算法如表 4:
| 选项 | 描述 | 公式(f=拟合,t=目标) |
|---|---|---|
rel | (默认)相对误差 | (f - t) / t |
abs | 绝对误差 | f - t |
log_abs | 以 log10 结果计算绝对误差 | log10(f/t) |
log_rel | 以 log10 结果计算相对误差 | log10(f/t) |
square | 平方误差 | (f - t)^2 |
3.2.1 多级数据结构(combine)
对同类型、不同偏置的数据,可通过 combine=True 合并,以减少每次评估的 PrimeSim HSPICE 仿真次数:
python
IdVg = mdb.Load(
ivar="vgate", dvar="idrain",
project=targetProjectName,
combine=True,
extra_index="vdrain" # 可选:显式指定组合依据
)- 不加
combine:返回一个SimData,内部按偏置拆成多 Dataset。 - 设置
combine=True:把多曲线折叠成带二级索引的数据集,只需要一份网表。 extra_index可设定按哪个偏置/温度/实例组合,或使用"all"同时覆盖所有变化条件。
3.2.2 过滤与掩膜
SimData.FilterData(op, value, dtype=...) 可对任意列或元数据进行筛选,op 支持表 5 中的比较符:
| 操作符 | 含义 |
|---|---|
ge / gt | 大于等于 / 大于 |
le / lt | 小于等于 / 小于 |
eq / neq | 等于 / 不等于 |
示例:
python
IdVg = mdb.Load(ivar="vgate", dvar="idrain", project="upload-data")
IdVgld = IdVg.FilterData("eq", 0.05, dtype="bias.drain")
IdVghd = IdVg.FilterData("eq", 0.8, dtype="bias.drain")
IdVgld_BelowVt = IdVgld.FilterData("le", 0.3, dtype="ivar")
IdVgld_AboveVt = IdVgld.FilterData("ge", 0.4, dtype="ivar")若需按特定列筛 RF 数据,可对 dtype="column" 使用列名列表;也可按 FoM(如 vtgmmax)过滤。
为了避免重复仿真,可启用 数据掩膜(Data Mask):
python
from libfromage.data import Data
Data.set_options(data_mask=True) # 全局
IdVgld = IdVg.FilterData("eq", 0.05, "vdrain", mask=True)启用掩膜后,派生对象在 DoStage 中仅触发一次根数据的仿真,其余筛选或 FoM 共享同一次结果,有效降低运行时间。
3.2.3 关键参数(FoM)变换
SimData 为 MOSFET 等器件提供一组内建 FoM 计算(表 6),如导数 (Derivative)、DIBL、gm、GmMax、FMax、ft、Ioff/Ion、Rout、SubSlope、Vt、Sum、VtGmMax 等。对于约瑟夫结(Josephson junction),还有专用 FoM(图 8、表 7:P1–P5、rnorm、rsg,需要额外许可)。
调用示例:
python
Vt = IdVgld.VtGmmax()
Ion_target = IdVgld.MakeFoMTarget("ion", 1.0)MakeFoMTarget 会基于根数据生成新的 SimData,并在 PrimeSim HSPICE 仿真后对目标/拟合列做后处理,只回传单个误差。若 FoM 需要参数,可先用 SimData.SetFoMCriteria(...) 修改默认阈值。
还可自定义 FoM:
python
import numpy as np
IdVg = mdb.Load(ivar="vgate", dvar="idrain")
def log10(data):
return np.log10(data)
IdVg_log = IdVg.MakeFoMTarget(log10)
IdVg_mean = IdVg.MakeFoMTarget(
lambda data, col="target": data._target_values.mean()
, add_as_fom=True)将自定义函数传入 MakeFoMTarget,即可在根对象及其派生对象上串联多种变换,比如先取 gm 再取对数。
3.2.4 PrimeSim HSPICE .MEASURE 命令
更通用的变换可通过 .MEASURE 指令实现:
python
Vt = IdVg.ApplyMeasure('.MEASURE DC vt FIND v(gate) WHEN i(vdrain)=-1e-7')
Ion = IdVg.ApplyMeasure('.MEASURE DC ion MAX i(vdrain)')ApplyMeasure 返回 SimData,可与 FoM 一样用在提取步骤。命令会先对目标数据执行,再在 runtime 网表里加入 .MEASURE 语句并比对 RMS 误差。可用 TestMeasure() 预跑验证;若要叠加多个测量,可设置 inplace=True。注意 .MEASURE 中引用的端点名必须与数据里的 nodes 相同。
生成的 SimData 也可通过 WritePLTFile / WriteCSVFile 导出。
3.2.5 偏置扩展
提取完成后,可利用 SimData.ExtendBias 在更宽范围内仿真:
python
IdVg_ext = IdVg.ExtendBias(ivar_min=-0.2, ivar_max=1.2, spacing=0.05,
vdrain=[0.2, 0.4, 0.6])
ExtractionUtils.PrintErrors("idvg-ext", IdVg_ext, Simulator, Model, "rmsd")
IdVg_ext.WritePLTFile("idvg-ext")图 9 显示了扩展后的 I‑V 数据:原有曲线被外推到新偏置,并在中间偏置点补充仿真。
3.3 SPICE 模型(Model)
Mystic 支持任何 PrimeSim HSPICE 兼容网表,包括单卡、子电路或 .INCLUDE。当使用 -m 指定模型卡时,Mystic 会解析并注入 Model 对象,可通过点语法访问任意层级的参数,如:
python
Model.SetModelParameter("QMOD.BF", 100)
current_bf = Model.GetModelParameter("QMOD.BF")提取的核心目标是寻找一组参数,使 PrimeSim HSPICE 仿真最贴合目标数据。OptParam(见 3.5 节)用来声明可调参数;在任意节点,可调用 Model.write() 输出模型卡,或用 mdb.StoreFitParameters / mdb.StoreFitData 保存至数据库。
3.3.1 检查点
开发策略时可通过 Model.set_checkpoint(label) 保存当前模型状态,并用 Model.get_checkpoint(label, inplace=True) 恢复。ExtractionUtils.DoStage 会自动以阶段名创建检查点,便于回滚到某次优化之前。
3.4 仿真器(Simulator)
Mystic 以 PrimeSim HSPICE 作为后端仿真引擎。运行前需保证可执行文件在 PATH 中,或通过 -l 指定。Simulator 负责:
- 根据
Model与SimData生成网表 - 启动 PrimeSim HSPICE 并解析输出
- 回写拟合列与误差
默认会写入表 8 所列 .OPTION:
| 选项 | 默认值 | 说明 |
|---|---|---|
ABSTOL | 1e-15 | DC/瞬态支路电流绝对误差容限 |
EXT_OP | 1 | 输出附加信息 |
GMINDC | 1e-18 | DC 分析的最小跨导 |
INGOLD | 2 | 控制指数输出格式 |
MEASFORM | 1 | 允许 Excel/HSIM 测量输出 |
MEASDGT | 8 | 测量结果精度 |
NOMOD | 1 | 抑制模型参数打印 |
NUMDGT | 8 | 输出精度 |
可用 Simulator.set_options(...) 覆写。
3.4.1 许可模式与单次仿真
- 普通模式:每次仿真单独借出/归还 PrimeSim HSPICE license。
- Server 模式:使用
Simulator.spiceargs.append('-C')持续占用 server license,避免频繁借还。
任何 SimData 可通过 GenerateData 触发一次仿真:
python
IdVg.GenerateData(Simulator, Model)3.4.2 并行仿真
Simulator.max_sims 控制最大并行数,默认 1。对多曲线或 Jacobian 计算,可在 ExtractionUtils.DoStage(..., parallel=True) 中开启,或设置 ExtractionUtils.settings.parallel = True。并行模式下建议配合 server license,数量受 max_sims 限制。
3.5 优化参数(OptParam)
OptParam 用于声明可调 SPICE 参数、范围与缩放/变换:
python
PHIG = OptParam("PHIG", 4.3, 4.2, 4.5, 1.0)
BF = OptParam("QMOD.BF", 100.0, 1.0, 1000.0, 1.0)缩放因子有助于归一化,对梯度算法尤为重要;例如超小电容可设 scale=1e-11。如果参数对误差的响应高度非线性,可改用变换(Transform)替代缩放:
| 变换 | 描述 |
|---|---|
scale | 相当于直接设置缩放因子 |
shift | 平移参数初值,避免从 0 起步 |
log / decimal-log | 取自然对数 / log10 |
log-exp | 把 [lower, +∞) 映射到 (-∞, +∞) |
exp / decimal-exp | 使用自然指数 / 10 的指数 |
dual-log1p | 适合跨零参数,正负值均可对数化 |
square / square-root / power | 幂次变换 |
3.5.1 自动推荐变换
ExtractionUtils.GetOptimalTransforms 可基于目标数据计算最线性的变换:
python
tphig, tcdsc, tqmfactor = ExtractionUtils.GetOptimalTransforms(
[PHIG, CDSC, QMFACTOR],
IdVgld_BelowVt,
Simulator, Model,
step=0.01
)
PHIG = OptParam("PHIG", 4.3, 4.25, 4.35, tphig)3.5.2 参数空间探索
- 敏感度分析 (
SensitivityAnalysis):逐个扰动参数,观察 RMSD 与各目标的响应。 - 参数扫描 (
ParamSweep):在设定范围内扫单个参数,默认 11 个采样点,可调num/pmin/pmax。
示例:
python
sense_df = ExtractionUtils.SensitivityAnalysis(
[IdVg_belowvt, IdVg_abovevt],
Simulator, Model,
[PHIG, CDSC, U0, UA]
)
ExtractionUtils.ParamSweep(
"idvg-ld", IdVgld, Simulator, Model,
PHIG, "rmsd"
)3.6 优化算法
Optimizer 是 Mystic 的求解器接口,可在运行时通过 -o 或 Optimizer.SetMethod() 选择算法。支持的算法见表 9:
| 算法 | 说明 |
|---|---|
BOUNDED_TRUST_REGION | 基于 Intel MKL 的带约束信赖域最小二乘(默认)。 |
TRUST_REGION | Intel MKL 信赖域最小二乘。 |
least_squares | SciPy 最小二乘(trf / dogbox / LM)。 |
minimize | SciPy 通用最小化器(默认 BFGS,可选 COBYLA、L-BFGS-B 等)。 |
differential_evolution | 全局差分进化算法。 |
doe | 基于贝叶斯搜索的优化方法。 |
设置示例:
python
Optimizer.SetMethod("BOUNDED_TRUST_REGION")
Optimizer.SetOptimizationParameter("eps1", 1e-3)
Optimizer.SetOptimizationParameter("jac", True)
Optimizer.SetOptimizationParameter(
"kwargs",
{"eps": 1e-3, "step_type": "abs", "step_method": "cd", "eps_fac": 1e-6}
)
Optimizer.SetMethod("least_squares")
Optimizer.SetOptimizationParameter("method", "trf")
Optimizer.SetOptimizationParameter("ftol", 1e-4)
Optimizer.SetOptimizationParameter("xtol", 1e-6)
Optimizer.SetOptimizationParameter("gtol", 1e-4)
Optimizer.SetOptimizationParameter("diff_step", 1e-3)不同算法对 OptParam 的上下限约束处理不同:
BOUNDED_TRUST_REGION:严格遵守上下限。TRUST_REGION:忽略边界。
OptParam 的缩放/变换对梯度收敛性影响显著,可借助 3.5 节的敏感度分析工具调优。
Optimizer 常与 ExtractionUtils.DoStage 联用(图 11)。该函数接受 Model、Simulator、OptParam 列表、Optimizer、SimData 列表,执行单个优化阶段,并将最佳参数保留在 Model 中,误差信息写入日志。
3.6.1 贝叶斯优化
若需自适应地在参数空间中搜索,可启用贝叶斯算法:
python
Optimizer.SetMethod("doe")
Optimizer.SetOptimizationParameter(method="bayesian_optimizer")相关选项详见 Mystic API 中 Optimizer/Optimization Parameter 章节。
3.6.2 机器学习加速
Mystic 内置多项 ML/数据重用能力,以减少重复仿真。
数据存储与回放
在首次调用 mdb.StoreInitialModel 时设置 spice_ml_name,即可为某个基础模型启用数据存档:
python
mdb.StoreInitialModel(Model, spice_ml_name="my-nmos")此后所有仿真结果都会记录在数据库中,按模型、参数值、数据类型索引,可作为训练集或重复提取时的缓存。
重跑策略提速
当策略需要多次迭代开发时,启用 ML 存储后,若后续再次运行相同步骤并保持同样目标/参数组合,Mystic 会直接复用历史结果。例如示例流程中,初次运行耗时约 30 s;启用缓存后重跑仅需 ~1.4 s。若对阶段的参数集或目标做出修改,则从变更点开始重新仿真。
反向搜索(Reverse Search)
针对多工艺角、几何或周期性更新的项目,可调用 ExtractionUtils.ReverseSearch 从数据库检索最优历史参数集,并可选 optimize=True 继续微调:
python
ExtractionUtils.ReverseSearch(
mdb,
IdVgld,
Model,
optimize=True,
parameters=[PHIG, QMFACTOR, CDSC, U0, UA, EU, UD, UCS, ETAMOB]
)命令会先输出匹配度最高的旧参数与误差,再通过指定的优化算法细化,适用于更新目标数据(例如整体放大 5%)后的快速再拟合。
提示:本章涉及的 API(
mdb.*、SimData.*、Model.*、Simulator.*、ExtractionUtils.*、OptParam、Optimizer等)均可在 Mystic API 文档中查询完整参数与返回值说明。