做模拟IC设计,Cadence Virtuoso几乎是绕不开的工具。放大器设计里,AC分析和STB分析又是天天要碰的两个按钮——说实话,我见过不少工程师把AC当STB用,或者搞不清楚为什么AC扫出来的相位裕度跟闭环稳定性对不上。今天拿一个全差分反相放大器当例子,把这两个仿真的一次完整操作、结果解读和背后的原理差异一次讲透。
全差分反相放大器这个电路很有代表性:它同时包含差模反馈路径、共模反馈环路,还自带“反相”这个容易搞错信号方向的坑。你把这一个电路吃透了,Cadence里大多数运放类仿真套路都能举一反三。这篇内容适合正在学模拟IC设计的学生、刚接触Virtuoso的工程师,以及写报告时被AC/STB结果折磨的人。
1. 为什么用全差分反相放大器来讲stb和ac
1.1 电路结构拆解
先把这个电路说清楚。这里说的全差分反相放大器,不是运放内部只有一个反相端的那种结构,而是标准的全差分运算放大器配上外部电阻反馈网络,接成反相闭环形式。
运放内部是经典的五管结构:NMOS输入差分对(M1、M2)、PMOS电流镜负载(M3、M4)、尾电流源(M5)。从差模信号的角度看,VINP经过M1放大后在VOUTN得到反相输出,VINN经过M2放大后在VOUTP得到反相输出,所以这是一个天然的反相放大器核心。
外部反馈用两个输入电阻Rs和两个反馈电阻Rf连接,形成闭环。VINP信号经过Rs接到M2的栅极,VOUTP经过Rf也接到M2的栅极,在这个求和节点完成反馈;M1侧对称接法类似。闭环增益表达式为:
[ A_{CL} = -\frac{R_f}{R_s} ]
这里负号就是反相放大器的由来。取Rf=10kΩ、Rs=2kΩ时,闭环增益就是-5倍,约14dB。这个电路最大的特点是:反馈网络本身在差模方向形成负反馈,同时由于是全差分,对称的P、N两条支路各有一条反馈路径。如果你想看环路稳定性,就不得不同时处理两个对称的反馈支路——这对仿真方法提出了要求。
1.2 stb与ac两种仿真的定位差异
这是全篇的核心,先把概念捋顺。
AC仿真的本质是小信号线性频率响应分析。它在直流工作点的基础上,对电路施加一个特定频率的小正弦信号,扫描频率后得到从激励点到测量点的传输函数。注意,AC测的是“从某点到某点”的传输函数。如果你把激励加在闭环放大器的输入端,测输出端,那测到的是闭环响应。想用AC测环路增益,就必须先手动断开反馈环路,在断点的一侧加激励,另一侧测响应。
问题就出在这个“断开”上。断开点两侧的阻抗是相互影响的:断开后你可能会把反馈网络的负载效应丢掉,也可能把下一级的输入阻抗和这一级的输出阻抗的相互关系破坏掉。结果就是,AC算出的环路增益和相位裕度,跟实际闭环工作时的真实环路增益对不上,偏差在复杂反馈网络中可能相当可观。
STB仿真的定位完全不同。STB(Stability Analysis)基于Middlebrook的环路增益测量理论,它通过一个插入在环路中的探针器件(iprobe)注入小信号扰动,同时测量环路对这个扰动的响应,在不破坏闭环结构的前提下直接计算出环路增益、相位裕度和增益裕度。它对探针插入位置不敏感,也不要求你断开反馈网络,更重要的是它能同时处理多个反馈环路。
说得直白一点:AC像是你要测电路板上某根走线的电流,必须把走线剪断串入电流表;STB则是用了钳形电流表,不用剪线,直接夹上去就能读。全差分放大器这种存在两条对称差模反馈路径和共模反馈环路的电路,正是STB大展拳脚的地方。
1.3 为什么全差分比单端更能体现stb价值
单端反相放大器用AC断开环路测环路增益,虽然有一定误差,但结构简单,断点就一个,很多老工程师凭经验也能调对。换成全差分之后,情况立刻变复杂:P侧和N侧各有一条从输出到反相输入的反馈支路,断点增多、对称性容易破坏,断开一侧而另一侧保持闭环,仿真结果可能完全偏离真实。
更麻烦的是全差分运放几乎没有例外都需要**共模反馈电路(CMFB)**来稳定输出共模工作点。这个CMFB环路本身也是一个反馈环路,它与差模环路共存。如果你用AC去断环,到底断哪个?断差模还是断共模?断完之后工作点可能都建立不起来了。
STB在Cadence里可以同时指定多个iprobe,把差模两条路径的probe都填进去,Spectre会自动合成环路增益,给出总的稳定性结论。这才是全差分电路的标准仿真姿势。
2. 仿真平台搭建与初始配置
2.1 原理图设计:从器件到反馈网络
我用的是Cadence Virtuoso IC6.1.8环境,PDK用的常见CMOS工艺库。如果你用其他版本,菜单名称可能有细微差异,但整体流程一致。
在Schematic Editor中从analogLib里调出以下器件:
- nmos4:输入差分对M1、M2,尾电流管M5
- pmos4:电流镜负载M3、M4
- iprobe:环路探针,后面STB仿真要用
- res:外部反馈电阻Rf、输入电阻Rs
- vdc:电源、偏置、共模参考电压
- vac:AC小信号激励源
器件尺寸参考值我用的是:输入对管W/L=20μ/0.5μ,PMOS负载管W/L=40μ/0.5μ,尾电流管W/L=20μ/1μ。电源电压1.8V,尾电流设置为100μA,每边支路50μA。根据公式gm=2Id/Vov估算,过驱动电压在200mV左右时,每个输入管的gm大约0.5mS。输出阻抗取决于ro和负载的并联,粗略估计在几十kΩ量级,所以运放开环增益大概在30~40dB之间。这个量级做演示足够,而且容易看出反馈前后的区别。
画原理图时注意管子的衬底连接:NMOS的衬底统一接地,PMOS衬底接VDD。电流镜负载的栅极相连处,要把M3和M4的漏极连接关系画对,否则电流镜比例不对,差分输出会偏到一边去。
外部反馈网络连接时,我有一个习惯:先在图纸上标出“求和节点”,也就是Rs、Rf和运放输入栅极三者的交汇点,再连线。全差分结构里有两个求和节点,P侧一个、N侧一个,连反了就成了正反馈,仿真出来的增益会诡异到让你怀疑人生。
2.2 激励源与CMFB:让仿真先跑起来
建立直流工作点是所有仿真成功的前提。全差分运放如果没有共模反馈,输出共模电压是不确定的,AC和STB都没法进行。这里做两个选择:
一是用理想CMFB模型。在analogLib中调一个vcvs(压控电压源),增益设为100倍,正输入端接共模参考电压(比如900mV),负输入端接输出共模检测点(两个大电阻Rcm从VOUTP和VOUTN接到检测点),输出端接到尾电流源M5的栅极。这个模型能体现CMFB的基本控制思想,但它毕竟是理想模型,掩盖了真实CMFB电路的带宽和极点,只适合学习演示。
二是用大电阻强制共模。在VOUTP和VOUTN各接一个1MΩ电阻到一个固定共模电压源上。这个方法最简单,缺点是会在输出端引入额外负载,对低频差模增益影响不大,但高频行为会有点失真。
实际工程里必须用真实CMFB电路,而且在流片前要单独对CMFB环路跑STB。我在做这个演示时,为了把焦点集中在AC与STB方法对比上,用了大电阻强制共模的方式,同时会在文章后面指出这种方法在精确设计时是不够的。
输入激励源的设置也要注意。设置一个直流共模偏置在反相输入端的电阻之前,给定共模电平1V。AC信号源用vac,对于闭环AC仿真,把vac的AC magnitude设为1V,这样输出的差分电压值直接等于闭环增益数值,不用再换算。对于开环AC仿真,则把AC magnitude设为1mV,防止输出超出线性范围。
2.3 ADE分析设置前的自检清单
很多仿真失败不是因为电路设计错误,而是初始设置不完整。我在跑任何仿真前都会过一遍这个清单:
- 电源和地是否都连到了VDD/VSS符号上
- 所有晶体管的model名是否填写正确,长度宽度是否在PDK允许范围内
- 所有独立电压源是否设置了DC值
- AC分析的信号源是否设置了AC magnitude(这个特别容易漏,漏了扫出来的结果全为0)
- 是否有悬空节点(Cadence的CIM标记会提示,但还是要肉眼检查)
- 全差分输出是否成对对称
不夸张地说,AC仿真出来是一条0dB平坦直线,十有八九就是AC激励幅度没设。别问我怎么知道的。
3. AC仿真实操:闭环增益与带宽怎么看
3.1 ADE L中一步步完成AC仿真
启动ADE L(如果你用ADE XL也行,流程类似),打开原理图所在的cellview后,按以下步骤操作:
第一步,把仿真器设为spectre。在ADE L的Setup->Simulator/Directory/Host里选择spectre,目录设置到你有权限的路径。
第二步,选择分析类型。点击Analyses->Choose,在Analysis Type里选ac。默认情况下的扫描类型是Logarithmic,从1Hz扫到100MHz,每10倍频程10个点。这些默认参数对放大器演示够用,但我一般会把点数增加到20,波形更平滑。
第三步,设置输出。在ADE L的Outputs->To Be Plotted里先选择要观察的节点。全差分放大器的输出是差分信号,直接看单端波形会少算6dB增益。用计算器里的diff函数:
diff(VS("/VOUTP") VS("/VOUTN"))这样读到的才是真正的差分输出增益。同理输入也可以用diff,但如果AC激励只加在单侧或按反相方式加在两侧,要看你对“差分输入”的定义。标准做法是:VINP接vac正端,VINN接vac负端(也就是ac magnitude为1V,相位0和180),然后输入也读差分。
第四步,跑仿真前先检查DC工作点。点击DC Operating Point,或者直接Run后看输出打印的直流信息。确认所有MOS管工作在饱和区:Vds>Vov,Vgs>Vth。如果发现某管子在线性区,回去调共模电平或偏置电流。
3.2 AC结果解读:增益、带宽和稳定性线索
仿真跑完后,直接看VOUTP-VOUTN的幅频和相频曲线。
正常的闭环响应应该是这样的:低频段增益稳定在14dB左右(对应5倍关系),然后在高频某一处开始滚降,最终以-20dB/dec的斜率下降。3dB带宽就是增益从低频值下降3dB对应的频率点,用Calculator里的bandwidth函数,或者直接在波形窗口右键Mark->Marker->Peak找峰值,再往前挪到-3dB位置。
如果闭环AC响应在滚降之前出现明显的上冲尖峰,这不是好事。这个尖峰是环路相位裕度不足的典型信号,尖峰越高,相位裕度越小。理论上,相位裕度60度时闭环响应没有尖峰,大约在相位裕度45度时出现1dB左右的尖峰,再小就会出现2dB以上的明显peaking。你可以通过这个尖峰反向推断稳定性,但它毕竟只是个间接信号。
用开环AC也能测相位裕度:去掉反馈电阻,在运放输入端加1mV小信号,测出开环增益和相位曲线,再看0dB穿越点处的相位。问题是,断开反馈后,你测量的环路与真实工作时的环路并不相同,反馈网络的负载效应被忽略了。在低频时,MOS管输入阻抗高,误差不大;在高频时,反馈网络和输入电容的相互作用会影响相位,误差就会放大。这也就是为什么,开环AC测出的相位裕度只能作为粗略估计,不能当作流片前的稳定性结论。
3.3 AC仿真替代不了STB的核心原因
还是回到那个比喻。全差分反馈电路里有多个环路叠加,AC断开反馈后,你会改变环路的负载关系。有些环路(如实测时没注意的CMFB环路)依然存在,它们的影响依然存在于结果中;而真正想看的差模环路,却因为断开操作而失真。
具体到本例:如果你把反馈电阻Rf断开,有了前面用大电阻固定共模电平还好,工作点还能保住。但如果你用的是真实CMFB,断环会引起共模环路震荡,DC工作点直接不收敛,AC仿真根本跑不出来。即便跑出来了,你看到的“开环电压增益”也是共模和差模混在一起的结果,没法用来判断闭环稳定性。
所以结论很简单:AC适合看闭环增益、带宽和传输函数;环路稳定性判定,请无条件用STB。这是Cadence里最标准的使用方式,也是业界认可的做法。
4. STB仿真实操:相位裕度与环路稳定性
4.1 iprobe插入的位置与方向
STB仿真最关键的步骤是插iprobe。iprobe在analogLib里可以直接搜索到,符号看起来像一个带箭头的四端器件,实际上可以串接在反馈支路中。
插入位置选择有一个原则:放在你要分析的反馈环路的信号通路上。本例中,反馈信号从输出端经过Rf流向运放输入端求和节点,所以iprobe最适合串在Rf和求和节点之间,也就是反馈电阻与输入管栅极相连的走线上。
连接时务必注意iprobe的方向。Cadence中stb分析要求iprobe的电流方向定义清晰,通常正端指向负端的方向就是信号流动方向。反馈信号是从输出端流向输入端,所以iprobe正端应该靠近Rf一侧,负端靠近栅极一侧。
全差分设计需要插两个iprobe:一个放在VOUTP->Rf->VINN支路,另一个放在VOUTN->Rf->VINP支路。建议把两个iprobe命名清晰,比如iprobe_p和iprobe_n,这样在STB设置时不会搞混。
4.2 STB参数设置与运行
在ADE L中打开Analyses->Choose,选择stb。关键设置项如下:
- Probe instance:填写你放置的iprobe名。多个probe用空格分隔,例如“iprobe_p iprobe_n”
- Start frequency:1Hz
- Stop frequency:100MHz
- Sweep type:Logarithmic,点数20
有一些版本的Cadence会让你填“Reference Node”或者要求保存所有节点(save all),为保证STB计算的准确性,推荐勾选保存所有节点。否则结果显示可能因内部节点信息不足而无法计算相位裕度。
设置好后直接Run。仿真完成后,Results->Direct Plot->Main Form里选stb,然后点击环路增益波形。Spectre会把环路增益的幅频、相频曲线画出来,同时在结果日志中给出相位裕度(Phase Margin)、增益裕度(Gain Margin)和单位增益频率(0dB crossing)。
阅读STB结果的第一个经验:正常环路增益的相位曲线应该从0°附近开始(或接近0°),然后随频率下降穿越-180°。如果你看到的相位曲线从+180°开跑,或者环路增益低频段几乎是0dB以下平坦的,首先要怀疑iprobe方向反了。把iprobe方向调换一下再跑一次,结果就会正常。
4.3 STB结果解读与补偿调整
假设我们跑出来的STB结果如下:
- 环路增益低频段约为30dB
- 0dB交叉频率(单位增益频率)约为12MHz
- 交叉点处相位裕度为58°
- 相位穿越-180°时,增益裕度约10dB
这个结果说明系统是稳定的,有58°的相位裕度,闭环响应接近临界阻尼,阶跃响应超调量大约在10%以内,可以接受。如果你想要更好的瞬态响应,可以继续补偿,把PM提到65°以上。
如果相位裕度只有十几度甚至几度,那闭环系统很可能已经处于震荡边缘。解决思路基本上围绕给环路增加主极点或零点补偿:
- 增大输出端负载电容:把主极点往低频推,让增益曲线在穿越0dB之前以-20dB/dec滚降,避免第二个极点影响穿越点的相位。
- 加入零点补偿:最常见的是在输出电阻上串一个小电容形成零极点对,或者用密勒补偿电容跨接在增益级输入输出之间。
- 减小第二极点的影响:在电流镜负载管的源极串联小电阻,抵消镜像极点。
补偿手段调整完后重新跑STB,看相位裕度是否提升。这里我在实操中养成的习惯是:同时对照闭环AC响应和STB结果。正常情况是STB的PM变大后,闭环AC的尖峰也消失,两个结果互相印证,心里才踏实。如果STB显示PM已经60°,闭环AC还有明显尖峰,那要回到电路里找是不是其他非主环路(比如CMFB环路)在捣乱。
在STB结果窗口还可以查看环路增益的多个极点零点。Cadence的报告里会列出主要极点位置,这对定位哪个极点导致PM不足非常有帮助。我记得有一次放大器PM只有5°,STB报告里清晰看到一个高频极点出现在3倍单位增益频率处,正是电流镜的镜像极点,后来在镜像管源级加电阻补偿后PM直接恢复到60°,这种效率是开环AC给不了的。
5. 常见问题与避坑技巧实录
5.1 工作点异常与仿真不收敛
我见过最多的问题就是STB跑了几秒钟直接报错“Unable to find DC solution”或者“Newton iterations failed”。这种时候先别急着怀疑Cadence坏了,按顺序排查:
| 症状 | 常见原因 | 处理方法 |
|---|---|---|
| DC不收敛 | 反馈连接形成正反馈 | 检查P、N两侧的反馈是否交叉连反 |
| DC不收敛 | CMFB缺失或失效 | 输出共模漂移,加入CMFB或大电阻强制共模 |
| DC不收敛 | 器件不在饱和区 | 查看工作点,调整偏置电压或尺寸 |
| STB结果相位从+180°开始 | iprobe方向反了 | 翻转iprobe方向重新跑 |
| STB提示找不到probe | instance名填写错误 | 确认填的是iprobe的instance名而非model名 |
| AC结果为全0 | 激励源没有设AC magnitude | 在源属性里设置AC magnitude |
| 闭环AC有尖峰但STB正常 | CMFB环路不稳定 | 单独对CMFB环路插入probe跑STB |
除了表格里的问题,还有一个很实用的技巧:在仿真设置里把gmin稍微调大一点(比如从默认的1e-12调到1e-9),很多DC收敛问题能迎刃而解。不过跑后仿或者高精度验证时记得调回默认值,否则漏电会干扰真实结果。
如果电路规模大、反馈环路多,STB要确保探针插入的是“主要信号通路”而不是偏置支路。把iprobe误插到尾电流源的偏置线上,测出来的环路增益会非常小而且相位乱七八糟,跟放大器主环路完全没关系。
5.2 全差分电路里CMFB带来的额外坑
全差分放大器真正的设计难点,往往不是差模回路,而是共模回路。你在做STB时,如果只关心差模稳定而忽略了CMFB环路,很可能差模PM有60°,CMFB环路PM却是负的,整体电路在时域大信号激励下依然会震荡。
检查CMFB环路稳定性的方法和差模环路完全一样:在CMFB误差放大器的输出到被控管栅极的反馈路径上插入iprobe,跑STB,看共模环路的相位裕度。由于CMFB环路经常会有额外的检测电阻和误差放大器寄生电容,极点位置往往比差模主极点更高,所以CMFB环路不稳定是常见事。
另一个坑是CMFB检测电阻Rcm本身给输出节点引入了负载,在STB结果里也会体现。如果你用大电阻强制共模做学习演示,你的STB结果实际上包含了这个额外负载的影响,这可能让你误判实际电路的稳定性。所以演示完了一定要换成真实CMFB再跑一次,以真实电路为准。
5.3 我踩过的一些坑和手工检查方法
最后分享几个纯粹的实操心得。
第一个心得:仿真前先手工算一遍期望值。全差分反相放大器的闭环增益就是-Rf/Rs,这个不依赖运放增益,很好算;环路增益的低频值,理论上等于运放开环增益乘以反馈系数β,其中β≈Rs/(Rs+Rf),本例中β=2/12≈0.167。如果开环增益100倍,环路增益大约17倍,约24.6dB。STB跑出来如果低频环路增益跟这个估算差太远,大概率是连线或者设置出了问题。这个小习惯帮我抓出过两次原理图连接错误。
第二个心得:iprobe放置后,先用DC仿真验证它没有破坏原电路工作点。在跑STB之前,用前面设置好的DC operating point检查一遍,比较插入iprobe前后工作点是否一致。iprobe理想情况下是零压降、无电流损失的,如果工作点变化明显,说明插得不对或者方向影响了信号路径。
第三个心得:AC和STB的扫描频率范围最好保持一致。从1Hz到10倍0dB穿越频率是比较保险的选择。如果只扫到0dB交叉点附近,你看到的相位裕度可能受扫描截止影响看起来比实际偏大或偏小。我一般扫到交叉频率的10倍以上,确保相位曲线完整经过-180°。
第四个心得:善用Cadence自带的stb summary。在Results里直接读Summary就能看到phase margin和gain margin的数值,不用肉眼去读曲线。但注意,spectre对多个probe合成的结果有时候会把对称的两条反馈环路的信息合并,你会发现只有一个loopgain曲线,这是正常的。如果你发现summary里的数字跟曲线对不上,多半是扫描点数太少导致插值误差,把点数增加到50就好。
第五个心得:STB结果异常时,把两个iprobe分开单独跑一次。全差分结构里P侧和N侧理论上对称,两侧的环路增益应该一模一样。如果只有一侧结果异常,另一侧正常,说明那侧电路的反馈网络或信号方向有问题。这个过程用来排查对称性破坏特别有效,比盯着整体合成结果猜半天要快得多。
写在最后
前面说的都是固定流程,最后讲点我的体会。刚开始做全差分放大器时,我也有一阵子只跑AC,看到开环相位裕度60°就以为稳了,结果搭成闭环后阶跃响应振铃明显,折腾半天才发现是反馈网络加载效应被AC忽略,真实相位裕度只有20°。从那以后,我的固定组合拳就是:AC看闭环增益和带宽,STB看环路稳定裕度,阶跃响应当最终验证。这套组合基本覆盖了放大器从指标到稳定性的所有需求。
Cadence里STB和AC是互补工具,不是替代关系。你不需要掌握复杂的Middlebrook数学推导,但一定要知道它们各自测什么、什么时候用哪个、结果怎么互相印证。还有个小建议是,初学阶段多手动算算增益和带宽的估计值,再跟仿真结果对照,这样你才会对软件里的数字保持警惕,而不是盲目相信一条漂亮的曲线。
这个全差分反相放大器例子做完一遍之后,你可以接着把放大器换成套筒式共源共栅结构,或者把反馈网络改成开关电容,STB的设置完全不需要变。方法学会了,换电路只是换个probe位置而已。