2. MOSFET阈值电压提取:常数电流法与最大跨导法对比

任务说明

本案例基于一组实测 NMOS 转移特性数据(VGS 扫描、VDS=0.1V 线性区),分别用常数电流法和最大跨导法提取阈值电压 Vth,然后把两个 Vth 代入同一 SPICE 模型,对比仿真 ID-VGS 曲线的差异。

  • 常数电流法:取 ID = 0.1·(W/L)·1µA 对应的 VGS 作为 Vth。
  • 最大跨导法:对 ID-VGS 求导得 gm,取 gm 最大处的切线外推到 ID=0 的 VGS 截距。

数据与依赖

环境:Python 3 + numpy + matplotlib;SPICE 用 ngspice(或 LTspice)。实测数据以 CSV 形式给出,两列:VGS(V)、ID(A)。

提取脚本

import numpy as np

# 实测转移特性数据 (VGS, ID),线性区 VDS=0.1V, W/L=10
data = np.array([
    [0.0, 1e-12],[0.2, 3e-12],[0.4, 8e-12],[0.6, 2.5e-11],
    [0.8, 8e-11],[1.0, 2.4e-10],[1.2, 6.5e-10],[1.4, 1.6e-9],
    [1.6, 3.6e-9],[1.8, 7.4e-9],[2.0, 1.4e-8],[2.2, 2.5e-8],
    [2.4, 4.2e-8],[2.6, 6.7e-8],[2.8, 1.02e-7],[3.0, 1.5e-7],
])
VGS, ID = data[:,0], data[:,1]
WL = 10.0

# --- 方法1: 常数电流法 ---
Iref = 0.1 * WL * 1e-6          # 0.1*(W/L)*1uA = 1e-6 A
vth_cc = np.interp(Iref, ID, VGS)
print(f"常数电流法 Vth = {vth_cc:.4f} V  (Iref={Iref:.2e} A)")

# --- 方法2: 最大跨导法 ---
gm = np.gradient(ID, VGS)        # 数值微分求跨导
imax = np.argmax(gm)
# 在最大gm点做切线: ID = gm_max*(VGS - Vth)  => Vth = VGS - ID/gm_max
vth_gm = VGS[imax] - ID[imax]/gm[imax]
print(f"最大跨导法 Vth = {vth_gm:.4f} V  (gm_max={gm[imax]:.3e} S @ VGS={VGS[imax]}V)")

# 导出两个Vth供SPICE使用
with open("vth.txt","w") as f:
    f.write(f"{vth_cc:.4f} {vth_gm:.4f}\n")

SPICE 验证

用同一组模型参数,仅改 VTO,分别仿真 ID-VGS,与实测曲线叠加对比。

* nmos_vth.sp
.param VTO=0.8
M1 d g 0 0 nmos W=10u L=1u
Vgs g 0 0
Vds d 0 0.1
.model nmos nmos (LEVEL=1 VTO={VTO} KP=120u GAMMA=0.5 PHI=0.7)
.dc Vgs 0 3 0.05
.print dc V(g) I(Vds)
.end

运行:ngspice -b nmos_vth.sp,把 VTO 分别设为脚本输出的两个 Vth,各跑一次,导出 ID-VGS 曲线。

验证与判定

  • 脚本应打印两个 Vth,且常数电流法结果通常略大于最大跨导法(因 Iref 落在亚阈区之上)。
  • 把两条 SPICE 曲线与实测数据画在同一张图上:最大跨导法对应的曲线在强反型区与实测更贴合;常数电流法曲线整体右移。
  • 通过条件:两法 Vth 差值在 0.05~0.3V 量级,且各自 SPICE 曲线在 VGS > Vth+0.3V 区间与实测偏差小于 15%。
Vth 提取与 SPICE 验证流程 实测数据 VGS, ID (CSV) 常数电流法 ID = 0.1·(W/L)·1µA 最大跨导法 gm 最大处切线外推 两个 Vth Vth_cc, Vth_gm SPICE 仿真 改 VTO 对比 ID-VGS