ARTICLE DETAIL

资讯详情

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

Cadence Virtuoso差分放大器仿真:DC扫描与AC分析全流程解析

Cadence Virtuoso差分放大器仿真:DC扫描与AC分析全流程解析 Cadence里的差动放大器仿真几乎是每一个做模拟IC的人都要过的一道坎。我记得自己第一次在Virtuoso里搭完电路心里想得很简单无非就是放几个管子、跑个DC、再跑个AC数据出来不就完事了吗。结果一操作才发现光是“为什么DC扫描的结果和书上不一样”“为什么AC增益是负的”“为什么模型库没加载时连仿真都跑不起来”这几个问题就能把人磨掉一个下午。这篇内容就是把那条从DC扫描到AC分析的完整路径重新走一遍把每个关键的设置、每个奇怪的报错、每条曲线的读法都讲清楚。适合刚接触Cadence Virtuoso、正准备做差分对或运算放大器仿真的人也适合那些仿真能跑通但总觉得结果“不太对”的朋友。1. 建好差动放大器仿真项目库配置、模型绑定与输入源结构1.1 工艺库和电路原理图库别混为一谈很多人在打开Cadence Virtuoso之后第一步就卡住了。这里一定要先区分两个概念一个是工艺库PDK一个是原理图库。工艺库提供的是晶体管模型文件、版图规则、参数化单元这些底层资源原理图库则是你在Library Manager里创建的、用来放自己电路的库。两者加载方式完全不同。打开Virtuoso后在Library Manager里新建一个库比如my_amp_lib然后在CIW里打开ADE仿真的模型库设置。对于spectre仿真器常见做法是Setup - Model Libraries然后添加工艺库提供的模型文件。这里有个很典型的坑spectre使用的是.scs格式的工艺文件而HSPICE使用的是.L或.lib格式。你把HSPICE的模型文件挂进spectre里仿真器大概率会报出一堆看不懂的语法错误或者干脆提示unknown model。所以先看清楚你的PDK里哪个目录下放了spectre模型通常是这样的结构pdk_dir/ models/ spectre/ xxx.scs hspice/ xxx.l添加时在Model Libraries窗口里找到xxx.scs然后在Section栏填上工艺角一般是tt比如tt就是典型工艺角。如果漏配这个sectionspectre可能用默认参数仿真结果会和预期差异很大。1.2 器件选型用模拟标准库还是PDK自有器件差动放大器的核心结构就是一个差分输入对加尾电流源再配上有源负载。以常见的全差分或单端输出电路为例M1、M2NMOS差分输入对M3、M4PMOS电流镜负载M5NMOS尾电流源在Virtuoso原理图里你可以直接用analogLib里的nmos4、pmos4符号给它们指定一个Model name例如nch和pch然后通过模型库里的定义去关联。也可以用PDK自带的器件比如nfet、pfet它们通常已经预置了W/L这些尺寸参数和模型名称更不容易出错。我的习惯是如果只是做系统级验证用analogLib的mos4更快仿真库换模型也方便如果后面要接着做版图、LVS甚至寄生抽取那就直接上PDK器件省去后面换库的麻烦。但无论选哪种跑仿真前都要确认一件事原理图的器件模型名和模型文件里的模型名能对得上。很多“仿真器件未定义”的报错本质上都是这个映射关系断了。1.3 输入端的DC电压源结构为什么要把VCM和VID分开教科书里分析差动放大器时通常会写出Vin VCM VID/2 Vin- VCM - VID/2仿真时也应该沿用这个思路而不是随便放两个直流源。我曾经见过有同学把Vin设为0.8VVin-设为0.9V然后扫描其中一个电压源。这么做虽然也能看出来输出变化但本质上扫描的是“共模差模”的混合信号结果很难定位问题。我推荐的做法是在原理图里创建两个参数化的直流电压源正输入端那个源的DC voltage填成VCM VID/2负输入端那个源填成VCM - VID/2然后把VCM、VID、VDD、VB这些都设为设计变量。这样后续DC扫描时可以直接扫VID模拟纯差模变化也可以固定VID0来扫VCM观察输入共模范围逻辑非常清晰。注意在部分老版本的Virtuoso里直接在器件属性框里输入VCMVID/2这种表达式不一定立即生效。稳妥的做法是先定义好design variables再在属性值里引用变量名如果仿真器提示Invalid expression检查一下变量名大小写是否和Design Variables窗口里完全一致。2. DC扫描从传输曲线到工作点检查的完整操作2.1 ADE L里配置DC Sweep的具体参数在ADE L里打开仿真设置Analyses - dc - dc Sweep这时会让你选sweep变量类型。我一般选择Design Variable然后在变量名里填VID。扫描范围根据电路的实际输入线性范围来定。差动放大器的线性输入范围大约在2倍的VOV以内。如果VOV在0.2V左右扫描范围可以设成-0.4V到0.4V如果拿不准先扫个-0.6V到0.6V看看曲线形状再缩小范围。步长的设置也很关键。SWEEP STEP如果设得太大比如50mV那曲线会很粗糙转折点完全看不出来设得太小比如0.1mV仿真时间成倍增加而且大多数情况下没必要。我通常先用2mV到5mV扫一遍确认曲线形态后再在感兴趣的线性区局部加密。保存方面建议先把所有节点电压设为保存状态。在ADE L里Outputs - To Be Plotted - Select On Schematic也可以直接在Results Browser里把dc结果下的所有信号拖出来。这一步看起来不起眼但后面计算工作点、看内部节点电压时如果当时没保存就只能重新跑一遍仿真非常耽误时间。2.2 传输曲线怎么读线性区、转折点与饱和区跑完DC扫描后在波形窗口里画出Vout - Vout-。横轴是输入差分电压VID纵轴是输出差分电压。理想情况下你会看到一条类似S形的曲线中段近似直线斜率就是差模增益当输入差分幅度过大时一边的晶体管完全截止输出不再随输入变化进入饱和转折区曲线水平平台的高度差反映了输出摆幅的上下限这条曲线最实用的一点是拿它直接估计增益。在波形窗口里用Calculator计算(Voutp - Voutm) 在 VID 5m 处的值 减去 (Voutp - Voutm) 在 VID -5m 处的值 除以 10m结果就是传输曲线线性区的斜率也就是差模电压增益。注意这里算出来的是V/V不是dB。比如算出来是80V/V折合成dB就是20 * log10(80) ≈ 38dB很多朋友习惯直接从AC曲线上看增益但其实DC传输曲线才是最先验证电路大信号行为的地方。如果DC扫描得到的曲线斜率明显偏小或者中段根本不是直线那说明工作点可能就没设对后面AC分析的结果也靠不住。2.3 dcOp工作点表检查每个管子是否真的在饱和区这是我在实践中最看重的一步。AC小信号分析是基于DC工作点的线性化如果管子根本不在饱和区AC结果就是一张漂亮的废纸。ADE L里跑完DC后可以查看工作点信息Results - Print - DC Operating Points然后在原理图上选择要查看的晶体管或者直接把所有器件的工作点都导出来。重点关注以下几个参数器件regionVGSVDSVOVIDgmM120.6V0.9V0.1V48μA480μA/VM220.6V0.9V0.1V48μA480μA/VM520.8V0.4V0.3V96μA-region这一列在spectre结果里通常用数字表示2代表饱和区1代表线性区0代表截止区。如果哪个管子显示的region不是2就得回头调整偏置。比如尾电流源M5如果它的VDS小于VOV它就掉进线性区了。这时尾电流源提供的电流不稳定整个差分对的共模抑制能力会大打折扣。解决办法通常是提高尾电流源的漏端电压也就是让差分输入对的源端电压抬高或者加大M5的过驱动电压。另一个高频问题是M1、M2的VDS不够。以1.8V电源为例输出共模点如果被PMOS负载钳得比较高而输入共模又比较低就可能让M1掉进线性区。这时候要么减小负载管尺寸让输出共模电压降下来要么抬高输入共模电压。2.4 共模扫描一个容易被跳过的关键验证DC扫描不一定非要扫差分信号。固定VID0然后把VCM从0扫到VDD观察Voutp - Voutm这个方法能非常直观地暴露输入共模范围的问题。理想情况下在输入共模范围ICMR之内输出差分电压应该保持不变。如果随着VCM升高某个管子退出饱和区输出会突然变化如果VCM太低尾电流源没有足够压降输出同样会异常。这个扫描结果可以配合教材上的公式做交叉验证。比如输入共模电压的下限大致是VDS5_sat VGS1上限大致是VDD - |VOV3| - VDS1 VTH1不同工艺、不同尺寸下这个范围差异很大。我不建议死记公式更推荐直接用共模扫描曲线把实际边界量出来然后记录到设计文档里。这套流程做熟练之后对后面搭运放输入级非常有帮助。3. AC分析双端激励、归一化增益与带宽相位判读3.1 AC源怎么设0.5V/0° 与 0.5V/180°DC扫描只能看大信号传输特性想测增益-频率响应就必须切换到AC分析。AC分析的本质是先算DC工作点然后在工作点附近做小信号线性化所以AC分析里的信号源幅度只是一个归一化单位并不代表实际大信号幅度。在spectre的口袋里普通电压源vsource就带有AC参数。双击输入端的两个直流源正输入端vpAC magnitude填0.5AC phase填0负输入端vnAC magnitude填0.5AC phase填180这样做的意义在于两个源幅度相同、相位相反正好构成一个幅度为1V的差模小信号。实际差分输入电压是vp - vn也就是vp - vn 0.5V/0° - 0.5V/180° 1V/0°所以当你用Voutp - Voutm作为输出时输出曲线的数值直接就是电压增益不需要再做任何归一化换算。有的教材或示例里会把两个源都设为1V/0°和1V/180°这样差分输入其实是2V算增益时输出要除以2。如果你忘了除以2读出来的增益会比真实值大一倍。为了避免这个低级错误我习惯直接用0.5V/0°和0.5V/180°让差分输入正好是1V波形窗口里读什么就是什么。3.2 频率扫描范围的选择与波形判读在ADE L的Analyses窗口里选ac然后设置频率扫描Sweep Type : decade Start : 1Hz Stop : 10GHz Points per decade : 10为什么从1Hz开始因为AC是线性化分析从极低频率开始能看到真正的低频增益平台如果你从1kHz开始可能刚好错过了平台区导致低频增益读数偏低。止点设为10GHz是为了覆盖单位增益带宽之外的高频段确保相位曲线完整。跑完仿真后画出差模输出对应的幅频曲线和相频曲线Voutp - Voutm幅频曲线一般用dB显示。低频平台处就是差模低频增益也就是DC传输曲线那段线性区的斜率。理论上两者应该一致。比如DC传输曲线算出来是80V/V那AC曲线低频段应该在38dB附近。接下来是-3dB带宽在低频增益的基础上下降3dB的那个频率点就是主极点位置。如果输出端挂了0.5pF的负载电容主极点大致由输出阻抗和负载电容决定fp 1 / (2π * Rout * CL)其中Rout是输出端的小信号阻抗在电流镜负载的差分对里大约是ro_n || ro_p。这里可以顺便验证一下手算和仿真的差距如果差得特别多往往是某个管子工作点不对或者寄生参数比你预想的大。单位增益带宽UGB则是幅频曲线穿过0dB的频率。在单极点占主导的系统里UGB ≈ gm / (2π * CL)用之前工作点表里的gm估算一下和仿真结果对一对能很快判断仿真是否合理。3.3 相位曲线别被180°起点吓到相频曲线是很多新手最容易看懵的地方。对于差分对加电流镜负载的结构输出端口相对于同相输入端是反相输出所以低频相位不是从0°开始的而是从180°或者-180°取决于显示方式开始的。随着频率升高经过主极点后相位会朝着90°或-90°方向变化。在Cadence的波形显示里你可能会看到相位从-180°逐渐上升到-90°这是正常现象。如果关心的是闭环稳定性通常要看环路的相位裕度而不是单纯看开环差分对的相位。对开环差动放大器本身更需要关注的是在单位增益带宽频率附近相位比低频值变化了多少以及在零点、次极点存在的频率点相位是否出现了明显提前或滞后。有些版本里可以直接在波形窗口的Calculator中调用相位裕度函数但我不建议一开始就依赖自动读取。手动从幅频曲线上找0dB频率点再读取该点的相位值把它跟180°做差这个手工流程会让你对电路的理解扎实得多。等完全熟悉了再用工具自动量不迟。3.4 增益、带宽的理论值怎么和仿真相互印证写到这里必须强调一个观点仿真不是终点交叉验证才是。我见过有人仿真跑完看着曲线觉得“挺漂亮”就直接截图这是很危险的。至少要用公式粗算一下gm 2 * ID / VOV ro 1 / (λ * ID) A_单端 gm * (ro_n || ro_p) A_差分 2 * A_单端把这些估算值写在边上再和仿真结果对比。如果差异在30%以内多半是λ、VTH等模型参数带来的正常偏差如果差了好几倍就要回到工作点表里看gm和ro是不是真的和预期一致。比如你手算时以为ID50μA但实际尾电流源设计出来只有20μA那所有基于50μA的估算都会失真。这时候不是AC仿真方法的问题而是DC偏置本身的问题。所以我的顺序永远是先DC传输曲线确定大信号行为再看dcOp确定工作点最后AC扫增益带宽这个顺序不能乱。4. 从直流到交流都会踩的坑报错信息、收敛问题与读数陷阱4.1 “No DC path to ground”是怎么来的这是仿真器非常经典的一条报错遇到时不要慌。它背后的原因是电路里某个节点和地之间没有直流电流通路导致雅可比矩阵奇异找不到稳定的直流工作点。差动放大器仿真里最常见的情形是输入端只挂了AC源但没设DC值。有些版本的vsource默认DC为0从DC角度看输入端栅极确实通过信号源接地了一般不会报错但如果你用的是大电容耦合输入的测试平台输入端隔直电容直接串联栅极就完全悬空了仿真器自然找不到直流通路。解决方法有两种一是改变测试平台把输入的DC电平通过大电阻比如1MΩ接到合适的共模电压上二是在悬空节点上添加一个gmin小电阻或者在spectre仿真选项里设置gmin值。不过我不建议一上来就调gmin因为它会稍微改变电路的DC工作点影响后续AC精度。优先把测试平台的直流路径补齐才是正路。4.2 模型库没挂载和器件类型未指定的报错特征报错信息里如果出现了类似Unable to find model definition for nch或者M1: model not found那基本就是模型库路径或模型名的问题。排查步骤很固定在ADE里打开Setup - Model Libraries确认模型文件路径存在确认Section选了正确的工艺角比如tt回到原理图确认器件的Model name和模型文件里定义的名称完全一致包括大小写如果跑的是PDK器件有时还要确认器件的thickness、doping这些参数是否指定了对应模型版本。这些参数出错报错可能不是“model not found”而是仿出来的增益莫名其妙。遇到这种情况先回到最朴素的analogLib mos4验证平台确认不是数字格式或schematic symbol的问题。4.3 DC正常但AC结果不对小心线性化之外的“假象”我遇到过一种情况DC扫描曲线看着很正常工作点也在饱和区但AC增益却比手算值小很多。后来排查发现我的输入信号源只给正端加了AC激励负端AC幅度没有设置本以为差动输入是正端那1V但实际差分AC信号还要算上负端信号。负端如果忘了设置AC参数默认是0那差模输入其实也是1V这个倒没影响真正出问题的是两个源相位都设成了0变成共模激励了差分输出会非常小。这就是读数陷阱差分电路的每个输入都必须精确控制AC幅度和相位。每次改动激励源参数后我都习惯先单独画一下vp - vn确认输入差分曲线确实平坦在1V/0°上再开始分析输出。别小看这一步它能帮你省下大量排查错误数据的时间。4.4 瞬态不收敛为什么先要回DC里找问题网上经常能看到“Cadence瞬态仿真不收敛”的求助。就以差动放大器为例如果你DC扫描明明跑得通但瞬态一开始就发散第一反应不应该是去调瞬态步长而是回到DC检查初始条件。比较常见的原因有两个电路上电瞬间电源从0跳到1.8V某些节点处于一个非常不合理的初始电位导致迭代无法收敛反馈环路里存在高阻节点小信号分析没问题但瞬态大信号下初始值离真实工作点太远我的实操方法是在瞬态分析设置里给关键节点加initial condition把它们的初始电压设成DC扫描得到的稳态值。如果这样瞬态能跑通说明电路本身没问题只是初始值给得不好如果加初始条件仍然不收敛那就要回头看看偏置网络是不是存在不稳定回路或者模型库里的某些参数是否合理。另外spectre的选项里可以设置gmin 1e-12 cmin 1e-18这两个参数对收敛性有影响。gmin是并联在每个节点对地的最小电导cmin是最小电容。调大它们有时能帮助收敛但副作用是会让仿真结果偏离真实电路。所以我的建议是先把这些参数保持默认用初始条件解决实在不行再调整而且每次调整都要意识到自己在引入近似。4.5 单端输出和差分输出的读数方向差动放大器的输出有两种接法一种是直接从M2漏极取单端信号另一种是Vout - Vout-取差分信号。两种方式读AC曲线时方向完全不同。如果是单端输出由于M2的漏极相对于正输入端是反相关系低频增益会是一个负数在AC曲线上表现为-180°起始相位。不要看到负号就以为电路接反了更不要直接取绝对值。而在差分输出模式下两个输出端之间的相位关系抵消了共模部分增益是两倍单端相位起点则取决于你定义的正负端顺序。最稳妥的办法是在原理图上明确标出Vout和Vout-并在波形窗口里始终用同一个表达式去画差分结果比如(VF(/VoutP) - VF(/VoutM))。这样不同次的仿真结果才有可比性也不会把自己绕晕。4.6 从报错到结论建立自己的仿真排查顺序总结这么多坑之后我觉得最有价值的不是记住每一个报错信息而是形成一套稳定的排查顺序先查模型库和器件模型名保证能跑通再查DC工作点保证每个管子都在正确的工作区然后用DC传输曲线验证大信号增益的量级最后跑AC用低频增益、-3dB带宽、UGB和手算交叉验证如果结果对不上别急着改仿真器设置回到步骤2重查工作点按照这个顺序90%的差动放大器仿真问题都能在半小时内定位。我自己的习惯是每完成一个阶段就把工作点和关键波形截图存档这样即使后续改动了电路尺寸也能快速对比差异到底出在哪一环节。回到开头那句话Cadence差动放大器仿真本身并不玄学它的每一步都有清晰的目的DC扫描是为了找到那个能让所有管子安稳工作在饱和区的静态点AC分析则是在这个静态点基础上用小信号方法抽出电路的频率响应。把这两个环节串起来你就有了一个能稳定复现的仿真流程后面不管设计两级运放还是加闭环反馈都能在这个基础上继续往上搭。
返回列表