
在模拟和混合信号仿真里噪声分析经常被当成一个“跑完就完事”的流程但真正做过低噪声放大器、LDO、基准源或者高精度ADC前端的人都知道噪声类型选不对仿真结果和实测能差出一个数量级。我见过太多人拿着总输出噪声曲线去和实测对不上回头查了半天电路最后发现是仿真器里只开了热噪声闪烁噪声压根没参与计算。Cadence的噪声分析其实给了很细的颗粒度控制只是这些开关藏在几个不太起眼的地方默认配置又往往不是你想要的那一种。这篇就围绕“在Cadence里怎么使能指定的噪声类型”这件事把noise analysis的配置逻辑、不同噪声源的物理含义、以及实际项目中怎么按需打开或关闭某一类噪声从头到尾讲清楚。不管你是刚接触spectre仿真的新手还是已经跑过不少corner但没深究过噪声选项的老手下面这些内容应该都能帮你少走一些弯路。1. 噪声分析在Cadence里的入口与默认行为1.1 noise analysis和noise summary的区别很多人第一次找噪声设置是在ADE L的Analyses菜单里点noise然后看到一个对话框里面只有频率扫描范围、输出节点、输入源这几项翻遍了也没找到“噪声类型”的勾选框。这是因为Cadence把噪声类型的控制分成了两个层面一个是仿真引擎层面的噪声模型开关另一个是分析类型层面的输出选择。noise analysis本身做的是把每个器件在指定频段内产生的噪声贡献叠加到输出节点它默认会计算所有在模型里被激活的噪声源。也就是说如果你用的工艺模型里MOS管模型带了闪烁噪声参数那spectre默认就会把flicker noise算进去如果模型里没有相关参数那你想开也开不了。这一点和很多人以为的“有个总开关控制所有噪声类型”不太一样。noise summary则是仿真结束后在Results菜单里看的那张表它列出每个器件对总输出噪声的贡献占比。这张表能帮你定位谁在主导噪声但它不控制噪声类型只是把已经算出来的结果做分解展示。所以当你问“怎么使能指定噪声类型”时真正要操作的地方通常有三个模型文件里的噪声参数、仿真选项里的噪声相关设置、以及分析语句里的噪声输出配置。1.2 默认情况下哪些噪声是打开的以spectre为例在标准MOS管模型比如BSIM4中如果模型卡里给出了noia、noib、noic、noimod这些参数那么沟道热噪声和闪烁噪声都会在noise analysis中被自动计算。电阻的thermal noise默认也是打开的只要电阻模型里有rn或者温度参数。BJT的shot noise和flicker noise同样取决于模型卡是否包含相关参数。但有一个容易被忽略的点开关电容电路里的噪声。如果你用的是理想开关或者行为级模型这些元件本身不产生噪声仿真器也不会凭空给你加。这时候你看到的噪声结果可能偏乐观因为实际开关的导通电阻热噪声被忽略了。另外noise analysis默认只计算输出节点的总噪声谱密度不会自动给你分离出“热噪声贡献”和“闪烁噪声贡献”。想要分开看得在输出表达式里做文章或者用noise summary里的器件级分解去反推。提示如果你在ADE里跑完noise analysis发现总噪声曲线在低频段异常平坦没有出现典型的1/f上升趋势第一件事就是去检查模型卡里有没有闪烁噪声参数而不是去翻仿真设置。2. 通过模型参数控制噪声类型的底层逻辑2.1 MOS管噪声模型的关键参数要让仿真器“使能”某一类噪声最根本的办法是在模型层面把对应的噪声参数配好。以BSIM4为例和噪声相关的参数主要有这么几个参数名含义影响噪声类型noia闪烁噪声系数A1/f噪声幅度noib闪烁噪声系数B1/f噪声偏置依赖noic闪烁噪声系数C1/f噪声偏置依赖noimod噪声模型选择决定用哪种1/f模型tnoimod热噪声模型选择决定沟道热噪声算法rnoia感应栅噪声系数栅极感应噪声这些参数通常由工艺厂在模型卡里给出但如果你用的是自己写的简化模型或者从别的工艺移植过来的模型这些参数可能缺失。缺失的后果就是spectre在noise analysis里直接跳过对应的噪声源你看到的结果里就没有这部分贡献。举个实际例子某次我用一个0.18um工艺做LNA设计noise summary里显示M1的贡献只有热噪声低频段1/f噪声几乎为零。查了半天发现模型卡里noia和noib都是默认值0而工艺厂提供的完整模型里这两个参数应该是有非零值的。把参数补上之后低频噪声立刻上来了和实测趋势对得上。2.2 电阻和电容的噪声使能方式电阻的热噪声由rn参数或者温度直接决定spectre默认会计算。如果你想临时关掉某个电阻的噪声比如在做理想化分析时不想让偏置电阻的噪声干扰结果可以在电阻实例上设置noise0或者用一个noiseless电阻模型。电容本身不产生热噪声但在某些模型里会有介质损耗相关的噪声这个一般不用手动开除非你用的是带损耗的电容模型。这里有一个实操技巧如果你只想看某个子电路的噪声贡献又不想被其他部分的噪声淹没可以临时把其他部分的电阻设为noiseless或者用noise分析里的output和input指向特定节点配合noise summary的器件排序来定位。2.3 模型卡里噪声参数缺失时的补救有时候你拿到的模型是加密的或者简化过的没法直接改模型卡。这时候有两个办法一是用simulator langspectre里的parameters语句在网表顶层覆盖模型参数。比如parameters noia1e-20 noib1e-21 model mynmos bsim4 typen noianoia noibnoib ...但这种方法要求模型卡里对应参数是可覆盖的加密模型通常不行。二是用noise分析里的noiseless选项把不需要的器件临时设为无噪声反过来突出你要看的噪声类型。这个后面会细说。3. 在ADE中配置noise analysis的完整流程3.1 从Analyses菜单建立noise分析打开ADE L或者ADE XL在Analyses菜单里选Choose然后勾noise。弹出的对话框里需要填几个关键项Output node你要观察噪声的节点通常是电路输出端。Input source参考输入源用来计算输入等效噪声。Sweep range频率范围一般从1Hz或者10Hz扫到电路带宽的10倍以上。Sweep type对数扫描更适合看1/f噪声的上升趋势。填完这些点OK仿真跑完就能看到输出噪声曲线。但这时候你还没有任何“选择噪声类型”的操作因为spectre已经把模型里所有可用的噪声源都算进去了。3.2 用noise summary定位主导噪声源仿真结束后在Results菜单里选Noise Summary会弹出一张表。这张表按贡献从大到小列出每个器件的噪声功率占比。你可以通过这张表判断如果低频段某个MOS管的贡献突然增大说明它的1/f噪声在主导。如果高频段电阻的贡献上来了说明热噪声在主导。如果某个器件的贡献始终为零要么它不产生噪声要么它的噪声参数没被激活。这张表是你验证“指定噪声类型是否生效”的最直接工具。比如你怀疑闪烁噪声没打开就看低频段MOS管的贡献占比如果占比和只算热噪声时差不多那基本可以确定1/f没参与计算。3.3 在ADE XL里做噪声类型的对比仿真如果你要做的是“开1/f”和“关1/f”的对比ADE XL的corner和参数扫描功能很好用。可以定义一个参数比如flicker_on在模型卡里用条件语句控制noia是否为零然后跑两个corner对比。具体做法是在模型文件里写if (flicker_on 1) { parameters noia1e-20 noib1e-21 } else { parameters noia0 noib0 }然后在ADE XL里把flicker_on设成变量跑0和1两个点。这样你就能在同一张图上看到闪烁噪声对总噪声的贡献。注意这种方法需要你能编辑模型文件。如果是加密模型只能用后面讲的noiseless方法做近似对比。4. 用noiseless选项做噪声类型的排除法4.1 noiseless语句的语法和作用范围spectre提供了一个noiseless选项可以让你把指定器件或子电路的噪声关掉。语法大概是这样noise analysis outputvout inputvin noiselessinstance_name或者在网表里直接给器件加noise0属性。这个选项的作用是让仿真器在计算噪声时忽略这些器件的贡献但不会影响它们的直流工作点和小信号参数。这个功能在两种场景下特别有用一是你想确认某个器件的噪声贡献到底有多大。把它设为noiseless看总噪声下降多少差值就是它的贡献。二是你想模拟“如果这个器件是理想的电路噪声能降到多少”。比如把偏置电阻设为noiseless看总噪声能改善多少从而判断是否值得换更低噪声的偏置方案。4.2 用noiseless分离热噪声和闪烁噪声虽然noiseless不能直接按“噪声类型”来关但你可以结合模型参数来实现类似效果。比如你想单独看热噪声可以把所有MOS管的noia和noib临时设为0这样1/f噪声就没了剩下的就是热噪声和其他噪声。具体操作是在ADE里加一个参数扫描扫noia从0到正常值观察低频噪声的变化。如果noia0时低频噪声明显下降说明1/f贡献显著如果几乎没变化说明1/f不是主导。这个方法比直接改模型卡安全因为你可以随时恢复不会污染原始模型文件。4.3 noiseless和noise summary的配合使用跑完noiseless仿真后再看noise summary你会发现被设为noiseless的器件贡献变成了0。这时候剩下的贡献列表就是“排除该器件后的噪声构成”。通过多次排除你可以逐步定位到具体是哪一类噪声在主导。我一般会按这个顺序排查先看完整噪声结果记下总噪声在低频和高频的值。把所有电阻设为noiseless看总噪声变化。如果变化大说明电阻热噪声主导。把所有MOS管的noia设为0看低频噪声变化。如果变化大说明1/f主导。如果以上都不是检查是否有其他器件如BJT、二极管的噪声在贡献。这个流程走下来基本能锁定噪声类型然后再决定是否需要调整电路或工艺参数。5. 不同仿真器版本和模式下的噪声设置差异5.1 spectre和spectre X的噪声选项对比spectre X在噪声分析上做了一些优化最明显的是速度提升但在噪声类型的控制上基本沿用了spectre的框架。模型参数的控制方式一样noiseless选项也支持。区别在于spectre X对大规模电路的噪声分解做得更细noise summary的粒度可以到每个晶体管的每个噪声源。如果你用的是spectre X可以在分析选项里找到noiseout相关的设置控制输出噪声的详细程度。但“使能指定噪声类型”这件事还是得回到模型参数和noiseless选项上来。5.2 APS和加速模式对噪声精度的影响有些项目为了赶进度会开APS或者多线程加速这些模式在噪声分析上可能会引入近似。比如APS在默认设置下可能会简化某些器件的噪声计算导致1/f噪声的斜率不太准。如果你发现加速模式下噪声曲线和普通模式对不上建议关掉加速再跑一遍对比。我的经验是做噪声分析时尤其是低频1/f噪声尽量用普通精度模式不要开太激进的加速。噪声本身是小信号量数值精度要求高加速带来的近似误差可能比你想的大。5.3 不同工艺节点下的噪声模型差异先进工艺节点比如FinFET的噪声模型和平面工艺差别很大。FinFET的1/f噪声通常用更复杂的模型描述参数也更多。如果你从平面工艺转到FinFET不能简单套用之前的噪声设置得重新看模型卡里有哪些噪声参数被激活了。另外先进工艺里栅极漏电导致的噪声也可能被建模这部分在旧工艺里通常忽略。如果你发现总噪声比预期高可以查一下是否有额外的噪声源被打开了。6. 实际项目中噪声类型设置的踩坑记录6.1 模型卡参数默认值为零导致的误判前面提过有些简化模型或者移植模型里noia和noib默认是0。这种情况下你跑noise analysis低频噪声会异常平坦看起来像是一个“没有1/f噪声”的工艺。但实际上只是参数没给。我踩过的一个坑是用了一个从别的项目拷过来的模型文件跑LNA噪声仿真结果1/f噪声几乎为零当时还以为这个工艺的1/f特性特别好。后来和工艺厂确认发现模型卡里噪声参数被注释掉了。补上之后低频噪声直接上来了和实测对得上。所以每次拿到新模型第一件事就是检查噪声参数是否完整。可以在模型文件里搜noia、noib、noic这些关键词看有没有被注释或者设为零。6.2 noise summary里贡献为零的器件排查有时候noise summary里某个器件的贡献始终是0即使它明明应该产生噪声。可能的原因有该器件在噪声分析频段内没有电流流过或者工作在小信号零偏状态。模型里没有噪声参数或者参数被设为零。该器件被noiseless选项排除了。仿真器版本对该器件的噪声模型支持不完整。排查顺序建议从模型参数开始然后检查noiseless设置最后确认仿真器版本和工艺库的兼容性。6.3 温度设置对噪声类型的影响噪声和温度强相关。热噪声功率正比于温度1/f噪声的温度依赖性则取决于模型。如果你在27度下跑的噪声和-40度或125度下的结果会差很多。做corner仿真时温度是一个必须扫的变量。但要注意有些模型里1/f噪声的温度系数是单独建模的不是简单的正比关系。如果你发现低温下1/f噪声反而变大不要惊讶先查模型卡里的温度参数。6.4 噪声分析不收敛时的处理noise analysis本身是线性小信号分析一般不会不收敛。但如果你的电路在直流工作点求解时就不收敛noise analysis也会失败。这时候要先解决直流收敛问题再跑噪声。另外如果noise analysis的扫频范围设得太宽比如从0.001Hz开始可能会因为数值精度问题导致低频段结果异常。建议从1Hz或者10Hz开始扫除非你确实需要看更低频的噪声。7. 噪声类型使能的进阶技巧与验证方法7.1 用表达式分离不同噪声贡献在ADE的Results里你可以用计算器或者表达式来分离噪声贡献。比如sqrt(getData(out_noise^2 - out_noise_thermal^2))这个思路是先跑一次完整噪声再跑一次只含热噪声的通过设noia0然后做差值得到1/f噪声的贡献。虽然有点绕但在不能直接改模型的情况下很实用。7.2 用参数化模型做噪声类型的开关如果你能编辑模型文件最干净的做法是把噪声参数参数化。比如parameters flicker_enable1 model nmos bsim4 typen noia(flicker_enable ? 1e-20 : 0) ...这样你只需要在ADE里改flicker_enable的值就能控制1/f噪声是否参与计算。这种方法比手动改模型文件安全也方便做批量对比。7.3 验证噪声类型是否生效的三种方法跑完仿真后怎么确认你想要的噪声类型确实被使能了我一般用这三种方法交叉验证方法一看噪声曲线的斜率。如果低频段斜率接近-10dB/decade说明1/f噪声在主导如果斜率接近0dB/decade说明热噪声主导。方法二看noise summary的器件贡献。如果某个MOS管在低频段的贡献占比明显高于高频段说明它的1/f噪声被算进去了。方法三做温度扫描。热噪声随温度升高而增大1/f噪声的温度依赖性不同。如果升高温度后低频噪声变化不大而高频噪声明显增大说明1/f和热噪声的占比在变化。这三种方法结合起来基本能确认噪声类型设置是否正确。7.4 噪声类型设置对仿真时间的影响打开更多噪声类型会增加仿真时间但通常不是主要瓶颈。noise analysis本身是频域小信号分析计算量主要取决于频率点数和器件数量。1/f噪声的计算比热噪声稍微复杂一点因为涉及低频段的积分但整体影响有限。如果你发现打开1/f噪声后仿真时间大幅增加可能是频率点数设得太密或者扫频范围太宽。适当减少低频段的点数或者用对数扫描代替线性扫描能明显改善。8. 从噪声类型控制延伸到低噪声设计思路把噪声类型搞清楚之后下一步就是怎么用这些信息指导设计。比如你发现1/f噪声主导那就要考虑增大器件面积、调整偏置电流、或者换用PMOS输入对PMOS的1/f噪声通常比NMOS低。如果热噪声主导那就要优化gm、降低电阻值、或者调整工作点。这些设计决策都建立在“你知道当前噪声是什么类型在主导”的基础上。如果连噪声类型都没分清楚后面的优化就是盲人摸象。我在实际项目里的习惯是每版电路跑完噪声仿真先看noise summary确认主导噪声源和噪声类型然后再决定下一步优化方向。这个习惯帮我避免了很多无效的反复调参。提示做低噪声设计时不要只看总噪声曲线。一定要结合noise summary和噪声类型分析否则很容易在错误的方向上使劲。9. 常见问题速查问题现象可能原因排查方向低频噪声异常平坦1/f噪声未使能检查模型卡noia/noib参数noise summary某器件贡献为0器件无噪声模型或被noiseless检查模型参数和noiseless设置噪声结果和实测差很多噪声类型不匹配或模型不准对比不同噪声类型下的仿真结果加速模式下噪声曲线异常加速近似导致精度损失关掉加速重新跑低温下1/f噪声反而变大模型温度系数设置查模型卡温度相关参数noise analysis报错不收敛直流工作点问题先解决直流收敛这张表可以贴在工位上遇到问题时按顺序排查基本能覆盖大部分噪声类型相关的异常。10. 个人经验收尾噪声类型这件事说大不大说小不小。它不像电路拓扑那样显眼也不像版图那样直观但它直接决定了你的仿真结果可不可信。我见过太多人把噪声仿真当成一个“跑完就行”的步骤结果在流片后才发现噪声超标回头查仿真记录发现当初压根没开1/f噪声。我的建议是每次跑噪声分析之前花两分钟确认三件事——模型卡里噪声参数是否完整、noise analysis的输出节点和输入源是否正确、noise summary里有没有异常为零的贡献。这三件事确认完再跑仿真结果的可信度会高很多。另外如果你用的是共享工艺库或者从别人那里拷来的模型一定要自己跑一遍噪声仿真验证一下。不同项目对噪声参数的配置可能不一样直接拿来用很容易踩坑。自己验证一遍心里才有底。