
一直有种很典型的学模拟IC的场景教材上推导共源级放大器推导得头头是道增益是gm乘上输出电阻带宽是输出极点主导翻译过来就是调W/L、调负载RD就能控制一切。可真打开Cadence IC617 Virtuoso建好原理图跑完DC和AC仿真得到的波形跟书上讲的根本对不上——要么增益低了十来个dB要么相位跑到天上要么管子干脆没饱和。这种教材到工具的断层拦住了很多人。这篇文章就按我实际调过共源级的流程来写从环境准备、工艺库加载、原理图搭建到DC工作点验证、AC增益与带宽仿真、参数扫描优化再到瞬态失真分析和后仿寄生影响。基于Cadence IC617 0.18μm CMOS工艺库全程以最常用的电阻负载共源级为对象。读完你不仅能跑通流程还能理解每个参数在公式里到底落在哪个位置以及仿真曲线跟手算对不上时应该怀疑哪一环。1. 开工前绕不开的环境问题IC617与工艺库的配合逻辑很多人在原理图还没画之前就卡住了不是不会画而是仿真器根本不认管子。IC617装好之后默认的analogLib库里有大量的理想器件包括nmos4、pmos4、vdc、vsin、gnd这些。但关键是analogLib里的晶体管是没有任何工艺模型的符号壳子它要配合CDF参数和仿真模型库才能工作。这一步搞不明白后面跑DC仿真就会冒出Model not defined之类的报错。1.1 模型库才是仿真的灵魂在Virtuoso里画原理图只是第一步真正决定管子行为的是仿真器加载的model library。在ADE LAnalog Design Environment中点击Setup - Model Libraries把工艺库提供的模型文件路径加进去。以常见的0.18μm工艺为例模型文件一般是.lib文件内部会按工艺角分成tt、ff、ss等section。如果只填写了/home/user/model/crn018gp.lib默认会取文件里的第一个section更规范的做法是在Model Libraries窗口的Section栏填上tt这样仿真器就知道你要跑典型工艺角。这里有个IC617特有的小坑加载模型库时要勾选Enabled否则库里是空的但不会报错仿真行为会非常诡异。我遇到过不止一次仿真跑完了输出全是零检查半天发现是模型库没有真正生效。1.2 新建设计库的方式决定了CDF能不能用在CIWCommand Interpreter Window里执行File - New - Library时会让你选择attach到一个已有工艺库。如果选了Dont need a techfile后面画原理图虽然能画但很多PDK相关的CDF参数会缺失。更常见的做法是选Attach to an existing technology library然后选中工艺库名。这样新建的设计库自动继承工艺库的显示颜色、图层定义和器件CDF参数。如果用的是纯模拟自建的工艺模型而不是完整PDK那么在Library Manager里新建库时可以直接选Compile a new techfile然后指向工艺厂的.tf文件。没有.tf文件也没关系schematic和symbol本身不太依赖techfile只要模型库加载正确、CDF参数手动设好仿真照样能跑。1.3 为什么我建议用nmos4而不是nmosanalogLib里有nmos和nmos4两种常用符号。nmos4带独立的衬底端Bnmos通常把衬底和源极内部连接。在共源级仿真里差别很大如果想仿真体效应、观察衬底电流、或者把衬底单独接电位必须用nmos4。即便0.18μm工艺里绝大多数NMOS的衬底最终是接地的我也建议在原理图上用nmos4并显式接地这样版图阶段思路更清晰也不会因为源极和衬底短接导致某些寄生参数被掩盖。这个选择直接影响后仿精度。源-衬底之间的结电容在共源级高频响应里不是摆设尤其当输入电阻比较大的时候它和输入电容会一起参与极点分配。2. 共源级的小信号本质先把公式落到器件参数上电阻负载共源级的核心公式只有三个但新手往往只记住第一个增益Av -gm * (ro || RD)跨导gm sqrt(2 * μn * Cox * (W/L) * ID) 2 * ID / VOV输出极点f_p 1 / (2π * (ro || RD) * CL)这三个公式对应了参数设计时的三条腿增益不够就提高gm或RD带宽不够就降Rout或CL线性度不好就看VOV怎么选。关键是在Virtuoso里怎么把公式变成电路参数。2.1 窄长管、宽短管与gm的取舍gm正比于(W/L)^0.5和ID^0.5这是一个常用结论但误导性也强。增大W/L在电流不变时确实能提高gm但代价是栅极面积变大输入电容Cgs和Cgd跟着涨。Miller效应会直接放大Cgd对输入的影响最终导致带宽不升反降。在0.18μm工艺里如果做1GHz以上的增益级很少有人去盲目加宽管子。更合理的做法是保持W/L不变通过增大尾电流或减小VOV来提高gm。减小VOV意味着管子更接近亚阈值区gm效率高但速度变慢、匹配变差。IC617的dc仿真里可以直接查看gm和vgs我建议你在调参之前先分别跑两组扫描一组固定W/L扫ID一组固定ID扫VOV自己感受下gm的饱和趋势比背公式有体感得多。2.2 从利用率角度看工作点的选择共源级的静态工作点要求NMOS处在饱和区即VDS VGS - VTH。如果把VOV设得过大比如0.4V以上gm效率严重下降同样增益要吃掉更多电流如果VOV设得太小比如小于70mV0.18μm工艺典型值附近管子进入弱反型区gm随电流呈指数变化所有基于平方律的估算全部失效。实际设计时VOV取150mV到250mV是常见的折中区间。在Virtuoso里我通常会直接给栅极一个直流电压源然后做dc仿真里的dc sweep扫VGS同时观察ID和VDS的关系。找到VDS刚好进入饱和区的拐点后再往大留一点裕量那个栅压就是合理的偏置点。这个方法看起来比手算慢但能帮助建立对工艺库的体感。3. 原理图搭建的细节别让连线方式和激励源毁掉一次仿真原理图看起来简单实际画起来有不少隐性门槛。尤其gnd这个符号很多新手从analogLib里调出来往地线一摆就完了但它的name属性和电源符号的搭配是有讲究的。3.1 激励源的类型与DC路径完整性做AC仿真时输入必须同时提供DC偏置和AC小信号。常见方案是用一个vdc加一个vsin串联或者直接用vsin的DC voltage参数带上直流偏置。我更推荐后者双击vsin设置DC voltage为偏置电压比如0.6VAC amplitude为1V注意是峰值Frequency设为1MHz做参考。这样做参数扫描时只需要改一个器件就能同时调整DC点和小信号激励。要特别注意的是如果输入的DC路径被电容隔断或者输出端没有到地的DC负载工作点根本建立不起来。在原理图里检查这条路径是很多老工程师的第一习惯。我见过有人把vsin的DC voltage填了0然后在前面再串一个vpulse去偏置绕了一大圈其实工具里一个参数就能解决。3.2 电源和地的全局连接IC617里gnd符号有global属性电源我用vdd符号或者用vdc源强行设定一个全局名。最省心的做法是在Library Manager里打开analogLib - vdd和analogLib - gnd的symbol确认它们的Terminal Name是VDD!和VSS!或GND!。这决定了后续netlisting时会不会把两个地混在一起。多电源域设计时还要小心global重名问题但共源级这种单电源场景不存在这个麻烦。3.3 cdf参数里那些看不见的默认值从analogLib调出来的nmos4双击后会有Model name这一栏。如果不填仿真器默认用数字编号的模型名但工艺模型文件里的模型名通常是nch、nch_25这类对不上就完全没法跑。所以务必在nmos4的属性里填上工艺库对应的模型名比如0.18μm通用工艺库常见的是nch。W和L的单位也必须确认。IC617里默认是米填1u可以但要注意有些PDK会要求填1e-6或者0.000001图形界面上还会显示带单位的值复制到别的工具里时容易写错。4. ADE L里的仿真三板斧DC、AC与参数扫描原理图画好了模型库加载了接下来就是在ADE L里把指标逼出来。很多人一上来就点Run但没有任何分析任务被设定仿真器实际上什么都不做。你得先Choose Analysis这是新手最容易忽略的一步。4.1 DC工作点分析先确认管子在哪在Analyses里选dc勾选Save DC Operating Point确定后点Run然后在Results - Print - DC Operating Points里点一下要观察的器件实例就能看到region、id、vgs、vds、gm、gds这些值。我第一次调共源级时觉得输出波形不对劲结果一看Operating Point管子region是1线性区gm低得可怜增益自然上不去。这个习惯要养成仿真结果异常时先看工作点再调参数。工作点不对后面所有高频分析都建立在沙滩上。4.2 AC分析与增益-带宽曲线的读法在Analyses里选ac设置Sweep Variable为FrequencySweep Range填1Hz到10GHz勾选Default和Logarithmic点数设1000或更多。跑完后在Results - Direct Plot - Main Form里选AC Gain Phase点输出端net就能看到幅频和相频曲线。曲线出来后要读三个东西低频增益20*lg(Av)、-3dB带宽、增益下降斜率。如果是单纯电阻负载单极点斜率应该接近-20dB/dec。如果看到-40dB/dec的滚降说明输入端或输出端有第二个主导极点比如vsin自带的输出电容或者输入端的寄生电容在作怪。这里有个读曲线的小技巧在幅频曲线上用Marker工具放一个游标再用Calculator里的bandwidth函数能直接算出-3dB点。不过我个人更习惯手动标记两个点低频增益点和下降3dB的交叉点这样心里更有数知道带宽是被哪个极点压下来的。4.3 参数扫描在Virtuoso里让W/L活起来为了观察W/L或RD变化对增益、带宽的影响不必一次次改原理图参数。把nmos4的W值改成变量wvar然后在ADE L里打开Tools - Parametric Analysis在Variable栏选wvar填起始值、步长和终止值点Run。注意变量的书写格式有时会被当成字符串所以可以在变量名后面加单位形式比如wvar的初值在原理图里填2u还是2e-6取决于CDF定义的unit。建议用一个方便的外部表达式然后在扫描范围里同样按米填写。Parametric Analysis跑完以后波形窗口会把多条曲线叠在一起逐条用不同颜色区分。这样可以直接看到W从2μm扫到10μm时低频增益从多少dB抬到多少dB带宽又付出了什么代价。这一条曲线组合就是最直观的tradeoff教材。4.4 波形窗口与Calculator的配合IC617的波形窗口ViVA和Calculator集成度很高。如果要在多种条件下比较增益可以直接在Calculator里写表达式比如value(VF(/out) -20*dB20(...))这类操作。但小信号AC仿真里VF(/out)实际是复数所以取幅值更标准的写法是dB20(mag(VF(/out)))。这个表达式组合在扫描多变量、提取每一个W对应的增益峰值时非常好用。5. 增益、带宽与功耗的三角关系一次完整的优化过程理论部分说完了实际操作我以0.18μm工艺、1.8V电源为例设计一个增益目标大于20dB、-3dB带宽大于200MHz、负载电容1pF的电阻负载共源级。初始参数W/L 2μm/0.18μmID 50μARD 10kΩ。跑一遍AC大概率低频增益只有18dB左右带宽也只有100MHz左右离目标有距离。接下来看怎么一步步优化。5.1 先扫RD还是先扫W/L从公式看增益和RD是近似正比关系但RD增大以后输出极点的等效电阻跟着变大带宽会直接掉。所以首选调法是先定RD让它处在带宽约束的上限再用W/L补增益。怎么知道上限先用AC扫描一个固定的W/L扫RD从5k到20k观察每次的-3dB带宽。如果RD20k时的带宽已经低于200MHz那就说明RD最多取到15k左右。如果RD固定提高W/L能提高gm但要注意输入电容变大后Miller效应对输入极点的影响。0.18μm工艺里Cgd在饱和区约为Cox*W*LDW加大后Cgd线性增加。输入极点频率近似为f_in ≈ 1 / (2π * Rs * (Cgs (1|Av|)*Cgd))当Av在20dB区间时Miller因子接近10倍输入电容会被放大得很可观。所以不是W越大越好很多时候增益还没提够输入极点已经先把带宽压没了。这也是为什么在Virtuoso里跑完参数扫描后要把增益和带宽曲线放在一张图里一起看单独优化一个指标是失衡的。5.2 加电流还是减VOV如果功耗预算允许提高偏置电流是更干净的做法。流过RD的电流越大增益不变时RD可以取得更小带宽更好。代价是功耗。在IC617里改vsin的DC偏置电压或者DC扫描表达式都能改变工作电流但更好的做法是直接把RD下面的源极接一个理想的idc电流源来代替纯电阻负载然后扫描电流源的值。用idc做负载的共源级输出电阻接近ro增益通常能做到40dB以上但输出极点频率也更低。这个结构在你需要高增益场景下是首选但它的输出摆幅受VOV限制线性度比电阻负载差。所以电阻负载共源级更常用于宽带、中等增益链路里电流源负载更常用于高增益的运放第一级或低带宽放大链中。5.3 负载电容的现实来源仿真里在输出端挂一个1pF电容看起来是人为加的其实它代表了下一级电路的输入电容和连接线的寄生。共源级的输出极点频率由(ro || RD)和CL共同决定如果下一级输入电容比较大即便你在原理图里没画电容后仿也要面对它。所以前仿阶段就在输出端挂上预估的容性负载是很有必要的比仿完发现后仿崩了再回过头加要省事得多。在扫带宽时把CL作为一个变量扫0.5pF到3pF能直观看到带宽随负载的变化规律对判断这个电路最多能驱动多大负载非常有用。5.4 一个完整的优化结果示例目标增益≥20dB、带宽≥200MHz、负载1pF。某次调试我得到的参数是W/L 5μm/0.18μmRD 8kΩID 80μAV_BIAS 0.65V。最终AC结果大约为21.5dB增益-3dB带宽约220MHz。这个过程中我做了两组参数扫描一组RD从6k到12k观察增益和带宽交叉点一组W从2μ到8μ观察输入极点是否逼近。最终选点不是哪个参数单独最优而是两者都能接受的平衡点。6. 瞬态仿真与失真小信号分析没告诉你的真相AC仿真是基于工作点附近线性化的它假设输入小到不会改变工作点。实际信号幅度一大共源级的非线性就开始冒头gm随VGS摆动、VDS变化引起的沟道长度调制、甚至管子瞬间退出饱和区造成削波。这些在瞬态仿真里看得清清楚楚。6.1 瞬态仿真的基本设置与收敛问题在ADE L里选tran设置Stop Time、Accuracy Defaults。对共源级来说一般Stop Time要覆盖输入信号的若干周期比如输入1MHz正弦波跑到5μs就有5个周期足够观察稳态波形。Accuracy建议选moderate如果波形有异常毛刺再降成conservative。瞬态仿真的步长控制很关键。默认步长有时会让正弦波顶端出现明显的折线感这不是电路问题是数值采样不够密。在tran设置里可以指定Step Ceiling比如填1n强迫仿真器每纳秒至少取一个点。代价是仿真时间变长但对1MHz级别的低频信号影响不大。6.2 观察输出波形判断失真类型把输入vsin的Amplitude设为100mV、200mV、500mV各跑一次瞬态观察输出波形100mV时输出波形基本是干净的反相正弦200mV时波形不对称开始出现正半周和负半周幅度不一样500mV时增益压缩明显甚至顶部/底部出现削平。原因在于共源级是反相放大输出摆动大的方向会把NMOS推向线性区或截止区前者增益下降后者直接失去放大能力。增益压缩的方向取决于静态工作点位置VDS越接近过驱动电压削波越早。6.3 用FFT量化THDIC617的波形窗口自带FFT工具在瞬态波形上选中Tools - FFT设置基频为输入频率就能看到谐波分量。通常二次谐波比三次谐波大得多这是单端放大器的典型特征直流偏置导致的非对称摆幅直接产生偶次谐波。如果要扫描输入幅度对THD的影响可以把vsin的Amplitude设成变量ain用Parametric Analysis从100mV扫到500mV每次记录THD数据。最后你会发现THD随输入近似线性上升——这个趋势比单个点的THD数字更有设计指导意义。6.4 1dB压缩点这个小指标1dB压缩点指的是增益比小信号增益低1dB时的输入或输出功率。在共源级里它主要由工作点和负载电阻决定。你可以直接从瞬态仿真的FFT里读基波幅度计算归一化增益然后找到压缩1dB的点。做射频链路时这个指标很关键但在低频模拟里容易被忽略。不过养成习惯后它对理解共源级线性度极限很有帮助。7. 前仿到后仿那些看不见的寄生电容是如何改变一切的共源级的前仿结果漂亮到让人误以为自己已经是模拟大师版图一画完后仿结果可能掉得让你怀疑人生。这不是工艺问题是寄生参数在作怪。7.1 寄生电容分布在哪里共源级的版图寄生主要来自三处栅极poly与有源区之间的覆盖电容、漏极/源极有源区与衬底之间的结电容、以及金属连线之间的耦合电容。其中栅-漏之间的Cgd最毒因为它受到Miller放大等效输入电容是Cgd*(1|Av|)。后仿里这条寄生往往比前仿模型里的Cgd大得多因为它还包含栅极引出线和漏极引出线之间的耦合。输出端的寄生电容主要是漏区结电容和金属线电容。这个电容直接并联在RD上和后挂的CL一起决定输出极点。前仿不加负载跑出500MHz带宽后仿可能只剩250MHz这通常是输出节点寄生实打实地把极点拉低了。7.2 后仿中增益略降带宽大降的典型现象跑完PEX寄生提取后重新仿真常见的现象是增益变化不大最多掉2~3dB但带宽掉30%以上。增益没啥变化是因为寄生电阻对ro || RD影响有限但带宽对节点电容高度敏感几个fF的差异就能改变极点频率。这个现象也提醒我们前仿设计时要留足带宽裕量。目标200MHz前仿不妨做到300MHz以上给后仿寄生电容留出空间。靠前仿就把带宽压线后仿基本很难救回来。7.3 减小寄生电容的版图策略从仿真角度能做的是在原理图阶段就预估寄生量并回填到前仿网表里。比如用analogLib的cap给关键节点加寄生电容栅极输入加2~5fF输出节点加5~10fF然后看带宽还剩多少。这个假后仿能提前发现节点是否过于重。版图端的处理则是另一套功夫减小漏区面积以降低结电容、减少重布线层以降低金属寄生、把关键敏感线尽量走短。IC617里可以用Layout XL做版图寄生参数的快速预览跑一次QRC提取后再回仿及时调整设计参数。8. IC617仿真中的高频报错与排查记录Virtuoso的报错信息一向不够友好同样的错误在不同的工艺库和仿真器版本里描述都不一样。我把自己踩过的几种典型问题列出来排查思路比报错文字本身更有参考价值。8.1 Model not defined类报错有两种可能模型库没加载或者器件属性里的模型名没填对。排查顺序是先检查Setup - Model Libraries里路径是否存在、section是否正确再回去双击nmos4确认Model name是否与库里的模型名一致。可以在.lib文件里搜索模型名确认大小写。有些PDK里NMOS叫nch有些叫nch_25还有些叫nmos1v8对不上就会直接报错。另一个隐蔽情况是模型库里存在library嵌套.lib文件里再用.include或.lib包含其他文件。如果加载路径只指到最外层但section定义在子库里仿真器会找不到模型。解决办法是把Setup - Model Libraries里同时加载子库文件或者把路径指到最内层的库文件。8.2 DC扫描曲线出现异常拐折或负增益DC扫描时如果发现VOUT随VIN变化曲线异常先看扫描范围是否超出工作区。比如VIN从0扫到1.8V管子会经历截止、饱和、线性区输出曲线自然分三段。很多新手把这个当电路故障其实是管子正常的四象限行为。如果只关心饱和区就把扫描范围压缩到0.5V到0.8V之间。再观察曲线在这个区间里是否线性度尚可如果斜率忽大忽小说明VDS裕量不足管子局部离开饱和区了。8.3 AC仿真结果是一条平线增益恒为0dB、相位持平或翻转这个现象通常不是电路问题而是激励问题。检查vsin的AC amplitude是否为1V或非零还要检查AC扫描里是否选对了Sweep Variable有人会不小心把AC分析设成扫描Component Parameter结果扫的是某个器件参数自然没有频率响应。另外如果输入端串联了隔直电容一定要确保DC偏置能到达栅极否则管子根本没导通AC小信号自然传不进去。8.4 瞬态仿真速度慢或波形抖动0.18μm工艺、1MHz信号、5μs仿真时间理论上几秒钟就能跑完。如果仿真异常缓慢多半是电路里存在某个极度影响步长的事件比如莫名其妙的振荡、或者某个节点时间常数过小。用tran里的Conservative精度会进一步放大这个问题。波形抖动一般出现在大幅值信号激励下。如果看到高频毛刺叠加在主波形上先不是改电路而是把Step Ceiling设到远小于主信号周期排除数值振荡。如果还是抖再看电路里是否存在环路稳定性问题。8.5 参数扫描后波形窗口里没有多条曲线这是操作问题。Parametric Analysis跑完会自动弹出一个多条曲线的窗口但如果之前在主波形窗口里打开过数据新结果可能被覆盖。解决办法是跑参数扫描前把波形窗口清空或者在Results - Direct Plot里把每条扫描结果重新拉出来。如果你没用过Calculator这步会卡很久建议提前熟悉VF(/out)的表达习惯。9. 把IC617的仿真结果翻译回设计思想最后聊点仿真之外的东西。我发现很多人在Virtuoso里跑出一堆曲线却不知道这些曲线意味着下一版设计该怎么改。这本质上是指标到参数的回译能力——模拟设计的核心能力。共源级调试中最重要的三组映射关系是低频增益不足优先看gm和Rout。gm不足可能是电流太小或W/L太小Rout不足可能是RD太小或沟道长度调制太强。在Operating Point窗口里对比gm和gds能快速定位瓶颈。带宽不足优先看Rout和CL。检查输出极点和输入极点谁更低。在AC曲线上观察-20dB/dec和-40dB/dec的转折位置哪个转折压在前就处理哪个节点。失真大优先看工作点摆幅余量。VDS离VOV太近正向摆动很容易切进线性区ID太小负向摆动容易截止。这两个方向对应不同的削波形状。IC617里还有一个常被忽略的报表功能Results - Print - DC Operating Points可以把所有管子的小信号参数导成CSV或文本格式。把这些数据拉到计算器里做详细预算比在波形窗口里猜效率高得多。共源级是整个模拟IC设计里最基础、也最能练基本功的电路。它没有运放那么多反馈路径没有差分对的对称性约束结构简单到一眼看穿但正因为简单每一个参数的影响都能被清晰追踪。把这一步吃透后面调Cascode、调运放、调LDO的误差放大器思路都是同一套逻辑看工作点、算小信号参数、扫变量、找瓶颈、再做tradeoff。IC617这套流程练熟了换到任何现代PDK环境都只是路径和名字的差别。