ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Cadence Virtuoso稳定性仿真指南:stb分析、相位裕度与Miller补偿实战

Cadence Virtuoso稳定性仿真指南:stb分析、相位裕度与Miller补偿实战 做模拟IC设计的人早晚都会撞上稳定性这堵墙。调好的运放一接成闭环就震荡输出波形像得了帕金森示波器上看去全是毛刺这几乎是每个工程师都经历过的噩梦。我入行那会儿第一次拿着自己设计的两级运放去流片回来一测试缓冲器接法下输出直接啸叫原理图看了十几遍也看不出毛病后来才明白是相位裕度只有二十几度反馈环路在单位增益频率附近相位滞后太多系统自己振荡起来了。Cadence Virtuoso里分析反馈环路稳定性核心手段就是仿真波特图看环路增益曲线和相位曲线算出相位裕度Phase Margin和增益裕度Gain Margin。这篇文章就以两级运放为例从原理到实操手把手带你跑通整个稳定性仿真流程。适合刚接触模拟IC设计的学生、初级工程师还有那些一直在用试错法调电路、却始终没搞清楚稳定性的朋友。我会把Stb仿真设置、波特图判读、Miller补偿参数选择这些关键环节都拆开来讲把我在实际项目中踩过的坑和总结的经验一并写出来。1. 反馈环路稳定性到底在分析什么1.1 稳定性问题的本质负反馈为什么会变成正反馈分析反馈环路稳定性首先要理解一个看似矛盾的现象运放明明接的是负反馈为什么还会自激振荡负反馈的本质是“检测输出变化然后反向调节输入”。理想情况下输出如果升高了反馈网络会把信号送回反相输入端把输出拉回去。但如果信号在环路里走一圈需要时间情况就变了。任何实际电路都有寄生电容、寄生电阻运放内部还有多级放大带来的寄生极点这些都会让信号在环路中产生相位延迟。当环路增益还大于等于1的时候信号绕一圈回来的总相移已经达到了180度原本的负反馈就变成了正反馈。正反馈意味着输出一旦有一点扰动就会被环路不断放大直到电源轨限幅电路就震荡了。用生活化的例子来类比你在家开空调温度高了就制冷这是负反馈。但如果你反应迟钝已经热得不行了才开始制冷然后温度降下去了你还在拼命制冷等冻得受不了了才开始制热于是房间温度就这么来回大幅波动。运放的反馈环路也一样反应太慢相位滞后太多系统就会在设定点附近来回震荡。波特图就是把这个过程可视化、定量化的工具。横轴是频率纵轴分别是环路增益的幅度dB和相位度从图上一眼就能看出增益什么时候降到0dB相位在那个频率点还剩多少余量。1.2 两级运放为什么特别容易不稳定两级运放是教科书上最经典的拓扑第一级提供高增益第二级提供大摆幅中间加Miller补偿电容。我用过的绝大多数通用运放本质上都是两级或者类似结构。为什么不稳定问题在两级运放上特别突出原因是它天然有三个以上的极点。第一级输出节点通常是共源共栅或者差分对的高阻节点、第二级输出节点、以及补偿网络引入的零点再加上负载电容形成的极点主极点、第二极点、第三极点一多相位滚降就非常快。每个极点大约会让相位滞后90度两个极点叠加就到了180度。如果主极点频率不够低、单位增益带宽又设得比较高那么GBW单位增益带宽附近很可能已经有两个极点生效相位裕度就会掉到30度以下。相位裕度低于45度时闭环阶跃响应会出现明显的振铃接近0度时就直接振荡了。我在学校实验室做过一个很直观的验证同一个两级运放不加Miller电容接成单位增益缓冲器输出接一个20pF的负载电容上电就振荡波形频率大约几百kHz到几MHz电源电压一波动频率还跟着漂。加上补偿电容之后同样的电路就安静了。这就是稳定性分析要解决的问题。2. 仿真前的准备电路搭建与测试环境配置2.1 两级运放的测试基准电路在Cadence Virtuoso里做稳定性仿真先要有一个明确的被测对象。我以一个典型的两级运放为例结构如下第一级PMOS差分输入对M1、M2加有源负载NMOS电流镜M3、M4输出为单端高阻节点。第二级共源放大器NMOS放大管M5加PMOS电流源负载M6。补偿网络Miller补偿电容Cc连接在第一级高阻输出和第二级输出之间可以串联一个调零电阻Rz来推零点。偏置电路电流镜提供尾电流源I_tail。测试配置有两种接法一种是单位增益缓冲器输出直接接反相输入端另一种是闭环增益配置用两个电阻分压反馈。我的经验是分析环路稳定性最好用单位增益配置因为这是反馈最深、最难稳定的接法如果单位增益下相位裕度够那其他增益配置下更容易稳定。搭建测试平台时输入信号从正相输入端加入反相输入端与输出直接相连反馈环路闭合。负载电容按实际应用情况加比如片上负载可以取2pF到10pF片外负载可能到50pF以上。2.2 ADE L与ADE XL的环境设置要点Virtuoso里做仿真老工程师习惯了用ADE L但我现在更推荐ADE XL尤其是做参数扫描和PVT验证的时候。ADE XL的界面起初用起来不太顺手习惯了之后发现它的corner管理、参数扫描、结果对比功能确实比ADE L强太多。基础设置步骤打开原理图Launch → ADE XL或者Launch → ADE L看你习惯。选择仿真器一般是spectre。注意不要选成spectre_aps除非你明确需要否则它默认行为有些差异。设置模型库。我在Setup → Model Libraries里添加工艺厂的模型文件如tsmc、smic等不同工艺的模型文件路径和格式略有区别但原则相同必须包含所有用到的器件模型包括晶体管、电阻、电容、电感。选择analysis类型。稳定性仿真的核心设置在后面会详细讲这里先确认是否可以看到stb选项。一个容易踩坑的地方如果模型库里同一类型器件有多个版本比如5V和1.8V的管子务必确认你选的管子型号在模型库里被正确定义不然会报出device not found之类的错误后面会详细说。2.3 仿真器类型选择为什么首选spectreCadence Virtuoso支持的仿真器有好几种spectre、spectre_aps、hspice、ultrasim等。做小规模模拟电路的稳定性分析我基本只用spectre。原因有几个spectre的收敛性在同类SPICE类仿真器中表现稳定对电路规模小、含有有源器件和高增益环路的电路尤其可靠。stb分析功能在spectre中实现得比较完整可以直接插入probe不需要手动构建开环测试平台。和Virtuoso原理图的集成度高改参数、跑corner、看波形都在同一个环境里完成。spectre_aps是并行加速版适合大电路但设置复杂而且某些情况下数值噪声比spectre大做高增益运放的稳定性分析时反而容易出奇怪的结果。我的建议是先跑spectre如果电路太大跑不动再考虑其他方案。3. Stb仿真Virtuoso里分析环路稳定性的核心方法3.1 为什么不用开环AC仿真而用Stb很多人刚学的时候想到的第一种方法是把反馈环路断开在断开处加AC小信号激励然后测输出端的AC响应。这种方法不是不可以但有致命问题直接断开环路会破坏直流工作点。运放的开环增益极高输入端稍微有一点失调就会被放大到电源轨晶体管早就偏离了正常的工作区域测出来的AC增益曲线完全失真。为了解决这个问题传统做法是在断开处加一个大电感和大电容来做直流隔离电感隔交流、通直流电容通交流、隔直流。这个方法能用但有很多约束电感和电容的值必须选得合适断开点的阻抗要尽量小而且只适用于单环反馈。对于多环反馈比如环路里套着局部反馈这种方法就无能为力了。Cadence Virtuoso里的stb分析正是为了解决这些问题而生的。它的原理是在环路中插入一个特殊的probe元件一般是iprobe或者stbcells仿真器会计算这个probe处的环路增益、环路相位输出波特图。关键优势是不需要破坏直流工作点probe对直流是透明的。支持任意复杂的反馈拓扑包括多环嵌套。计算得到的Loop Gain和Phase是精确的环路特性不是简单的开环增益。所以我现在的所有稳定性分析只要条件允许全部用stb方法不再用断开环路加L/C的老办法。3.2 Stb仿真设置步骤与probe放置在Cadence Virtuoso中做stb仿真具体操作可以按下面的步骤来在原理图编辑器中从库中调出一个iprobe元件。不同工艺库和Virtuoso版本可能位置不同一般在analogLib或Cadence_AMS库中可以找到iprobe、stbprobe等。将iprobe串行插入反馈环路中的某一点。对于单位增益缓冲器接法我习惯插在输出节点和反相输入端之间也就是把输出到反相端的连线断开中间串入iprobe。打开ADE XL创建新的analysis类型选择stb。在analysis的设置界面中指定probe instance就是刚才插入的iprobe设置扫描频率范围。一般设到从1Hz或10Hz开始到运放GBW的10到100倍为止。比如预计GBW在10MHz扫描上限可以设到100MHz甚至1GHz。选择要输出的变量loopGainLoop GaindB和loopPhaseLoop Phase度或phaseMarginPhase Margin。有些版本还能直接输出gainMargin。运行仿真在结果窗口中调出波特图。关于probe放置位置有个必须要注意的原则probe必须放在环路中并且环路要从这个点“打开”又“闭合”仿真器才能计算出正确的环路增益。如果probe放错了地方比如放在了环路外面或者放到了某个局部反馈的内部计算出来的结果就会很奇怪增益曲线怪异、相位曲线乱跳。我刚开始用stb的时候犯过这个错误把probe放在了输出负载电阻的旁边而不是反馈路径上结果相位裕度显示为负值但实际上电路是稳定的。这种情况需要仔细检查probe到底插在了哪条路径上。3.3 波特图判读0dB穿越点与相位裕度的计算仿真跑完你会得到两条曲线一条是环路增益幅度随频率变化的曲线一条是环路相位随频率变化的曲线。判读步骤找到环路增益幅度曲线穿过0dB线的频率点这个频率就是环路单位增益频率通常记作( f_{0dB} ) 或者环路带宽。在这个频率点上读取相位曲线对应的相位值。相位裕度 ( PM 180° \theta(f_{0dB}) )。如果相位曲线在0dB频率处是-90度那么PM就是90度。如果相位曲线是-135度PM就是45度。举个例子。我做过一个两级运放stb仿真显示环路增益在1kHz时约80dB然后以-20dB/dec斜率滚降在10MHz处穿过0dB。相位曲线从低频的-90度开始在接近10MHz的地方已经滚到了-130度左右。算下来PM约50度这对通用运放来说算是及格了但如果要驱动大电容负载或者要求低振铃这个值还不够需要进一步优化。增益裕度的判读方法是在相位曲线达到-180度的频率点上看环路增益曲线距离0dB还有多少衰减量这就是增益裕度。一般要求GM大于10dB否则即使PM看起来还行在某些工艺角和温度条件下也可能出问题。我在实际项目中通常拿PM60度作为目标值。60度对应的闭环品质因数是临界阻尼附近阶跃响应振铃很小既能保证稳定又不会牺牲太多带宽和建立速度。4. 环路增益曲线的深度解读与设计指标权衡4.1 主极点、次极点与相位滚降的关系读懂波特图的关键是理解极点和零点对增益、相位的影响。两级运放环路增益曲线的典型形状是这样的低频主极点由第一级高阻输出阻抗和补偿电容Miller效应形成从主极点频率开始增益以-20dB/dec的斜率下降。第二个极点通常在第二级输出节点与负载电容相关从该频率开始增益下降斜率变为-40dB/dec。零点由Miller补偿电容的馈通路径和调零电阻形成零点频率处斜率变回-20dB/dec。极点对相位的贡献是在极点频率之前已经开始一般人为地记住在0.1倍极点频率处相位已经下降了约5.7度在极点频率处相位下降了45度在10倍极点频率处相位下降约84.3度。所以如果第二个极点频率就在0dB穿越频率附近那么即使在穿越频率处相位只多下降了接近45度相位裕度也会很紧张。这里我总结一个实用的设计思路设主极点为( f_{p1} )次极点为( f_{p2} )。如果( f_{p2} )远大于( f_{0dB} )至少2倍以上那么PM会比较充裕。但如果( f_{p2} )恰好落在( f_{0dB} )附近PM就会急剧恶化。所以看波特图时看到0dB穿越点旁边相位快速滚落就要意识到次极点位置太靠近带宽了。4.2 相位裕度与闭环响应的关系相位裕度不只是“够不够稳定”的判断依据它直接决定闭环系统的动态行为。拿单位增益闭环来说如果PM很小比如20度闭环传递函数在频域会有一个很高的谐振峰。表现在时域就是阶跃响应剧烈振铃甚至连续振荡。PM45度时阶跃响应大约有20%到30%的过冲振铃3到4个周期后衰减。PM60度时过冲大约在8%到10%振铃只有1到2个周期很快进入稳态。PM75度以上过冲更小但闭环带宽会变低建立速度反而变慢。这里有个反直觉的现象不是PM越大越好。PM接近90度意味着相位几乎不滚降环路响应很“慢”闭环带宽远低于0dB穿越频率电路的速度优势就浪费了。所以工业界通常取PM在60度到70度之间兼顾稳定性和速度。做高速电路时PM可能会放宽到45度甚至更低但这时候必须认真评估振铃对信号链路的影响。4.3 增益裕度为何同样重要很多人只看相位裕度忽视增益裕度这是不对的。增益裕度描述的是如果环路增益在-180度相位处还大于1电路一定会振荡所以增益裕度衡量的是环境变化后环路是否会恶化到不稳定。工艺角FF、SS、TT、电源电压变化、温度变化-40度到125度晶体管的小信号参数变化很大。某个corner下PM原本有60度到了另一个corner可能次极点频率下移PM掉到30度同时GM从12dB掉到5dB。这种情况在量产中很危险。我建议在仿真阶段就把四个工艺角和三个温度点-40、27、125全部跑一遍stb分析看PM和GM的边界值。如果最差corner下PM仍然大于40度、GM大于8dB这个运放的稳定性设计才是真正合格的。我经历过的两次流片问题一次是只看了TT corner另一次是忘了看高温SS corner都有过教训。5. 补偿策略用Miller电容把相位裕度调回来5.1 Miller补偿的工作原理极点分裂两级运放不稳定根本原因是主极点和次极点靠得太近0dB穿越频率附近相位滚降太快。解决思路就是让主极点尽量压低次极点尽量推高这样在0dB穿越点附近只剩下主极点的影响次极点的影响还没起来相位就能保住。Miller补偿电容跨接在第二级放大器的输入和输出之间利用Miller效应把输入端的等效电容放大1 Av2倍其中Av2是第二级的电压增益。这样一来主极点频率被显著压低。同时Miller电容在高频时形成从第二级输入端到输出端的直通路径在输出节点引入一个高频零点或极点通过合理设计可以让次极点被推高或者让零点抵消掉次极点的影响。直观理解Miller电容就像在两级之间加了一个“记忆元件”它把高频信号从第二级输出直接耦合回第一级输出形成了更强的反馈深度让低频增益不受影响但高频增益快速下降从而降低单位增益带宽附近的相位滞后。5.2 调零电阻的作用与选取方法单靠Miller电容会在右半平面产生一个零点因为信号从输入到输出有前馈路径这个零点对相位是恶化作用的。为了消除或移动这个零点标准做法是串联一个调零电阻Rz。我只接Cc不接Rz时零点频率约等于 ( f_z g_{m5}/(2\pi C_c) )这个频率往往落在带宽附近相位被拉向负方向PM反而更差。加了Rz之后零点频率变成 ( f_z 1/(2\pi C_c (1/g_{m5} - R_z)) )。当 ( R_z 1/g_{m5} ) 时零点被移到了左半平面还能用来抵消次极点的影响。实际选取方法先不加Rz跑stb看PM然后扫Rz从0到几kΩ每次看PM变化。你会发现Rz存在一个最优值在这个值下PM最高。基本原理就是让零点落在次极点频率附近实现“极点-零点抵消”pole-zero cancellation。但我必须提醒零极点抵消在实际电路中要留够余量因为工艺变化会导致Rz和gm同时漂移完全抵消不可能只能做到“差不多”。我常用的方法是用参数扫描。在ADE XL里把Rz设为一个变量扫描范围比如100Ω到2kΩ步长100Ω跑完stb后把PM随Rz变化的曲线画出来选PM峰值附近、但对Rz变化不敏感的点。这样做既保性能又保工艺鲁棒性。5.3 不同负载条件下的稳定性验证补偿必须结合实际负载来设计。因为两级运放的次极点位置和负载电容直接相关负载越大次极点越低PM越差。我在一个项目中遇到过这种情况运放设计时负载假设是5pFPM 65度非常理想。后来系统架构改版输出要驱动50pF的片外电容结果PM掉到15度整个系统工作不正常。这时候有两个方向一个是增大Miller电容Cc把主极点进一步压低以换取次极点的相对推高另一个是在输出级增加缓冲器把大电容负担隔离掉。对于负载电容的扫描验证我的习惯是Cc和Rz选定后把负载电容CL从0.5倍目标值扫描到2倍目标值确认PM的最差情况仍然在可接受范围内。这比只测单点负载更稳妥因为系统集成后PCB走线寄生电容、后续电路输入电容都是在设计阶段估算的和实际值之间总会有偏差。6. 常见问题排查与仿真经验技巧6.1 Stb仿真结果异常probe位置与方向检查在用stb分析时我遇到的第一个坑就是probe方向。iprobe是有方向性的箭头方向代表信号流的方向。如果probe方向接反了仿真相位曲线会从-270度开始而不是正常的-90度附近。这在某些版本中会表现为PM计算错误。我的做法是放置完probe后画一条连线路径确认信号从输出到反相输入端的流向让probe箭头与信号流方向一致。如果波形出现相位起始点在-270度而不是-90度把probe旋转180度再仿真一次。另一个常见问题是probe没有真正插到环路路径上。有时候为了方便直接在输出节点和反相输入节点之间加了一个短线再插probe但没有确保整个环路只有通过probe这一条路径。如果还有其他并行路径比如寄生反馈路径stb结果就不准确。检查方法是在原理图上沿着反馈路径走一遍确认信号经过probe后还要经过反相输入端和差分对才算闭合。6.2 瞬态仿真不收敛或震荡波形异常稳定性分析除了看波特图还需要用瞬态仿真来验证。有时候stb显示PM足够但瞬态波形还是振荡这时候要排查以下问题工作点是否建立正确。加电瞬间电源上升太快电路可能进入一个错误的偏置状态。我在瞬态仿真的前100ns会加一个缓慢上升的电源斜坡比如从0V到3.3V用10us斜坡帮助电路建立正确的直流工作点。仿真步长设置。spectre默认的瞬态步长可能太大无法捕捉高频振荡细节。我会设置maxstep为振荡周期的十分之一以下比如预期振荡频率10MHz周期100nsmaxstep设5ns或更小。数值噪声和收敛容差。如果仿真不收敛可以尝试调整iabstol和vabstol适当放宽电流和电压绝对容差或者改用gear2积分方法在transient analysis设置中的integration method选项。瞬态仿真是稳定性分析的最终裁判。波特图说PM45度时你可能觉得还行但瞬态波形会告诉你振铃到底能不能接受。我习惯的做法是用stb快速筛选设计方案用瞬态确认最终设计的行为。6.3 相位裕度不足时的快速调整清单当仿真结果显示PM不够时我按下面的优先级来排查和调整看次极点频率。如果次极点离0dB穿越点太近考虑增大Cc把主极点压低缩小GBW换稳定。看零点位置。用调零电阻Rz把零点移到次极点附近抵消相位恶化。减小负载电容或提高输出级跨导。负载电容减小次极点自然升高。提高第二级跨导也能推高次极点但会增加功耗。检查是否有多余的寄生极点。比如第一级输出节点的寄生电容过大会引入一个额外的极点把这个节点的寄生电容降低减小管子尺寸、优化版图也能改善PM。这些调整顺序不是固定的要根据具体的瓶颈来定。我通常先跑一个stb扫描把Cc、Rz、CL都作为变量看PM的响应面这样能快速定位我该加Cc还是加Rz这个问题的答案。6.4 仿真波形的显示与数据导出清单Virtuoso的波形窗口Waveform Window提供了很多实用功能。在查看波特图时我会做这样几件事使用Markers功能标出0dB穿越点和相位曲线对应点直接在图上读出PM和GM。选中波形后右键选择Marker → Place Marker然后在曲线上拖动十字光标会同时吸附在两幅图上如果它们是同一个analysis的多个输出。用Calculator读取特定频率点的数值。有时候需要精确知道某个频率下环路增益衰减了多少用calculator的value函数配合freq函数可以快速得到。导出数据用CSV格式。在波形窗口中File → Export选择要导出的波形和数据精度。这样可以用Python或者MATLAB做后续分析。我在写设计报告时经常用这种方法把仿真数据和理论计算放在一起对比。还有一个技巧在ADE XL里同时列出多个corner的PM和GM数值就是在Outputs标签页里添加phaseMargin和gainMargin作为输出仿真结束后结果表格会直接显示每个corner对应的数值。这比肉眼在波形中逐一寻找高效得多。7. 从原理图到流片稳定性验证的完整流程这部分说一说我在完整项目里的稳定性验证流程。从原理图设计到流片前一个运放的稳定性验证不是跑一次stb就算完事的而是要形成一整套验证矩阵。第一步拓扑选择和参数初算。根据负载、带宽、功耗预算先初步确定Cc和尾电流得到第一版原理图。第二步stb仿真初筛。在TT corner、27度、典型负载下跑stb看PM和GM是否达到目标。第三步corner全覆盖。跑完FF、SS、FS、SF四个工艺角以及-40、27、125三个温度点至少12个组合看PM和GM的边界。第四步负载和电源扫描。CL从最轻到最重VDD从最低到最高确认稳定性没有死角。第五步瞬态验证。在单位增益缓冲器接法下加阶跃信号看输出过冲和振铃在反相放大接法下看她是否能稳定建立。第六步版图后仿真。提取寄生参数后重新跑stb因为版图寄生的Cgd、Cgs会改变极点位置。这一步很重要很多设计在原理图阶段PM完美版图后PM掉10多度就是因为寄生电容改变了节点阻抗分布。我自己踩过的教训某次极为自信地认为原理图阶段PM70度非常稳结果版图后仿真PM掉到了35度原因就是第一级输出节点有个大块布线电容没有预估到。所以我现在做版图lvs、pex之后一定会重新跑一轮stb验证。8. 实操心得总结三个关键习惯最后分享几个我这些年总结下来的习惯也许能帮你在Cadence Virtuoso里少走弯路。第一个习惯是每一版修改都跑stb而不是只跑AC或者瞬态。很多时候改了一个管子尺寸感觉不影响稳定性但实际可能改变了节点阻抗和极点位置。我刚工作头两年经常犯这个毛病后来养成“一次改动、stb必跑”的习惯之后返工率明显降低了。第二个习惯是把PM和GM的仿真结果显示成表格形式而不是只看图。ADE XL的结果表格可以一目了然地对比不同corner、不同负载下的数值发现问题比看图快得多。图留给汇报用表留给自己判断用。第三个习惯是仿真不收敛时先检查工作点不要乱调仿真参数。我在调试一个高速比较器时遇到过仿真严重不收敛一开始怀疑仿真器设置反复调整cmin、gmin等参数都没用后来发现是偏置电路的自启动问题某个管子正常工作点和上电后的状态差的很远。检查DC工作点看每个晶体管的工作区域饱和、线性、截止再决定怎么办比盲调仿真器参数靠谱得多。Cadence Virtuoso的stb分析功能是我用过最顺手的环路稳定性分析工具只要理解了环路增益、相位裕度、增益裕度这些概念再配合正确的probe放置和仿真设置就能在设计阶段把绝大多数的振荡问题消灭在仿真里。真到流片回来才发现振荡那时的痛苦和成本相比多花半天时间跑几组stb和瞬态仿真完全不是一个量级。
返回列表