
拉扎维的《模拟CMOS集成电路设计》读到第七章大部分人都会产生一种错觉——觉得自己会设计运算放大器了。直到某一天打开Cadence Virtuoso面对空白的schematic才发现课本公式和工艺参数之间隔着一整层现实。这篇笔记完整记录了一个两级密勒补偿运算放大器从指标拆解、手算W/L、Spectre仿真调到版图实现的全过程设计目标、管子和参数全部可复现。如果你正在学模拟CMOS集成电路课程或者刚接触运放设计与仿真、版图绘制这篇东西应该能帮你省下好几个通宵。1. 为什么是两级密勒补偿架构选择背后的指标博弈1.1 单级差分结构的天花板刚开始做运放设计的人经常问为什么非要搞两级单级差分放大器不是也能放大吗确实能但它的增益上限很尴尬。单级的增益近似为gm乘以输出电阻ro在0.35μm工艺下一个常规单级运放的增益往往只有4050dB。你可能会想用Cascode结构加输出阻抗不就完了Cascode确实能把增益推到70dB以上代价是输出摆幅被压缩得厉害在1.8V甚至3.3V的低压工艺中留给信号的摆幅窗口非常有限。我这次的目标是做一个CL3pF下DC增益超过70dB、单位增益带宽10MHz的运放同时要求输出摆幅尽量接近轨到轨。这几个指标放在一起单级结构基本无解要增益就没有摆幅要摆幅就没有增益。两级结构的思路是分工第一级差分输入管负责提供高增益和差模放大能力第二级共源放大管负责补充增益并承担输出摆幅。每个管子不用过分压榨增益和摆幅都能保住。1.2 密勒补偿不是加个大电容这么简单两级结构天然有两个高阻节点也就是两个低频极点。如果两个极点相距不远闭环接成单位增益时相位裕度很容易跌破45°产生振铃甚至振荡。密勒补偿的做法是在第一级输出节点和第二级输出节点之间跨接一个电容Cc利用第二级放大器的反相放大倍数把Cc折算到第一级输出端时等效电容变成Cc×(1Av2)。这个效应的结果是直接拉开了两个极点的距离第一级主极点被往低频方向推第二级输出极点被往高频方向推也就是所谓的极点分裂。你可以把主极点想成队伍里走得最慢的人密勒电容相当于给他脚上绑了沙袋让他更慢这样后面速度快的人不会被堵住整个环路更接近单极点系统稳定性自然就好。但是别忘了Cc经过米勒效应后还会在右半平面产生一个零点零点对应的频率大约是gm6/Cc。右半平面零点不但不帮稳定反而在GBW附近贡献额外的相位滞后会把相位裕度吃掉不少。所以标准两级运放里都会串一个调零电阻Rz把这个零点从右半平面拉到左半平面甚至直接放到第二极点频率上去抵消它。这部分手算细节我在第2节详细展开。1.3 设计指标怎么拆解增益、GBW、SR、功耗的联动这次的目标指标如下指标目标值工艺/电源0.35μm CMOS / 3.3V负载电容 CL3pFDC开环增益≥70dB单位增益带宽 GBW≥10MHz相位裕度 PM≥60°压摆率 SR≥20V/μs输出电压摆幅0.3V ~ 2.8V静态功耗≤0.7mW这些指标不是独立的拆解的时候要同时盯住几条约束链。增益链Avgm1×gm6×(ro1∥ro3)×(ro6∥ro7)任何一级阻抗不够都拉不满。GBW链GBWgm1/(2πCc)它只由第一级输入管的跨导和密勒电容决定跟第二级关系不大。SR链SR≈I5/Cc尾电流越大、补偿电容越小压摆率越高。功耗链总电流I5I6不能超过210μA左右3.3V下约0.7mW。你会发现GBW和SR都依赖Cc但方向相反Cc增大稳定性好、噪声小但GBW和SR都会下降Cc减小速度快了但极点分裂不够PM可能崩掉。所以手算的第一步不是到处加管子而是先把Cc和尾电流定下来。我的经验是Cc取CL的三分之一到二分之一初次设计取1.5pF后面在版图阶段还有调整空间。2. 手算W/L从指标到每个管子的宽长比2.1 先定补偿电容Cc和尾电流I5SR和GBW的约束我把Cc暂定为1.5pF。既然SR要求20V/μsSR≈I5/Cc那么I5至少要有30μA。为了给工艺角留余量我把第一级尾电流取到40μA这样SR40μA/1.5pF≈26.7V/μs无论FF还是SS角都不会跌破20V/μs。注意这里说的是第一级尾电流也就是流经M5、然后平均分成两路进入M1和M2的电流。每边差分管电流ID1ID220μA。GBW10MHz的要求反推第一级输入对跨导gm12π×10MHz×1.5pF≈94.2μS。这里的关键是第一级跨导和Cc定了GBW跟第二级无关。所以设计顺序应该是先定Cc和I5再算gm1再去倒推W/L。不要一上来就随便给管子定尺寸否则后面会发现GBW和SR打架。2.2 第一级差分对尺寸gm1决定GBW已知gm194.2μSID120μA工艺库里PMOS的μpCox大约50μA/V²。先算过驱动电压Vov12×ID1/gm12×20/94.2≈0.42V。这个值偏大但在这个功耗预算下可接受。再用平方律公式算宽长比W1/L1 gm1² / (2×μpCox×ID1) 94.2² / (2×50×20) ≈ 4.44取整为4.5L取1μm不是为了最小尺寸而是为了更高的输出阻抗和更好的匹配λ更小W4.5μm。注意L选1μm在这个工艺下ro会有明显提升这对第一级增益很关键。第一级的两个输入管M1/M2严格同尺寸版图阶段还要做共质心这个后面说。第一级增益估算沟长1μm时λ大约0.05/Vro2ro31/(λ×ID)1/(0.05×20μ)≈1MΩ并联后约500kΩAv1≈gm1×500k≈47倍。这只有33dB大头得靠第二级补。2.3 第二级放大管和负载管增益和摆幅的交叉点第二级电流I6我取150μA。为什么不是更小因为第二级跨导gm6直接决定GBW附近第二极点位置p2≈gm6/CL。如果I6只有50μAgm6上不去第二极点就压在GBW边上相位裕度很难看。取150μA时如果gm6做到1.4mS那么fp2gm6/(2π×CL)1.4m/(2π×3p)≈74MHz是GBW的7倍多单位增益处第二极点只贡献约7°相位滞后这是合适的。NMOS的μnCox约170μA/V²已知ID6150μAgm61.4mSVov6 2×150μ / 1400μ ≈ 0.21V W6/L6 gm6² / (2×170μ×150μ) ≈ 38.4取W6/L638L1μmW38μm。这个管子较大版图里必须拆指不能一根大条画到底。第二级负载M7是PMOS电流源过驱动不能太小否则输出高电平抬不上去我取Vov70.5V那么W7/L72×150μ/(50μ×0.25)24。这样Vout最高能到3.3-0.52.8VVout最低到Vov6≈0.21V摆幅覆盖0.3~2.8V没问题。第二级增益ro6和ro7在150μA下大约都是130kΩ并联约65kΩAv2gm6×65k≈91倍约39dB。总增益估算在72dB以上指标已经够到。2.4 调零电阻Rz把右半平面零点赶到左边接下来是补偿电阻。如果不加RzCc会把零点放在zgm6/Cc≈933Mrad/s约148MHz这是一个右半平面零点在GBW附近相位恶化严重。串上Rz之后零点频率变为ωz 1 / (Rz×Cc - Cc/gm6)我们希望这个左半平面零点大致抵消第二极点ωp2gm6/CL。令ωzωp2解得Rz (CLCc) / (gm6×Cc) (3p1.5p) / (1.4m×1.5p) ≈ 2.14kΩ取标准值2.2kΩ用poly电阻实现。这里有个实操经验Rz不要做成可调的第一次流片就固定一个值仿真验证时确保它在TT、FF、SS下都能保证PM60°。如果工艺偏了零点没完全抵消只要Rz在1.5k~2.5k范围内相位裕度都有余量。2.5 设计参数汇总表手算结束整张设计表长这样器件作用W/L (μm/μm)直流电流过驱动电压M1/M2PMOS差分输入对4.5/120μA each0.42VM3/M4NMOS电流镜负载3/120μA each0.30VM5PMOS尾电流源10/140μA0.40VM6NMOS第二级放大管38/1150μA0.21VM7PMOS第二级负载24/1150μA0.50VCc密勒补偿电容1.5pF--Rz调零电阻2.2kΩ--这表不是最终结果而是仿真的起点。手算模型本身有误差比如λ估算、Cox精度、寄生电容这几个因素都会让实际结果偏移但有了这版参数Spectre仿真的迭代次数就能控制在两三轮以内。真正麻烦的是下一节要说的仿真环节。3. Spectre仿真实录从工作点检查到工艺角扫描3.1 第一件事永远是DC工作点所有管子必须饱和很多人一上来就跑AC波形乱成一团才开始怀疑人生。正确顺序是先做DC工作点分析。在ADE L里跑dc后查看operating point每个管的region必须是饱和区一般显示为region2也就是saturation。我这次遇到的第一个问题是M3/M4电流镜没有做好两侧电流差了1.2μA直接导致第一级输出共模点偏低M6的Vgs被抬得很高第二级电流偏离150μA。排查方法是查看M1/M2/M3/M4的Vds、Vgs、Vov一项项对照手算值。重点看两个地方一是第一级输出节点电压它应该让M6工作在饱和区同时M4的Vds不能太低二是M5尾电流管是否真的稳住了40μA如果Vds5不够尾电流源会变成一个电阻CMRR会非常难看。我的做法是给M5的L留大一点让它的输出阻抗更高尾电流更稳。DC工作点正常了后面所有仿真才有意义。3.2 开环AC仿真别直接开环用Stb或大电感反馈AC仿真的坑在于高增益运放开环时DC工作点根本稳不住一个小偏置就把输出打到轨上。这里推荐用Cadence的stb仿真在环路里插入iprobe设好正负输入端stb会直接给出环路增益和相位裕度曲线不需要外接大电感反馈网络特别省事。如果还是习惯传统开环AC测试bench可以用大电感把输出引回反相输入端比如接一个1GH的理想电感这样DC时是闭环工作点稳定AC下电感阻抗极高等效于开环。再配合从同相输入端串一个大电容进去保证共模点不被直流源拉偏。两种方法我都试过stb的结果与理论值更直接数值上也能对上。AC仿真读三个数低频增益、0dB带宽也就是GBW、0dB处的相位。我第一版仿真得到的低频增益是73dBGBW约9.7MHzPM约64°。这里多说一句GBW和PM是工艺角变化的敏感项前仿真阶段一定要在五个工艺角下都看一眼再往下走。3.3 手算和仿真为什么对不上误差来源与微调手算增益73.9dB仿真73dB差距不大但GBW比10MHz略低。主要原因是寄生电容第一级输出节点的寄生电容和Cc并联把主极点推得更低且gm1受短沟道效应影响略低于手算。另外手算λ用的是经验值0.05/V实际模型在L1μm下的ro可能只有800kΩ~900kΩ这会直接吃掉第一级增益。所以手算的目的是找出哪些参数对哪个指标最敏感而不是追求精确预测。比如发现GBW低了先看是不是gm1不足再决定是加大尾电流还是减小Cc。仿真中出现10%~20%的偏差是正常的不要急着大改架构。微调的优先级我一般这样定先调Cc和Rz改善稳定性再调M5电流调整SR和GBW最后才动M6和第二级尺寸因为动第二级会牵连摆幅和功耗影响面最大。3.4 CMRR与PSRR的仿真方法共模抑制比的测法在单端输出运放上比较直接。差模增益Ad的测试给同相输入端加ac1反相输入端ac0输出得到的Vout就是Ad。共模增益Ac的测试把两个输入端短接公共端加ac1输出得到的Vout就是Ac。CMRR20log10(Ad/Ac)。注意这时候第一级尾电流源的输出阻抗起了决定性作用M5的ro越大CMRR越好。所以好一点的运放会把尾电流源做成Cascode。我第一版仿真的CMRR只有62dB明显偏低原因就是M5沟道太短。把M5的L从1μm加到2μm、调整W保证Vov不变后CMRR提升到78dB。另外电流镜M3/M4的失配也会直接贡献共模增益版图阶段做共质心就是为这一步兜底。PSRR的仿真类似把ac源加到VDD上测输出到电源的小信号增益再与Ad相比即可。我仿真得到的PSRR约65dBPSRR-约72dB这个量级对教学流片而言够用。3.5 全工艺角、全温度扫描规范里的装死时刻前仿真在TT角下PM64°我还挺高兴切到FFfast-fast角后PM直接掉到58°再叠加-40℃低温某些情况下甚至跌到54°。这就是所谓装死时刻单点仿真过了工艺角一跑就露馅。原因其实很清楚FF角下gm普遍偏高第二极点fp2gm6/CL被推高看起来是好事但第一级零点、寄生极点也都在移动Cc的绝对值却不随工艺变旧零点抵消方案就失效了。解决办法是把Rz从2.2kΩ调到2.0kΩ让零点位置在整个工艺角范围内更居中PM在FF/-40℃下恢复到62°。GBW在SS角会掉到8.2MHz左右这通常可以接受因为设计指标允许有10%的裕量。我的习惯是至少跑TT/FF/SS三个工艺角每个角跑-40℃、27℃、85℃三档温度共9个组合确保PM最小值不低于55°。3.6 瞬态仿真不收敛一条完整的排错链路这节对应很多人都会踩的坑Tran analysis失败或者仿真器把时间步长压到femtosecond级跑一天都没结果。我第一次遇到时以为是电路哪里接错了查了半小时schematic无果。后来总结出一套排查顺序按这个顺序走基本都能定位。第一查DC工作点。瞬态仿真之前如果DC不收敛transient一定不收敛。先跑dc看看有没有节点悬空、环路没有直流路径、或者某个节点的初值处于两个稳定状态之间。运放接成闭环时如果输出级有较大失调DC会硬把输出推到轨上这时先查输入失调和环路极性。第二检查仿真算法和精度设置。把积分方法换成gear2或trbdf2reltol从1e-3放宽到1e-4有时候就能跳过仿真器内部的数值不连续。同时给tran设置合理的maxstep比如1ns或者总仿真时间的1/1000不要完全留给自适应步长处理。第三查是不是电路真在振荡。如果stb显示PM不足tran在闭环接法下就会高频振荡仿真器为了追踪振荡波形不断减小步长表现为不收敛。我遇到过一次单位增益缓冲器接法下高频啸叫后来发现是Cc取值过小导致PM只有35°把Cc从1pF改成1.5pF后波形立刻干净。第四检查后仿真阶段是否引入了过大寄生电阻和电容。版图提取后某个节点的RC延迟会让环路在高频处多一个迟滞极点瞬态时表现为振荡这时要回到版图去缩短关键走线而不是硬调电路参数。4. 版图实现共质心、隔离环和后仿真的真实挑战4.1 差分对和电流镜的共质心布局画到版图这一步才算真正接触到模拟IC设计的手艺活。差分对M1/M2的匹配直接决定输入失调电压和CMRR。常规做法是把每个输入管拆成两个finger按ABBA交叉排列让它们共享中心的对称点。为什么要这么排因为芯片制造过程中存在晶圆径向的梯度变化比如氧化层厚度、掺杂浓度的缓慢渐变。如果两个管子一左一右分开很远梯度差就会被转化成VosABBA交叉之后一阶梯度在质心处互相抵消失调能减小一个数量级。M3/M4电流镜也一样必须保证两个管子的源端和漏端走线尽可能等长等宽接触孔数量一致四周摆放dummy管。我的具体操作是所有匹配管的两侧各放一条不接线的dummy管保证边缘刻蚀环境一致金属走线尽量用同一层同方向不要在匹配管之间穿插长距离的poly走线。这些看似琐碎的细节对LVS不产生影响但直接决定这颗运放流片回来能不能用。4.2 大尺寸晶体管的拆指与布线M6的W/L38/1M7的W/L24/1这种尺寸不能画成一个大方块。必须拆成多个fingerM6我拆成4指每指约9.5μmM7拆成4指每指6μm。拆指有几个好处栅极电阻变小高频性能更好每个finger的源漏共用寄生结电容反而比单个大管子小版图应力分布更均匀。拆指后要注意栅极的poly连接方式。一般用金属从两端把poly栅接到一起不要只在单侧接否则远离接点那个finger的栅极信号会有明显延迟。源漏的金属接触孔要尽量多打几个大电流下接触孔电阻和电流拥挤不可小视。M6在150μA下源漏电流密度不大但输出节点的寄生电容会加大所以输出走线尽量短直接接到Cc和下一级不要绕远路。4.3 补偿电容和电阻的版图落地Cc1.5pF在0.35μm工艺下面积不小。如果用poly-poly电容典型容值密度约1fF/μm²需要大约1500μm²的面积画成多个小方块并联避免一个大方块产生过大的寄生底板电容。如果工艺提供MIM电容密度类似但MIM电容的电压系数更小对线性度更友好。教学流片一般poly-poly电容就够了。Rz2.2kΩ用poly电阻实现先查PDK里poly电阻的方块阻值和最小宽度。假设方块阻值200Ω/□那么2.2kΩ需要11个方块画成宽度2μm、总长22μm左右。电阻放在比较边缘的位置远离输出功率管的发热区域否则温度变化会让零点偏移。由于Rz精度要求不高不需要特别匹配但两端接触孔一定要打够避免接触电阻产生额外误差。4.4 隔离环和衬底接触防止闩锁与噪声耦合版图里隔离环不是装饰是底线。NMOS管做在P型衬底上周围必须打一圈P衬底接触环并接到VSS这圈保护环一方面为体内电流提供低阻路径防止少子注入引发闩锁另一方面吸收来自相邻模块的衬底噪声。PMOS管做在N阱里N阱周围要打N环并接到VDD防止PNPN结构导通。有一个细节很多初学者会漏PMOS差分输入对和PMOS尾电流源如果放在同一个N阱里且衬底电位都是VDD那没问题可以共用一个阱但M5的源漏电压和M1/M2可能不同这时候比较容易出现阱间通过衬底耦合的噪声。我的习惯是输入对单独放一个阱尾电流管单独放一个阱两个阱间距留够中间打衬底接触环。另外所有阱的potting越是干净运放的CMRR在高频段就越不容易恶化。4.5 DRC/LVS后仿真一切重新来过版图画完用Calibre跑DRC第一次必然报一堆错最小间距、poly延伸、接触孔包覆、金属密度不够。修DRC的过程不涉及电路原理但很消磨耐心。修完DRC跑LVS它会比对schematic和layout的网表检查每个管子的W/L、连接关系、端口定义。有一个常见问题是M6拆成4个finger后LVS把它当成4个并联管子如果schematic里M6是一个整体器件两边就不匹配。解决方法是在schematic里也把M6定义成4个finger的multi-finger管保持网表一致。我还调整了走线以降低M6栅极到第一级输出节点的寄生电容因为这个高阻节点的寄生电容直接与Cc并联会让GBW再掉一点。重新做后仿真后发现增益变化不大但PM从64°掉到57°原因是输出节点寄生电容和负载电容叠加导致第二极点下移。最后通过把M7的W/L稍微加大一点同时略微调整Rz让后仿真PM回到61°。这就是带版图的运放设计和纯前仿真最大的区别你调的不只是管子尺寸还有寄生和布局。一些真实体会这次设计完整走下来最大的体会是手算、前仿、后仿三套数据互相印证任何一个环节脱节都是要返工的。手算阶段可以快速试错前仿阶段磨合电路架构后仿阶段才是真正检验你版图画得好不好的时候。我见过不少人前仿真数据漂亮后仿真一塌糊涂最后发现问题全出在匹配和寄生上——这恰恰是版图的价值所在。最后分享一个小技巧在开始画版图之前先把所有要匹配的管子整理成一个表格列清W/L、finger数量、是否需要dummy、放在哪个阱里。画图的时候按表格走能少犯很多低级错误。模拟IC设计这份工作大部分时间不是在搞脑子而是在跟细节较劲。