3. 统计模型与工艺波动来源

在Virtuoso的Monte Carlo分析中,真正决定仿真结果是否可信的,不是采样次数,而是统计模型是否写对、写全。很多初学者把 mc 语句当成“加个随机数”的开关,结果跑出来的良率要么过于乐观,要么与硅片实测严重不符。根本原因在于:全局工艺波动(process)与局部失配(mismatch)是两类物理来源完全不同的随机性,必须用不同的模型分别描述。本节围绕 statistics 块中的 process、mismatch、mis 等语句,讲清语法、物理含义以及它们对电路性能的差异化影响。

一、两类波动的物理来源与建模边界

全局波动来自晶圆制造中跨批次、跨晶圆、跨芯片的系统性偏差。例如氧化层厚度、光刻线宽、掺杂浓度在整片晶圆上存在缓慢的空间梯度,同一批次内不同芯片的NMOS阈值电压可能整体偏高或偏低。这类波动对同一芯片上的所有同类型器件同向、近似同比例地作用,因此建模时用一个全局随机变量驱动所有相关器件。

局部失配则来自同一芯片内相邻器件之间的随机差异,典型来源包括掺杂原子数涨落、栅氧厚度局部起伏、边缘粗糙度等。它只作用于“本应相同”的器件对,例如差分对的两只管子、电流镜的参考管与镜像管。失配随器件面积增大而减小,近似满足 Pelgrom 关系:σ(ΔVth) = A_VT / sqrt(W·L)。这意味着失配模型必须与器件的 W、L 绑定,而不能像全局波动那样只给一个固定 sigma。

判断口诀:如果两只“设计上相同”的管子会朝相反方向漂移,那是 mismatch;如果整块芯片一起漂移,那是 process。差分对失调主要看 mismatch,而偏置电流绝对值漂移主要看 process。

二、Virtuoso 统计模型语法与含义

在 ADE XL 或 Assembler 中,统计模型通常写在模型文件的 statistics 块内,或通过 monteCarlo 设置引用。核心语句形式如下:

statistics {
  process {
    vary vth0 dist=gauss std=0.02
    vary tox  dist=gauss std=0.03
  }
  mismatch {
    vary dvth0 dist=gauss std=0.005
  }
  mis {
    vary dw   dist=gauss std=0.01
    vary dl   dist=gauss std=0.01
  }
}

逐项解释:process 块定义全局变量,每次 Monte Carlo 抽样时,所有引用该模型的器件共享同一组抽样值;mismatch 块定义局部失配变量,每个器件实例独立抽样,因此差分对两只管子会得到不同的 dvth0;mis 是 mismatch 的简写别名,在部分 PDK 中两者等价,但有些工艺库用 mis 专门表示几何尺寸失配(ΔW、ΔL),用 mismatch 表示电学参数失配(ΔVth、Δβ),此时不能混用。

dist 指定分布类型,常用 gauss(正态)、lognormal(对数正态,适合电阻、电流等正值量)、uniform(均匀)。std 是标准差,单位与所修饰参数一致:vth0 用 V,tox 用 m,dw 用 m。若 PDK 提供的是相对标准差,则用 std=0.02 表示 2% 的 1σ 波动。

三、模型如何影响电路性能:一个差分对示例

假设一个 NMOS 差分对,尾电流 100 μA,负载电阻 10 kΩ,输入对管 W/L = 10 μm/0.18 μm。若只开 process,两只管子的 Vth 同时升高 20 mV,差分输出几乎不变,因为共模漂移被差分结构抑制;此时测得的失调电压很小,容易让人误以为电路“良率很高”。一旦加入 mismatch,两只管子 Vth 各自独立抽样,差值 ΔVth 的 1σ 约为 A_VT / sqrt(W·L)。取典型 A_VT = 5 mV·μm,则 σ(ΔVth) ≈ 5 / sqrt(10×0.18) ≈ 3.7 mV,对应输入失调电压 1σ 约 3.7 mV。若系统要求失调小于 5 mV,则良率大约只有 82% 左右(按正态分布估算),这才是真实的设计约束。

由此可见:process 决定电路的绝对工作点是否落在规格内,mismatch 决定匹配精度和失调类指标。两者必须同时开启,且采样次数要足够——通常至少 200~500 次才能稳定估计 3σ 附近的良率,100 次以下的结果波动很大,不宜作为签核依据。

工艺波动来源 → 统计模型 → 电路性能影响 全局波动来源 晶圆级氧化层厚度梯度 光刻线宽批次偏差 掺杂浓度空间分布 温度/应力系统性偏移 同芯片器件同向漂移 局部失配来源 掺杂原子数随机涨落 栅氧厚度局部起伏 边缘粗糙度/线端效应 载流子迁移率局部差异 相邻器件反向漂移 process 块 vary vth0 dist=gauss std=0.02 vary tox dist=gauss std=0.03 所有器件共享同一抽样值 决定绝对工作点 影响偏置电流、增益绝对值 mismatch / mis 块 vary dvth0 dist=gauss std=0.005 vary dw dist=gauss std=0.01 每个器件实例独立抽样 σ ∝ A_VT / sqrt(W·L) 决定失调、匹配精度 对性能的影响 偏置电流绝对值漂移 增益/带宽整体偏移 共模电平移动 → 规格边界良率 → 通常用 process 主导 对性能的影响 输入失调电压 V_os 电流镜镜像比误差 比较器阈值分散 → 精度类良率 → 通常用 mismatch 主导 两者必须同时开启:process 管绝对精度,mismatch 管相对匹配,缺一不可

四、实操要点与常见错误

第一,确认 PDK 中 mismatch 与 mis 是否等价。打开模型文件搜索 statistics 块,若同时存在两个块且参数不同,说明它们分工不同,仿真设置里必须分别引用。第二,检查 std 单位。Virtuoso 不会自动换算,若把 0.02 V 写成 0.02 mV,失配会被低估 1000 倍,良率虚高。第三,注意 process 变量的作用域:它应作用于所有同类型器件,而不是只作用于被选中的实例,否则全局波动被人为削弱。第四,采样次数与收敛判断:先跑 100 次看均值与标准差是否稳定,再增加到 500 次;若 3σ 良率在两次运行间跳变超过 2%,说明次数不足。

常见误区:只开 mismatch 不开 process,会得到“失调很小但偏置电流完全不对”的假良率;只开 process 不开 mismatch,会得到“偏置正常但失调为零”的假良率。两者都是签核陷阱。

最后给出一个可复用的检查清单,用于每次 Monte Carlo 设置后快速核对:

检查项正确做法错误后果
process 是否开启所有全局变量在 process 块中定义绝对工作点无波动,良率虚高
mismatch/mis 是否开启失配变量按器件实例独立抽样失调为零,匹配类指标失真
std 单位与参数单位一致(V、m、A)波动量级错误,结果不可信
分布类型Vth 用 gauss,电阻/电流用 lognormal出现负电阻等非物理值
采样次数≥200 次,3σ 良率稳定良率估计随机跳动
W·L 与 σ 关系失配 std 随面积缩小而增大小尺寸器件失配被低估