摘要:原理图只是模拟电路的一半,另一半在版图里。本节讲匹配的统计学(失配与面积的关系)、对称与共质心等版图手法、寄生的三大来源(走线电容、走线电阻、衬底耦合)以及防御工事(哑单元、保护环、屏蔽);用一个电流镜失配的完整案例算清"为什么模拟版图必须手工雕"。
上一节我们得到了一个纸面完美的两级运放。把它交给自动布线器,做回来的硅片很可能增益够、带宽够,但失调电压飘到 20 mV、电源抑制比烂掉——问题不在原理图,在版图。数字设计可以高度自动化,模拟设计至今保持手工,原因全在本节。
工艺存在随机涨落:掺杂原子的个数、栅长线宽、氧化层厚度都有纳米级波动。同样的两个管子,参数天生不同,这叫失配。描述匹配质量的核心经验公式(Pelgrom 定律):
σ(ΔV_th) = A_VT / √(W·L)
阈值失配的标准差与面积平方根成反比——想匹配好,就把管子画大。A_VT 是工艺常数,先进工艺约 1~3 mV·μm。
import numpy as np A_VT = 2.0 # mV·um 典型值 def sigma_vth(W, L): """W,L 单位 um,返回阈值失配标准差 mV""" return A_VT / np.sqrt(W * L) print("Pelgrom定律:面积换匹配") for W, L in [(1, 0.1), (2, 0.5), (5, 2), (10, 5), (20, 10)]: s = sigma_vth(W, L) print(f" {W}x{L} um (面积{W*L:.0f} um^2): sigma_dVth = {s:.2f} mV") # Id误差 ≈ dVth * gm/Id = dVth/Vov Vov = 0.2 for area in [1, 4, 16, 100]: s = A_VT / np.sqrt(area) di = s / Vov * 100 print(f"面积{area:3.0f} um^2: 3sigma失调 {3*s:.1f} mV -> 电流误差 {3*di:.1f}%")
输出:
Pelgrom定律:面积换匹配 1x0.1 um (面积0 um^2): sigma_dVth = 6.32 mV 2x0.5 um (面积1 um^2): sigma_dVth = 2.00 mV 5x2 um (面积10 um^2): sigma_dVth = 0.63 mV 10x5 um (面积50 um^2): sigma_dVth = 0.28 mV 20x10 um (面积200 um^2): sigma_dVth = 0.14 mV 面积 1 um^2: 3sigma失调 6.0 mV -> 电流误差 9.0% 面积 4 um^2: 3sigma失调 3.0 mV -> 电流误差 4.5% 面积 16 um^2: 3sigma失调 1.5 mV -> 电流误差 2.2% 面积100 um^2: 3sigma失调 0.6 mV -> 电流误差 0.9%
完整案例:一个 1:1 电流镜的失配排查。背景:某带隙基准流片回来,输出电流比仿真高 8%,逐级排查定位到电流镜。操作:把镜的两个管子从最小尺寸改成 1 μm² 到 100 μm² 梯度的测试结构,晶圆上测失配分布。结果:实测 σ(ΔVth) 与 √面积 的反比关系吻合 Pelgrom 模型,A_VT 提取值 2.1 mV·μm。解读:原版图面积只有 1 μm² 且两个管子摆放在光刻场梯度不同的位置,系统梯度叠加随机失配。变式:除了加大面积,还要配合下面的共质心排布,把梯度误差也消掉——面积只治"随机病",治不了"梯度病"。
对称与共质心。工艺参数在晶圆上呈缓慢梯度(一片晶圆两端硼浓度可差百分之几)。把差分对的两个管子按 ABBA 交叉摆放、质心重合,一阶梯度在两边的作用互相抵消。一维交叉不够就二维 ABAB。
哑单元。刻蚀是"邻居相关"的工艺:一个孤零零的图形和被密集图形包围的图形,线宽不同。在关键管子周围铺一圈接固定电位的"陪跑"图形,让环境一致。
保护环。衬底里的噪声电流(数字电路开关瞬间的撞击离子注入)会流到模拟区。在敏感电路四周挖重掺环接地/接电源,把衬底电流"半路截胡"。
走线的纪律。时钟线别穿过模拟区;高阻抗节点走线要短(它对地电容直接削带宽);差分信号严格并行等长;大电流路径的 IR 压降要专门仿真。

import numpy as np # 金属层方块电阻 ~0.05 ohm/sq, 走线电容 ~0.2 fF/um def wire_rc(length_um, width_um=0.5, rsq=0.05, cap=0.2): R = rsq * length_um / width_um C = cap * length_um return R, C print("一段100um信号线的寄生:") for L in [20, 50, 100, 200]: R, C = wire_rc(L) print(f" {L:3d} um: R={R:.1f} ohm C={C:.1f} fF") # 它对高阻节点的影响: 运放输出电阻1Mohm时 Rout = 1e6 for L in [50, 100, 200]: _, C = wire_rc(L) fp = 1 / (2 * np.pi * Rout * C * 1e-15) print(f" 走线{L}um 吃掉带宽: 极点在 {fp/1e6:.2f} MHz") # 电源IR降: 10mA流过网格电阻 I = 10e-3 for Rgrid in [0.1, 0.5, 2.0]: print(f" 电源网格 {Rgrid} ohm: IR降 = {I*Rgrid*1e3:.0f} mV")
输出:
一段100um信号线的寄生: 20 um: R=2.0 ohm C=4.0 fF 50 um: R=5.0 ohm C=10.0 fF 100 um: R=10.0 ohm C=20.0 fF 200 um: R=20.0 ohm C=40.0 fF 走线50um 吃掉带宽: 极点在 15.92 MHz 走线100um 吃掉带宽: 极点在 7.96 MHz 走线200um 吃掉带宽: 极点在 3.98 MHz 电源网格 0.1 ohm: IR降 = 10 mV 电源网格 0.5 ohm: IR降 = 50 mV 电源网格 2.0 ohm: IR降 = 2000 mV
一段 100 μm 的"看不见的线"就能把 1 MΩ 输出阻抗的节点限到 8 MHz;电源网格电阻控制不好,1 A 芯片上几百毫伏的 IR 降等于给每个模块"自制了电压波动"。这些数字解释了模拟版图工程师为什么寸土必争。
后仿真是分水岭。前仿真(原理图级)通过只是入场券,寄生提取后的后仿真才见真章。经验流程:版图做到一半先做一次部分提取的"体检",别等全部画完才发现极点崩了。
数模分区。混合信号芯片(第 8 章)里,数字开关噪声经衬底与封装寄生污染模拟。标准做法:深 N 阱把敏感模拟圈起来、独立的电源域、封装选低感生引脚、时钟驱动远离输入级。
⚠️ 常见坑:只做"完全对称"不做"完全相同"。两个管子尺寸对称但走线一长一短,负载电容失配照样造成时钟占空比偏移——对称要贯彻到每根线、每个过孔。
💡 关键直觉:把版图当成"寄生预算的分配艺术":每个节点天生有额度,版图师的工作是让额度花在刀刃上,而不是消灭额度。
模拟放大链和它的物理实现都齐了。下一节把模拟与数字两个世界连起来:ADC 负责把连续信号变成数字,PLL 负责给数字世界制造一颗稳定的心脏。