Skip to content

第 3 章:SPICE 模型提取策略

来源:mystic_ug.pdf(W‑2024.09),Chapter 3 SPICE Model Extraction Strategy

本章说明 Mystic 运行环境中的各个核心对象(数据库、SimDataModelSimulatorOptimizer 等)如何协同构建一套完整的 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.Loadmdb.GetFitData 操作 SimData 对象:

  • mdb.Load(...):在首阶段加载上传项目中的原始目标数据。
  • mdb.GetFitData(...):在后续阶段加载部分拟合结果。

两者都接受任意筛选条件,可针对项目名、数据字段或元数据。层级字段(如 biasinstances)使用双下划线分层,例如:

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 对象通常包含以下列:

  1. 自变量(ivar
  2. 目标因变量(测量或 TCAD 结果)
  3. 拟合因变量(PrimeSim HSPICE 输出)
  4. 逐点误差

当 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、GmMaxFMaxftIoff/IonRoutSubSlopeVtSumVtGmMax 等。对于约瑟夫结(Josephson junction),还有专用 FoM(图 8、表 7:P1–P5、rnormrsg,需要额外许可)。

调用示例:

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 负责:

  • 根据 ModelSimData 生成网表
  • 启动 PrimeSim HSPICE 并解析输出
  • 回写拟合列与误差

默认会写入表 8 所列 .OPTION

选项默认值说明
ABSTOL1e-15DC/瞬态支路电流绝对误差容限
EXT_OP1输出附加信息
GMINDC1e-18DC 分析的最小跨导
INGOLD2控制指数输出格式
MEASFORM1允许 Excel/HSIM 测量输出
MEASDGT8测量结果精度
NOMOD1抑制模型参数打印
NUMDGT8输出精度

可用 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 的求解器接口,可在运行时通过 -oOptimizer.SetMethod() 选择算法。支持的算法见表 9:

算法说明
BOUNDED_TRUST_REGION基于 Intel MKL 的带约束信赖域最小二乘(默认)。
TRUST_REGIONIntel MKL 信赖域最小二乘。
least_squaresSciPy 最小二乘(trf / dogbox / LM)。
minimizeSciPy 通用最小化器(默认 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)。该函数接受 ModelSimulatorOptParam 列表、OptimizerSimData 列表,执行单个优化阶段,并将最佳参数保留在 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。若对阶段的参数集或目标做出修改,则从变更点开始重新仿真。

针对多工艺角、几何或周期性更新的项目,可调用 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.*OptParamOptimizer 等)均可在 Mystic API 文档中查询完整参数与返回值说明。

基于 Sentaurus TCAD 官方文档构建

代码块