为什么模拟版图是手艺活
在物理设计的学习线里,你看着工具摆放并连接上百万个 CMOS 门,而你大体上只是在掌舵。数字版图之所以能自动化,是因为逻辑门只需要*正确*——一根线长一点、一个晶体管宽一点,0 还是 0。模拟电路没有这样的缓冲垫。没有干净的 0/1 可以让它弹回去;每一个电压和电流都是连续的,而电路的行为依赖于本应完全相同的器件之间那些极细微的差异。正因如此,模拟版图至今仍主要是手工完成的,一个一个精心绘制的图形。
可以这样理解。在数字里,版图是一种*誊写*——把网表转成几何图形,含义就保留下来了。在模拟里,版图*本身就是设计的一部分*。一个在原理图上完美的 差分对 可能仅仅因为两个晶体管画的朝向不同,或者其中一个离一个发热的功率晶体管更近,就在硅片上失效。原理图捕捉的是意图;版图才决定物理是否会兑现这个意图。同一份网表的两种版图,其失调、噪声和增益可以天差地别。
这篇指南与物理设计学习线里的 布局布线 流程首尾呼应。两套技能是表亲——都是把电路变成硅片上的几何图形——但优先级正好颠倒。数字优化的是上百万个单元的面积、速度和可布线性。模拟优化的是几十个极度敏感的器件之间的匹配、对称,以及摆脱寄生效应和噪声。同样的 寄生参数提取 这一步,在数字里是给签核做后盾,而在模拟里,它是你发现自己手绘的手艺有没有经受住与现实碰撞的地方。
匹配:靠结构做到一模一样
模拟电路正确性中很大一部分都建立在一个理念上:两个器件表现得一模一样。一个 电流镜 复制电流时的忠实程度,只取决于它的两个 MOSFET 匹配得有多好。一个 差分对 抑制共模噪声的能力,也只取决于它的两半有多像一对双胞胎。但任何两个物理上分开的 晶体管 都不可能真正完全相同——刻蚀步骤在晶圆上各处不一、掺杂会漂移、氧化层厚度会有零点几纳米的游移。这些随机差异表现为失配:一个顽固的输入失调电压,或者一个偏差了 2% 的电流拷贝。
这里有模拟版图中最重要的一个量化事实:器件越大,随机失配越小。 在更大的面积上做平均,随机的局部变化会部分相互抵消。标准模型(Pelgrom 定律)告诉我们,失配的标准差与器件栅极面积的平方根成反比:
# Pelgrom mismatch model — random Vth mismatch vs device area sigma(dVth) = A_Vth / sqrt(W * L) # A_Vth ~ a few mV*um per node # Doubling BOTH W and L (4x the area) halves the mismatch sigma: sigma2 / sigma1 = sqrt( (W*L) / (4*W*L) ) = 1/2
共质心与虚拟器件
随机失配你用面积去对抗。系统性失配——横跨整个芯片的温度、氧化层厚度或机械应力的平滑梯度——你用*几何*去对抗。诀窍是 共质心版图:与其把要匹配的器件 A 放左边、器件 B 放右边(这样任何从左到右的梯度都会不均等地作用于它们),不如把每个器件拆成若干块并交错排布,让两者共享完全相同的质心。对于由晶体管 A 和 B 构成的 差分对,经典的排布是把每个都拆成两块,围绕一个公共中心摆成交叉耦合的 ABBA / BAAB 棋盘格——这样一条线性梯度给 A 的平均值增加的量,与给 B 的增加的量相同,于是电路真正放大的那个*差值*保持干净。这相当于版图版本的两个赛跑者共用一条跑道,让逆风把两人减速得一样多。
# Common-centroid 2x2 array: A and B share one centroid # col1 col2 # [ A ][ B ] <- a linear left->right gradient g adds: # [ B ][ A ] A_total = A + (0) + A + (g) ~ B_total: difference cancels # # vs. a NON-centroid layout [A][A][B][B], where B sees the full gradient g # and a fixed A->B offset survives.
还有两个习惯能让这一切落到实处。第一,虚拟器件(dummy):阵列*边缘*的晶体管刻蚀情况与内部的不同(只有一侧有邻居),所以你要用不起功能作用的虚拟副本把要匹配的阵列围起来。这些虚拟器件承受边缘的折腾;于是每一个真正重要的器件现在看到的都是完全相同的内部环境。第二,对称布线——一对匹配器件的两侧应当有相同的线长和相同的 寄生 负载,否则你就会用金属把刚刚在扩散层里抵消掉的失配又重新引入回来。
寄生效应咬得更狠
你画的每一根线都暗藏着一个电阻和一个 电容——它的寄生 R 和 C。在数字里这大多只是付出一点点延迟。在模拟里,同样的杂散 R 和 C 却能挪动一个极点、压低你的增益,或者使滤波器失谐,因为模拟在意的是*精确*的数值,而不仅仅是某个节点最终是否会稳定到 1。一个你忘了画上去的、挂在高阻抗节点上的 20 fF 寄生电容,在这里可不是舍入误差——它是一个完全不同的电路。寄生效应通过三道门伤害模拟电路。增益:单级 放大器 的增益由 跨导 和输出电阻决定,增益 = -gm*ro,而任何串联的寄生电阻或对地的寄生电导都会*降低*有效的 ro,偷走增益。带宽:高阻抗节点上多出来的寄生电容会降低极点频率 f = 1/(2*pi*R*C),使你的带宽变窄,还可能损害稳定性。匹配:如前所述,不对称的布线寄生会悄悄地把你费尽心力匹配好的一对器件再次拉得失配。
* AC sweep AFTER parasitic extraction to see the real bandwidth .include amp_extracted.spice ; netlist + R/C parasitics from layout .ac dec 100 1 1G ; 1 Hz -> 1 GHz, 100 pts/decade .print ac vdb(out) vp(out) ; gain in dB and phase .end * If the post-layout pole moved in, a parasitic C is the usual culprit.
由此而来的纪律是*版图感知设计(layout-aware design)*:让敏感、高阻抗节点上的线短而窄以减小电容,而载流的线则要粗;把与关键节点打交道的器件就摆在它旁边;并且把最后的 寄生参数提取 当作真正的考试,而不是一个打钩的步骤。诚实的模拟工作流是:仿真原理图、画版图、*提取*、然后对提取出的网表重新仿真——并且只相信第二个数字。
噪声、屏蔽与衬底
模拟电路一辈子都活在噪声底(noise floor)附近,所以版图必须把外部注入的噪声*挡在*安静节点之外。器件自身有无法消除的 热噪声(4kTR——这是物理,版图打不过)。但叠在它之上的是耦合噪声,好的版图能在很大程度上击败它:一个快速的 时钟 跳变沿通过电容踢一脚旁边的模拟走线,或者——最阴险的那个——通过共享衬底传播的噪声,那是每个晶体管都坐在上面的那块公共硅板。
对付耦合噪声有三件工具。屏蔽:在敏感走线旁边或上方走一根接地的金属线,让杂散电容耦合进地,而不是耦合进你的信号。隔离:让噪声大、快速开关的网络在物理上远离安静的高阻抗网络——距离是廉价的保险。保护环(guard ring):用一圈接到干净电源的衬底/阱接触把敏感模块围起来,给衬底噪声一条低电阻的入地路径,让它在到达你的电路*之前*就泄掉。想象一下在安静的模块周围挖一道护城河。
还有两个习惯很要紧。去耦电容(decap)直接放在模拟电源引脚处,给快速的电流涌动一个本地的蓄水池,从而让电源轨保持安静——这与物理设计学习线里电源网格上的去耦电容是同一个思路,只不过这里是为模拟的安静而调,而非为数字的电流而调。还有,让敏感节点保持小巧:线越少,供噪声耦合上来的天线就越短,这又是模拟布线靠手绘、而非自动生成的一个理由。
模拟与数字的边界
一颗现代的混合信号 芯片 把两个世界放在同一块晶片上:安静的模拟部分(你的 运放(op-amp)、基准、转换器)紧挨着一个咆哮的数字模块,后者把上百万个 CMOS 门在每一个 时钟 跳变沿翻转一次。最具决定性的布图规划(floorplan)抉择就是你在它们之间把边界画在哪里——因为正如我们刚才看到的,数字开关噪声最想做的事情,就是穿过衬底和电源,钻进你最敏感的模拟节点。
- 把两个域在物理上分开。 在布图规划里,把所有模拟聚到一个区域,所有数字聚到另一个区域;不要把它们交错混放。距离加上衬底电阻就是你第一道、也是最廉价的滤波器。
- 分开供电。 给模拟自己的 AVDD/AGND,给数字自己的 DVDD/DGND,让它们在一个刻意设计的单一星点处汇合——绝不让有噪声的数字地电流流过模拟地。
- 用保护环筑墙。 用接到干净地的衬底/阱接触把模拟孤岛围起来,让衬底噪声在跨越边界之前就先泄掉。
- 审慎地跨越边界。 把那少数必须跨界的信号(转换器的数字输出、时钟)走在带屏蔽或留足间距的线上,并让快速的数字跳变沿远离模拟输入。
- 跨边界重新提取。 对整个混合信号区域跑 寄生参数提取 并重新仿真——任何原理图都没显示出来的耦合,只会在提取出的版图里现身。
那条边界,正是这条模拟学习线与物理设计(ic-backend)学习线握手的地方:数字一侧由你已经学过的自动 布局布线 流程来摆放、布时钟、连线,而隔壁的模拟孤岛则用本指南里的一切手工绘制。一颗出色的混合信号芯片,是两门手艺隔着一道精心守护的围栏协同合作的产物。