
1. 噪声仿真在Cadence里的真实定位1.1 为什么“使能指定噪声类型”是个高频痛点但凡做过模拟电路仿真的朋友大概率都遇到过这种场景电路功能跑通了增益、带宽、功耗都达标结果流片回来一测输出噪声比仿真值高出一大截。回头查仿真设置发现噪声分析里只开了热噪声闪烁噪声压根没使能。这种坑我在早期做LDO和带隙基准的时候就踩过不止一次。Cadence的噪声仿真体系其实分得挺细不同工具、不同分析类型下“噪声类型”这个概念的落点完全不一样。在Virtuoso ADE里做noise analysis你能选的是输出噪声、输入参考噪声、等效输入噪声这些输出形式而具体到噪声的物理来源——热噪声、闪烁噪声、散粒噪声、爆裂噪声——它们的使能开关藏在模型库、仿真器选项和器件参数三个不同的层级里。很多人以为在ADE的noise analysis面板里勾一下就行了实际上那个面板管的是“算什么”不管“算哪些物理机制”。所以这个标题“Cadence中使能指定噪声类型的方法”核心要解决的就是当你需要让仿真器在噪声分析中纳入特定类型的噪声源时到底该在哪几个地方动手顺序是什么哪些设置会互相覆盖。这个问题在Spectre和AMS仿真器下表现还有差异在SPICE模型和Verilog-A模型混用的场景里更容易出乱子。1.2 本文适合哪些人参考如果你正在用Cadence Virtuoso做模拟电路噪声仿真不管是运放、LDO、PLL还是ADC的输入级只要涉及噪声指标这篇内容都能直接拿去用。特别是以下几类情况建议重点看仿真出来的噪声谱密度在低频段明显偏低怀疑闪烁噪声没被算进去换了个工艺库之后同样的电路噪声结果突变不知道是模型问题还是设置问题用Verilog-A写的 behavioral 模型做噪声仿真结果和晶体管级对不上在ADE XL里跑corner仿真发现不同corner下噪声类型使能状态不一致。我下面会按“先搞清楚噪声从哪来再决定在哪使能最后验证使能是否生效”这个顺序来讲中间会穿插具体的菜单路径、变量名和实测对比数据。2. 噪声类型在Cadence里的三层使能机制2.1 第一层模型库里的噪声参数开关这是最底层、也最容易被忽略的一层。Cadence的晶体管模型不管是BSIM3、BSIM4还是BSIM-CMG噪声相关的参数都写在模型卡里。以BSIM4为例和噪声直接相关的参数有这么几个参数名作用默认值影响噪声类型NOIMOD噪声模型选择1决定热噪声和闪烁噪声的计算方式TNOIMOD热噪声模型选择00为传统模型1为整体噪声模型AF闪烁噪声指数1影响1/f噪声斜率KF闪烁噪声系数0为0时闪烁噪声被关闭EF闪烁噪声频率指数1影响频率依赖关系EM饱和区闪烁噪声指数1影响饱和区噪声关键点在于KF。很多工艺库为了加快仿真速度默认把KF设为0这时候即使你在ADE里开了noise analysis闪烁噪声也不会被算进去。我实测过某65nm工艺KF默认为0时1kHz处的输出噪声比KF设为工艺推荐值低了将近12dB这个差距在低噪声设计中是致命的。使能方法很直接找到模型库文件通常是.scs或.lib格式在对应corner的section里确认KF、AF、EF这些参数有非零值。如果工艺厂提供的模型里KF是0你需要手动加上去但要注意——这个值不能随便填必须从工艺厂的噪声测试报告或PDK文档里拿。注意修改模型库文件之前先备份而且最好新建一个section来放修改后的噪声参数不要直接改原始section否则下次更新PDK时会被覆盖。2.2 第二层仿真器选项里的噪声分析使能这一层是大多数人以为的“使能噪声类型”的地方实际上它管的是噪声分析的整体开关和输出形式。在Virtuoso ADE里noise analysis的设置项包括Output Noise输出端噪声谱密度Input Noise输入参考噪声Equivalent Input Noise等效输入噪声Noise Contribution各器件噪声贡献但这些选项不区分热噪声和闪烁噪声它们只是告诉仿真器“我要看哪种形式的噪声结果”。真正决定算不算闪烁噪声的是仿真器选项里的noiseout和模型里的KF参数配合。在Spectre仿真器下有一个选项叫usenoise默认是all意思是所有噪声类型都算。但如果你在模型里把KF设为0即使usenoiseall闪烁噪声贡献也是0。所以这一层和第一层是“与”的关系不是“或”的关系。具体操作路径ADE L → Simulation → Options → Analog → Noise里面有个Noise Type选项可以选all、thermal、flicker。选thermal就只算热噪声选flicker就只算闪烁噪声。这个设置在做噪声源分离分析时特别有用——你可以跑两次仿真一次只开热噪声一次只开闪烁噪声然后对比两者的贡献占比。2.3 第三层器件实例级的噪声使能这一层针对的是个别器件的噪声开关。在Virtuoso原理图里选中某个晶体管按Q查看属性在Noise标签页下有几个选项Thermal Noise是否计入热噪声Flicker Noise是否计入闪烁噪声Noise Multiplier噪声倍数用于并联器件这个功能在什么时候用举个例子你做的是一个chopper运放输入对管的闪烁噪声被chopping调制到了高频低频段的闪烁噪声实际上被抑制了。这时候你可以在仿真里把输入对管的flicker noise关掉看看剩余电路的噪声底是多少。但要注意这个开关只影响该器件实例不影响模型库里的全局设置。还有一个场景是理想器件替换。比如你用理想电阻做负载理想电阻本身不产生闪烁噪声但如果你用了一个带噪声模型的电阻它的热噪声会被算进去。这时候可以在实例属性里把不需要的噪声类型关掉避免虚假噪声贡献。3. 不同仿真器下的使能差异与实操步骤3.1 Spectre经典仿真器下的完整使能流程Spectre是Cadence自家最常用的仿真器噪声分析的支持也最完整。下面是我平时用的标准流程你可以直接照着走一遍。第一步确认模型库噪声参数。打开你的工艺库模型文件搜索KF、AF、EF确认非零。如果工艺厂提供了多个噪声模型版本比如noise_model_1和noise_model_2选最新的那个。第二步在ADE里设置noise analysis。菜单路径Analyses → Choose → Noise。设置项里Sweep Frequency噪声分析的频率范围一般从1Hz到100MHz点数用log scale每十倍频程20到50个点。Output Node选你的输出节点通常是运放输出或LDO输出。Input Source选输入参考源用于计算输入参考噪声。Noise Type选all或者根据需要选thermal/flicker。第三步检查仿真器选项。在Simulation → Options → Analog里确认usenoise设为all。如果这里设成了thermal那即使模型里有KF闪烁噪声也不会被算。第四步跑仿真看噪声贡献。在ADE的Direct Plot里选Noise Contribution可以看到每个器件的噪声贡献占比。如果某个晶体管的闪烁噪声贡献是0而你知道它应该贡献不小那就回去查模型里的KF。我实测过一个两级运放第一级输入对管的闪烁噪声在1kHz处贡献了总噪声的60%以上。如果KF被设为0这个贡献直接消失总噪声会低报8到10dB。这个差距在音频段特别明显。3.2 AMS仿真器下的噪声使能注意事项AMS仿真器用于数模混合场景噪声分析的使能方式和纯Spectre有些差异。主要问题出在数字部分的噪声被忽略以及Verilog-A模型里的噪声源需要显式声明。在Verilog-A里噪声源不是自动的你得用white_noise()和flicker_noise()函数显式添加。比如一个电阻的Verilog-A模型analog begin I(V) V(V)/R; I(V) white_noise(4*P_K*$temperature/R, thermal); I(V) flicker_noise(KF*I(V)*I(V)/(freq), AF, flicker); end这里white_noise和flicker_noise就是噪声使能的关键。如果你只写了white_noise没写flicker_noise那这个模型就只有热噪声没有闪烁噪声。AMS仿真器会尊重这些声明但前提是你在ADE里把noise analysis打开了。还有一个坑AMS仿真器下数字模块的噪声默认是不算的。如果你做的是混合信号电路数字部分对模拟部分的噪声耦合需要通过connect module来传递否则仿真结果会偏乐观。3.3 噪声类型使能后的验证方法使能完了不算完得验证是否真的生效。我常用的验证手段有三种第一种对比法。跑两次仿真一次KF非零一次KF0看噪声谱密度在低频段是否有明显差异。如果没差异说明闪烁噪声没被使能。第二种贡献法。在Direct Plot里看Noise Contribution确认闪烁噪声贡献非零。如果所有器件的闪烁噪声贡献都是0那肯定是模型或仿真器选项的问题。第三种解析法。对于简单的单管共源级噪声谱密度有解析公式$$S_{v,out} \frac{4kT\gamma}{g_m} \frac{KF}{C_{ox}WL f^{AF}}$$你可以手算一个预期值和仿真结果对比。如果仿真值明显偏低大概率是闪烁噪声没算进去。4. 常见问题与排查技巧实录4.1 噪声类型使能失效的典型原因我整理了一个速查表按出现频率从高到低排列问题现象可能原因排查方法解决方式低频噪声明显偏低模型KF0查模型文件KF参数从PDK文档获取正确KF值噪声贡献里无闪烁项仿真器usenoisethermal查Simulation Options改为all换corner后噪声突变不同corner模型KF不一致对比各corner模型文件统一噪声参数Verilog-A模型无噪声未声明noise函数查模型代码添加white_noise/flicker_noise实例噪声被意外关闭器件属性里Noise选项被改查实例属性恢复默认使能AMS下数字噪声缺失未做connect module查混合信号连接添加噪声耦合路径4.2 模型库更新后的噪声参数丢失问题这是我最常遇到的坑之一。工艺厂更新PDK时模型库文件会被覆盖你之前手动加的KF参数就没了。更麻烦的是有些PDK更新后默认KF值变了但你没注意到仿真结果就偏了。我的做法是在项目目录下建一个noise_override.scs文件里面只放噪声相关的参数覆盖然后在ADE的Model Libraries里把这个文件排在工艺库后面。这样PDK更新时你的噪声设置不会被覆盖。具体写法section noise_override parameters KF1e-25 AF1 EF1 include 工艺库路径 sectionnominal endsection这个方法的原理是Spectre的模型加载顺序——后面的覆盖前面的。你把override文件放最后就能保证噪声参数始终按你的设置来。4.3 噪声仿真不收敛时的噪声类型排查噪声仿真不收敛是另一个高频问题而且有时候和噪声类型使能有关系。比如你把闪烁噪声使能了但AF参数设得很大导致1/f噪声在低频段发散仿真器就可能不收敛。排查思路先把Noise Type设为thermal看是否收敛。如果收敛再逐步加flicker看哪个频点开始发散。如果确实是闪烁噪声导致的检查AF和EF是否在合理范围。通常AF在0.5到2之间EF在0.5到1.5之间。超出这个范围要么是模型有问题要么是工艺厂给错了。还有一个技巧在noise analysis里把频率下限设高一点比如从10Hz开始而不是1Hz。这样低频段的发散点被避开仿真能跑完你再看10Hz以上的噪声是否合理。5. 进阶技巧噪声类型的选择性使能与贡献分析5.1 用noise type分离做噪声优化当你确认了噪声类型使能没问题之后下一步就是做噪声优化。我的习惯是跑三次仿真第一次Noise Type all得到总噪声。 第二次Noise Type thermal得到热噪声贡献。 第三次Noise Type flicker得到闪烁噪声贡献。然后对比三次结果看哪个噪声源在目标频段占主导。如果是热噪声主导优化方向是增大gm或减小寄生电阻如果是闪烁噪声主导优化方向是增大器件面积或换用闪烁噪声更低的工艺。这个分析方法在LDO设计中特别有用。LDO的输出噪声在低频段通常由基准源的闪烁噪声主导中频段由误差放大器的热噪声主导。分离之后你可以针对性地优化。5.2 噪声贡献列表的解读与器件级使能Direct Plot里的Noise Contribution会列出每个器件的噪声贡献但默认是按总噪声排的。你可以右键选择Sort by Flicker按闪烁噪声贡献排序。这样一眼就能看出哪个器件的闪烁噪声最大。如果某个器件的闪烁噪声贡献异常大而你又不想改电路可以在实例属性里把这个器件的flicker noise关掉看看总噪声能降多少。这相当于一个“what-if”分析帮你判断是否值得为这个器件做特殊处理。但要注意关掉实例噪声只是仿真手段不能替代实际设计。你可以在仿真里关掉某个器件的闪烁噪声但流片后它依然存在。所以这个功能更多用于分析不是用于“作弊”。5.3 噪声类型使能与corner仿真的配合在ADE XL里跑corner仿真时噪声类型的使能状态需要每个corner单独确认。因为不同corner可能加载不同的模型section而不同section里的KF可能不一样。我的做法是在ADE XL的corners设置里把噪声相关的模型参数作为变量传进去。比如定义一个noise_kf变量在每个corner里赋不同的值。这样跑完corner仿真后你可以直接对比不同KF下的噪声结果判断工艺波动对噪声的影响。还有一个细节温度corner对噪声影响很大。热噪声和温度成正比闪烁噪声和温度的关系更复杂。所以在跑温度corner时建议把Noise Type设为all同时看热噪声和闪烁噪声的温度趋势。如果只开thermal你会低估低温下的闪烁噪声贡献。6. 我在实际项目中的几点体会做噪声仿真这些年最大的体会是噪声类型使能这件事看起来是个小设置实际上决定了你仿真结果的可信度。我见过太多人仿真噪声达标就流片回来一测发现低频噪声高了十几dB回头查才发现KF没使能。这种错误在项目后期发现代价很大。另一个体会是不要迷信默认设置。工艺厂提供的模型库默认KF经常是0因为噪声仿真比DC仿真慢很多工艺厂为了加快用户的前期仿真速度会把噪声关掉。但到了噪声优化阶段你必须手动打开。所以我的习惯是项目一开始就在模型库加载列表里加上噪声override文件避免后期忘记。还有一点Verilog-A模型的噪声使能要特别小心。很多behavioral模型为了简化只写了功能没写噪声。如果你用这种模型做噪声仿真结果会偏乐观。我的做法是关键模块必须用晶体管级模型做噪声仿真behavioral模型只用于功能验证。最后分享一个小技巧在ADE里建一个专门的noise仿真state把Noise Type、频率范围、输出节点这些设置都存进去。下次做噪声仿真时直接加载这个state不用重新设置。这个state还可以导出成脚本在ADE XL里批量调用。我现在的项目里每个电路模块都有一个对应的noise state切换起来很方便。