
1. 先搞清楚一件事你测的“相位裕度”是开环的还是环路的每次在 Virtuoso 里做完 AC 仿真看到一条漂亮的增益曲线很多人第一反应就是拖出两个Marker去看低频增益和 -3dB 带宽然后看一眼相位曲线在增益交叉点附近的位置就敢在报告里写“相位裕度约 XX 度”。我见过太多这样翻车的案例了尤其是刚接触模拟IC设计的学生以及从系统级设计转过来做电路的工程师。放大器在开环仿真里显示 PM 60°接成闭环之后却振荡或者瞬态响应在过冲里疯狂折腾最后查出来是仿真配置本身就没测到真正决定稳定性的那一路信号。1.1 为什么相位裕度是稳定性的“命门”先回到最朴素的反馈理论。任何负反馈系统都有一个环路增益 T(s)稳定性的充要条件是当 |T(jω)| 1 时相位 φ(T(jω)) 不能达到 -180°。相位裕度就是 180° φ(T(jω_cross))其中 ω_cross 是增益为 0dB 的交点频率。如果 PM 小于 0°系统理论上必然振荡PM 在 0°~45° 之间系统虽然不振荡但阶跃响应会有严重的振铃和过冲PM 通常设计在 60°~70° 附近这时响应平坦超调量适中。这个道理谁都知道但问题出在 Virtuoso 仿真的“环路”到底怎么取。开环放大器仿真时我们通常只测 A(s) Vout/Vin这是从输入端到输出端的开环增益。可真正决定稳定性的环路是从输出端经过反馈网络回到输入端的完整回路。如果反馈系数 β 不是简单的单位负反馈那么真正要看的是 T(s) A(s)β(s)频率特性完全不一样。单位增益缓冲器接法下 β1开环增益曲线还能凑合代表环路但只要反馈网络用了电阻分压、电容反馈或者输出级带了重负载只看开环 A(s) 的相位曲线测出来的 PM 就全是虚的。1.2 开环仿真和闭环稳定性的关系别把“开环相位”硬套到闭环头上我经常跟同事举一个例子开环增益曲线里相位在 0dB 处是 -120°看着 PM60° 好像没问题可一旦接到实际反馈电路里反馈系数本身是频率相关的比如补偿网络引入了额外的零点或极点那整个 T(s) 的相位特性就可能比开环 A(s) 差几十度。这种情况下你在开环仿真里读出来的 PM 根本不能代表闭环稳定性。所以标题里那个问题“你的放大器真的稳定吗”本质上问的不是“开环仿真曲线好不好看”而是“接成实际反馈形式之后环路增益的相位裕度还剩多少”。这也是这篇文章一开始就要说透的点在 Virtuoso 里做交流仿真评估稳定性第一步是明确你要测的是 A(s)、A(s)β(s) 还是闭环响应不同的量对应完全不同的仿真搭建方式。2. Virtuoso AC仿真从搭建到出图的完整配置我用的是 Cadence Virtuoso IC6.1.8后来也切过 IC23.1AC 仿真的基本逻辑没变。下面这套流程适用于 ADE L、ADE XL 和 ADE Explorer只是菜单位置略有差异你可以对照着找。2.1 AC激励源怎么加才不失真很多人直接在输入端的理想电压源属性里填 “AC magnitude 1V”然后就开始跑仿真这是常规操作没错但至少有三个细节值得注意。第一AC 幅度填多少合适。填 1V 纯粹是为了让 AC 分析的结果数值直接对应增益并没有物理意义因为 AC 仿真是小信号线性分析幅度取多大都不影响线性化结果。但如果你同时在做噪声或者谐波相关的设置1V 的 AC 幅度可能让某些子电路里的非线性受控源出现收敛问题。我一般习惯填 1V偶尔遇到收敛变差就试着降到 0.5V 或 0.1V结果一样但收敛好很多。第二输入 DC 电平必须符合电路正常工作状态。AC 仿真本质是“在 DC 工作点附近求小信号响应”所以 DC 电平的选取直接决定管子工作在饱和区、线性区还是截止区。比如共源放大器DC 输入电平决定静态电流如果 DC 电平设错PMOS/NMOS 可能跑到线性区AC 增益曲线会非常难看但那不是电路本身的问题纯粹是工作点不对。建议跑 AC 之前先用 DC 工作点仿真看一遍所有关键管的 Vdsat 和 Vgs确认处在饱和区。第三电源和偏置的 AC 接地要干净。如果电源或偏置网络里用了非理想的电感、磁珠模型或者太复杂的 RC 滤波器AC 仿真时这些网络也会传递信号导致增益曲线出现奇怪的谐振峰。做纯放大器稳定性评估时我会用理想电压源加理想大电容做去耦。Vdc 源的 “AC magnitude” 默认是 0这样它在小信号下就是交流地不需要额外操作。2.2 仿真参数设置的高频陷阱AC 仿真扫频范围的选择比大多数人想象的重要得多。如果你只扫到 100MHz可能永远看不到第二极点带来的相位崩塌如果你扫到 100GHz虽然结果没坏处但每十倍频程的仿真点如果太少0dB 交点附近的相位读出来可能误差很大。我常用的做法是扫频范围从 1Hz 到至少 10 倍 0dB 交点频率。比如设计目标 GBW 50MHz那我通常扫到 1GHz 甚至 3GHz确保能看到主极点、输出极点、第二非主极点以及可能的右半平面零点。如果电路里有高频寄生效应或者片外电感模型扫到 10GHz 也不嫌多。仿真点的数量也很关键。ADE L 里默认的 “Frequency Sweep” 是对数扫描如果只给 100 个点1Hz 到 1GHz 跨了 9 个数量级相位裕度的读数精度约 1.8° 每点运气不好 Marker 落到跳变点上误差能到 5° 以上。我一般设 300~500 点宁可仿真慢一点也不能让数据毛刺掩盖真实曲线。如果你用的是 ADE XL 批量仿真空洞也记得在每个 corner 里统一设好点数。这里还有一个隐蔽的坑在某些工艺角SS、FF下管子的 gm 和输出阻抗变化剧烈0dB 交点频率可能偏移好几倍。如果你只按典型的 TT 角去定扫频范围跑到 SS 角时可能看不到完整的增益下降到 0dB 的过程。所以我的习惯是先用 1Hz~100GHz 跑一遍某个快速 corner 的粗扫确认 0dB 交点的大致范围再在正式的批处理仿真里把扫频上限设定为“10×交点频率”这样既保证精度又不浪费仿真时间。2.3 输出曲线提取与初判仿真跑完之后在 Virtuoso 的 Direct Plot 或者 Calculator 里提取 Vout 的幅值和相位。我通常直接 Plot 幅频曲线dB20和相频曲线phase然后用 Marker 读出幅值过 0dB 的频率点。接下来关键一步是在相频曲线上找到对应频率点的相位值PM 180° phase(ω_cross)。Virtuoso 里有一个比较省事的函数在 Calculator 里用 phaseMargin() 这个函数它能直接算出 PM但你必须先确认计算的信号对象是“开环增益”而不是“输出信号”。如果你是在做开环 A(s) 仿真而且打算把 A(s) 当成 T(s) 来估稳定裕度请先在脑子里过一遍反馈网络是纯单位负反馈吗负载有没有包含反馈网络的分压效应如果没有老老实实去搭环路增益仿真而不是在图里硬读数。这个道理后面第三节展开讲。用 Marker 读相位的时候还有一个显示层面的问题Virtuoso 的相位曲线默认范围是 -180°~180°如果真实相位在 -360° 附近曲线会有一个 -180° 到 180° 的跳变看起来像相位剧烈翻转。这时候不是电路有问题是显示范围惹的祸。你可以在曲线的 Properties 里设置 Y 轴范围或者在 Calculator 里对相位做 unwrap把 -270°、-360° 的连续相位展开出来。具体操作Calculator 里选择 phase() 函数后在函数输入框里填 unwrap()或者直接用 phaseDegUnwrapped 函数。这样你看到的相位曲线才是连续下降的不会出现莫名其妙的“相位跳变”。3. 相位裕度的读法与三大测量套路3.1 套路一直接开环波特图读数只适用于单位负反馈最省事的方案是给放大器接成单位增益缓冲器结构反相输入直接短接到输出同相输入给 AC 信号。这样开环 A(s) 就等于环路 T(s)直接在 Virtuoso 里输出开环增益和相位再用 Marker 读 0dB 交点频率和相位就能得到 PM。这个方法的好处是直观快速特别适合在最开始做设计时快速验证主极点补偿的效果。但这个方法有两个致命限制。第一如果放大器设计是要接成同相放大或反相放大反馈网络的负载效应会改变环路增益单位增益接法测出来的 PM 会比你实际应用时看起来“更稳”或“更不稳”取决于反馈电阻的大小。第二如果你的反馈网络本身是频率相关的比如有前馈电容单位增益接法完全无法反映这种影响。所以这只能算“估算”不能算“验收”。单位增益接法下还有一个容易犯的错误输出负载是什么如果你在实际电路里要给放大器加 10pF 的负载电容那么仿真的时候也要在输出节点加同样的电容否则测出来的极点位置完全是错的。我见过有人用开环空载仿真出来的 PM 70°加上 20pF 后实际只有 20°流片后片上振荡最后查出来就是负载电容漏加。3.2 套路二STB环路增益仿真的正确玩法Cadence Virtuoso 里的 STBStabilitypsp或spectre下的stb分析是专门用来测环路增益的。它通过在电路环路的某个位置插入一个“探针”元件stb probe通常用 iprobe 或 stbprobe算出环路从探针处断开后信号绕一圈回来的增益和相位。这个结果比开环 A(s) 更接近真实因为它天然包含了反馈网络的负载效应和频率特性。STB 探针的放置位置直接决定仿真的准确性。原则是找一条信号在闭环路径上单向流动的边优先放在高阻抗节点附近比如运放输出到反馈电阻之间的连接线上。为什么优先高阻抗节点STB 分析在探针处会给信号源一个确定性阻抗如果探针放在低阻抗支路它会改变电路的工作点或传递函数结果就不准了。实际经验是把探针放在运算放大器输出节点和反馈网络之间通常能得到比较稳的结果。如果反馈网络里有电容探针位置还要更讲究一点我放在反馈电容的直接串联路径之外避免探针串联模型引入额外零点。STB 仿真设置里还有两个重要选项一个是 “Loop Gain Probe” 的插入方式比如直接用 analogLib 里的 iprobe 元件另一个是 “Return Ratio” 的等效模型。Virtuoso 的 STB 分析窗口里有个选项叫 “stbType”默认是 loopgain它计算的是插入探针后的环路增益另一个选项叫 return ratio它基于电压注入或电流注入模型。大多数情况下用默认 loopgain 就行但如果遇到不稳定边沿的微弱环路我会切到 return ratio 对比一下。如果两者结果差很多说明探针位置选得不好或者电路里存在多环路反馈需要重新审视结构。用 STB 仿真结果去读 PM比直接开环 A(s) 要可靠得多。但要注意一点STB 的输出变量往往是两条曲线一条是环路增益的幅值一条是环路增益的相位。Virtuoso 的 ADE 里有时会自动生成 phaseMargin 结果但如果没有你还是用 Marker 去读先在环路增益幅值曲线找 0dB 点再在相位曲线上找该频率对应的相位PM 180° Phase。3.3 套路三闭环响应的间接验证法即使 STB 仿真结果很好我还是建议用瞬态Transient仿真做一次交叉验证因为交流仿真是个线性小信号分析它无法完全反映大信号下的稳定性问题比如压摆率受限导致的非线性振荡、环路在大摆幅下暴露出的某些极点漂移。最经典的测试是给闭环放大器输入一个阶跃信号观察输出信号有没有振铃如果阶跃响应有过冲和衰减振荡振荡频率接近 0dB 交点频率说明稳定裕度不足如果输出单调上升没有振荡说明 PM 至少是足够的。这个交叉验证特别适合发现“交流仿真看了稳实际瞬态就崩”的情况。比如有些轨到轨输入级在不同共模电压下切换时跨导和极点位置会突变小信号交流仿真在某一固定共模点显示 PM70°但瞬态响应跨越输入范围时某个中间共模点可能只有 10°于是出现奇怪的“半周期振荡”。这种问题仅靠 AC 仿真是很难完整暴露的瞬态验证必不可少。4. 实测案例一个两级放大器的稳定性评估全流程这部分我用最近一个完整案例来说明怎么把所有步骤组合起来。电路是一款典型的双端输入单端输出两级运算放大器第一级为差动放大器PMOS 输入管第二级为共源级输出输出级后挂了一个 5pF 负载电容反馈网络是纯电阻 10kΩ/10kΩ也就是单位增益缓冲器接法。目标 GBW 20MHzPM ≥ 60°增益 ≥ 90dB。4.1 电路结构与初步仿真结果原理图搭在 Virtuoso 里输入对管采用 PMOS电流镜负载采用 NMOS 差分输出转单端第二级 NMOS 共源极输出节点带 5pF 电容补偿电容采用米勒电容 Cc 接在第一级高阻输出和第二级输出之间Cc1.2pF同时串一个调零电阻 Rz800Ω。这个结构非常常见也是很多教材里的经典案例。先跑开环 AC 仿真输入 DC 电平扫在共模点 0.9VAC 幅度 1V输出空载接理想电容负载。仿真结果低频增益 96dB主极点约 500HzGBW 约 18MHz相频曲线上 0dB 交点处相位约 -95°读出来 PM 85°。看着非常稳对吧但这里有个陷阱开环仿真没有把反馈电阻网络的负载效应算进去虽然单位增益缓冲器的反馈电阻和输入电阻比可能足够大但实际接法下环路反馈和高阻节点交互仍可能改变相位边界。为了确认我用 STB 仿真重新测了闭环构型下的环路增益。探针插在运放输出节点与反馈电阻网络之间仿真得到的环路增益低频约 92dB0dB 交点约 17MHz相位约 -138°PM ≈ 42°。发现问题了开环测出 85°STB 只有 42°差距来自反馈网络对输出节点的额外负载和相位滞后。如果直接用单位增益接法的开环结果会高估稳定性接近一倍。这就是为什么要用 STB 而不能只信开环。4.2 补偿参数修正前后的相位裕度对比既然 STB 测出 PM 偏低下一步就是调整补偿网络。我先把调零电阻 Rz 改到 700Ω期望把右半平面零点往左半平面推改善相位。重新跑 STBPM 提升到约 50°。还不够我又把 Cc 从 1.2pF 加到 1.8pF牺牲一点 GBW 降到了 13MHz但 PM 提升到了 64°满足设计指标。增益不变主极点前移GBW 降低这是代价。这个修正过程里有个细节值得记录加大 Cc 之后第一级输出节点和第二级输出节点形成的极点分裂更明显0dB 交点频率降低第二非主极点所在的频率离 0dB 点变远了所以 PM 显著增加。为什么 PM 增加了因为输出端主极点和第一级高阻极点分裂得更开相当于把第二极点“推到”了更远的高频处而 0dB 点反而降低了两者的频率余量变大。这种补偿思路在论文和教科书里讲了无数遍但只有亲手在 Virtuoso 里调一次才能直观感受补偿电容和响应速度之间的取舍。修正后我用 STB 方案测出的全环路结果GBW 13.2MHzPM 64°增益裕度 14dB低频增益 92dB。又换到单位增益缓冲器接法下验算PM 在 66° 左右两者基本一致说明测量方法本身没有系统性偏差。4.3 用瞬态仿真交叉验证交流指标先放一边我还是要用瞬态打一下真章。把单位增益缓冲器接法搭建好输入接一个 20mV 的阶跃信号保持在小信号范围内避免压摆率限制干扰跑 5μs 瞬态。观察输出响应上升沿有过冲但很快收敛过冲量不到 10%没有持续振铃。再把阶跃幅度加到 0.5V大信号下过冲稍大约 15%但相位裕度并没有崩溃输出波形依然稳定。这就交叉验证了 AC 和 STB 的结果这个放大器在目标负载和反馈条件下稳定性是够的。有一回我在另一个设计里遇到过典型翻车STB 仿真 PM50°看似稳定但瞬态输入 0.8V 大阶跃时输出直接出现自激振荡频率约 40MHz。查下来是补偿电阻 Rz 在内部单边设计时用了 poly 电阻模型在大信号下表现出明显非线性导致零点随输出摆幅移动。这种问题在纯 AC 小信号仿真里几乎是隐形的。所以我的建议是无论 AC 多漂亮只要是反馈系统就一定要做一次大信号的瞬态阶跃甚至做电源上电斜坡观察输出有没有异常振荡。5. 常见问题与排查技巧实录下面是我这些年用 Virtuoso 做交流仿真时踩过的坑和对应的排查思路整理成一个快速查阅的表格顺便把一些独家避坑经验写出来。现象可能原因排查方法增益曲线出现大量毛刺、震荡仿真扫描点太少或收敛精度不够增加扫描点数把 reltol、iabstol 调到 1e-6 级别换 gear 积分法相位曲线在 -180°↔180° 之间跳变显示方式问题实际相位在 -270° 附近用 unwrap 展开相位或在 Y 轴属性里改范围0dB 交点处相位读不出来增益曲线在 0dB 附近不单调检查扫描范围是否太窄增加低频段或高频段点数STB 结果和开环 AC 结果差异巨大探针位置不对或反馈网络负载效应大检查探针是否插在高阻节点换等比例探针模型对比 return ratio瞬态仿真自激但 AC 显示 PM 正常大信号效应导致极点漂移或模型非线性用大阶跃、电源斜坡做瞬态验证扫输入共模和工作温度不同 corner 下 PM 差别超过 30°不同工艺角下晶体管的 fT 与输出阻抗原变化大在每个 corner 单独设定扫频范围别共用频谱点5.1 AC仿真结果为什么“毛刺”很多很多时候不是电路问题而是仿真器数值问题。比如有的电路里含有非常小的电容fF 量级和极大的电阻MΩ 量级形成时间常数极大的超级低频极点同时又有高频极点整个系统动态范围非常大。默认误差容限在这么宽的频带下可能不够就会造成增益曲线在高频段抖动。处理方法把 ADE 仿真设置里的 reltol 改小到 1e-6iabstol 改到 1e-15增加扫描点数到 1000 点通常能大幅改善。另外积分方法也值得注意默认的梯形积分在仿真某种高 Q 电路时会让曲线产生数值振荡切换到 gear2only或者叫二阶吉尔积分法会稳定很多。5.2 相位曲线在 0dB 处不断跳变这个是在 Virtuoso 里最容易让人误判的一个坑。相位超出 ±180° 范围后波形工具会自动 wrapping导致明明是一条 -300° 的平滑曲线显示出来却像在 -180° 和 180° 之间来回跳。如果此时恰好在 0dB 交点附近读相位读取结果完全不可信。解决办法不是改电路的而是在 Calculator 里用 unwrap 函数或者直接查看 phaseDegUnwrapped把相位展开来看。我见过有人因为这个显示问题断言自己的放大器在某个频点相位突变 360° 正反馈振荡差点改坏整个补偿电路其实就是显示范围的事。5.3 STB 仿真提示环路不稳定但开环明明正常这种情况通常发生在多环反馈结构里比如带内部前馈旁路的放大器或者输出级有额外局部反馈。开环 AC 仿真只看到主前向通道而 STB 探针抓到了多个环路叠加后的等效环路两者结果不同是合理的。遇到这种情况我的建议是不要急着改进补偿先把电路内部有没有局部环路的几只晶体管一一排查清楚。比较实用的办法是在 STB 分析里把探针放在不同位置分别跑如果不同位置得到的环路增益差异很大说明电路里存在不止一条反馈路径。这时候要重新审视电路结构而不是盲目调补偿电容。我还遇到过一种情况STB 在某个工艺角下显示“环路增益没有 0dB 交点”看起来像是无穷增益。实际查下来是低频增益高到离谱扫描范围从 1Hz 开始但低频端数据点不够相位曲线还没进入正确的下降区域。把扫描起点降到 0.1Hz 甚至 0.01Hz 之后一切正常。6. 补充几个能让你少加班的经验交流仿真这项技能本质上是个熟能生巧的过程。最后再分享几个从项目里总结出来的经验算不上什么高深理论但在实际工作流里非常管用。6.1 PVT 仿真别只盯着 TT先扫最坏组合温度、工艺角、电源电压这三个维度组合起来数量很多但稳定性仿真不需要全扫。经验法则先跑 SS 角 高温 低电压再看 FF 角 低温 高电压。SS 角下晶体管增益最高但速度最慢环路通常容易在低频段出问题FF 角下晶体管最快极点频率最高0dB 交点频率上移相位裕度最容易崩。我习惯在这两个极端组合下各自跑一次 STB如果 PM 都大于 45°再补跑 TT 做一个参考基线。如果极端组合都不干净中间组合基本也好不了。6.2 相位裕度之外还要看增益裕度和过冲很多人只看 PM忽略了增益裕度。标准上增益裕度至少要大于 8~10dB否则电路的增益在某个频点附近随参数扰动可能突然变成正反馈即使 PM 数值合格也不够稳。读取方法和 PM 类似增益曲线在相位达到 -180° 的频率处看增益比 0dB 低多少那个差值就是增益裕度。Virtuoso 的 STB 结果里可以直接看这两个指标如果软件版本比较老就自己拉 Marker。另外一个间接指标是在瞬态仿真里测闭环的小信号过冲。PM 60° 时阶跃响应过冲大约 8%~10%PM 45° 时过冲约 25% 左右而且会有明显的衰减振荡PM 30° 时过冲能到 40% 以上。用瞬态过冲去反推 PM虽然不是精确测量但能帮你判断是否有严重设计问题。6.3 给初学者的调试顺序建议如果你第一次用 Virtuoso 测放大器稳定性建议按下面的顺序走能少走很多弯路搭好原理图和测试台先跑 DC 工作点确认所有管子饱和。跑开环 AC粗看增益曲线和主极点位置确认电路基本功能正常。按实际反馈结构搭好闭环测试台在输出与反馈网络之间插入 STB 探针跑 STB 环路增益。用 unwrap 或 phaseDegUnwrapped 查看相位曲线读 PM 和 GM。补一个瞬态阶跃大信号小信号都测一下交叉验证。在 PVT 极端组合下重复 3 和 5。这套流程看起来繁琐但实际执行下来每一步都能避免后面流片回来才发现的不稳定灾难。我第一次独立负责一个误差放大器项目时就是因为偷懒只看了开环 AC设置了 PM70° 就送去流片结果系统上电振荡排查了整整两周最后发现是反馈网络分压电阻直接跨接到输出节点和内部补偿网络形成了额外极点。从那以后我再也不敢脱离闭环构型谈相位裕度。我目前在 Virtuoso 里做稳定性评估的标准动作就是STB 为主开环 AC 为辅瞬态阶跃做兜底三个结果对不上就绝不往下走。这套组合拳打下来绝大多数稳定性坑都能在 tapeout 之前暴露出来。你在实际项目里遇到什么奇怪的交流仿真问题也欢迎按照上面的表格先自查一遍大概率能省掉半天以上的折腾时间。