ARTICLE DETAIL

资讯详情

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

VCO相位噪声仿真实战:Cadence ADE中PSS与Pnoise设置指南

VCO相位噪声仿真实战:Cadence ADE中PSS与Pnoise设置指南 前阵子调一个LC-VCO输出频率大概5.4GHz在Cadence ADE里用Spectre跑相位噪声仿真第一次PSS跑完明明看波形挺正常结果pnoise曲线出来一个巨大的尖峰低频段直接上翘到不可信。排查了半天最后发现是beat频率设置和tstab没配合好。这种坑估计很多新手甚至工作一两年的工程师都踩过。今天这篇文章就把Cadence ADE环境下VCO相位噪声仿真的完整流程掰开揉碎讲一遍。从testbench搭建、PSS参数设置、pnoise参数设置到常见的报错和不收敛问题全部结合我自己的实操经验来说。适合正在做模拟/RF IC设计、PLL方向的研究生以及刚接触PLL设计的工程师参考。已经跑过很多次仿真的人也可以重点看第5章的排查技巧里面有几个问题我折腾了很久才搞明白。1. 相位噪声仿真为什么绕不开Cadence ADE1.1 相位噪声到底在“吵”什么相位噪声是衡量振荡器频谱纯净度的核心指标。简单说理想振荡器的频谱应该是一条单一谱线只存在于振荡频率f0处。但实际电路里电源噪声、器件热噪声、闪烁噪声会不断扰动振荡器的相位使谱线两边出现一个连续噪声裙边。这个裙边用单边带噪声功率与载波功率的比值来度量单位是dBc/Hz。这个指标对系统的影响非常直接。接收机里本振的相位噪声会把相邻信道信号混频到目标信道降低灵敏度发射机里本振相噪又会在相邻信道产生干扰。对数字电路来说相噪积分就是抖动直接决定了时钟能否满足建立保持时间。你可以把相位噪声理解成一个时钟的“心跳稳定性”——心跳越不稳整个系统越不敢在快节奏下工作。PLL设计里VCO的带外相噪几乎决定了整个环路最终的带外噪声地板所以把VCO的相噪仿准是整个PLL设计的前置条件。1.2 ADE、Spectre、PSS/Pnoise是啥关系很多新人第一次打开Cadence会被这串名词绕晕。简单理一下ADEAnalog Design Environment是Cadence的模拟设计仿真环境里面可以配置仿真器、设置工艺角、跑各种分析、查看波形。Spectre是底层仿真器真正干活的引擎。PSS和Pnoise则是Spectre支持的两种分析类型专门用来处理周期性稳态电路和周期性噪声。有人可能会问VCO相噪能不能用瞬态仿真加FFT来算能但精度和效率都很差。振荡器本质是个自激非线性电路需要长时间瞬态才能到达稳态而且噪声源激励属于随机信号瞬态仿真里要叠加噪声源跑很长时间才能统计出可靠的谱密度工程上不现实。相比之下PSS会直接求解电路在一个周期内的稳态工作点再把噪声作为小信号扰动在周期工作点附近线性化最后通过Pnoise输出相位噪声谱速度和精度都更合适。ADS里的谐波平衡法本质也是这个思路只是算法实现不同。Cadence ADE Spectre这套流程在模拟/RF IC设计领域最普及PDK支持也最完善所以我这篇只围绕这个组合来讲。2. 仿真前的准备工作电路与ADE环境2.1 Testbench搭建细节很多人在testbench上不够较真导致后面仿真结果偏差很大。我的习惯是VCO的core电路单独放到一个cell里再建一个专门的testbench cell来做仿真实例。这样便于切换不同架构对比也更贴合毕业后去公司里看到的模块化设计习惯。testbench里需要准备这4样东西电源一般用理想电压源vdc电压按工艺要求给比如1.2V或0.8V。控制电压vctrl如果做频率调谐曲线扫描可以用dc源加变量比如设成0.6V再通过ADE里的design variable做参数扫描。输出探测点在振荡器输出节点接一个高阻探针或者直接命名节点比如vout_p、vout_n。注意不要直接跨接在谐振电感两端去测因为电感两端会有很大的开关电压摆幅探针的寄生电容会影响振荡频率。连接好之后先跑一个tran瞬态仿真时间长度看你电路起振快慢一般设500ns到2us。观察两个点一是波形能否起振并稳定二是记录稳态振荡频率。这个频率非常重要因为后面PSS的beat频率就建立在它上面。我见过有人直接按设计目标频率设PSS但电路实际振荡频率偏差了20%导致PSS完全跑不收敛或者结果异常。所以先跑tran锁定真实振荡频率是个成本极低但收益极大的习惯。另外一点别忘了加载正确的model library。如果PDK/工艺库有spectre模型就用spectre版本的model file不要用hspice版本顶替。不同模型语法细节有差异在PSS高频求稳态时更容易暴露兼容性问题。2.2 ADE环境设置与仿真器选择进入ADE之后第一步是确认仿真器选择的是spectre而不是ams或别的混合模式仿真器。当然对于纯模拟VCO来说这几乎不会选错但如果你习惯在一个统一的仿真界面里操作还是检查一下。紧接着把工艺角确定下来。建议所有corner都提前写在变量里或者用ADE XL管理不要在单个ADE L窗口里手动改一堆参数。如果是跑单点验证直接设一个tt/典型工艺角、25度或27度温度就行。后续做完整验证时再用ADE XL扫ss/ff/sf/fs角。实际上VCO相噪在整个温度范围内变化很大尤其是高温下热噪声明显变大而低温下达到同样的输出摆幅可能更费电流这一点后面会再提到。我还要提醒一个小习惯先关掉所有显示无关结果的plot开关只保留pss和pnoise的traces否则ADE会输出一堆中间变量看着心烦。尤其pss在求解稳态时会有很多线性方程的虚拟节点全部plot出来会占用大量内存而且拖慢下一次仿真。3. PSS分析先算出稳定振荡的“工作点”PSS的目标是找到电路在周期激励下的稳态解。对VCO来说这个“周期激励”其实就是自激振荡本身所以PSS要把电路的周期T作为未知量之一去求解在Spectre里叫shooting method把每个周期的端点状态和周期初始状态做一个一致性约束。因此PSS跑得准不准、快不快多半取决于你对下面几个参数的理解。3.1 Beat频率怎么定首先最关键的是beat频率也就是期望电路稳态振荡的频率。对自由振荡的VCO直接设为预设计算频率比如5.4GHz。但如前所述必须先通过tran确认实际振荡频率再回来精确填写。假设tran里看波形算出振荡周期大约是185.18ps那beat频率就是5.400GHz。这里会有个选择填5.4G还是填实际测出来的5.398G我的经验是填一个与仿真预估更一致的频率让PSS在求解时更容易收敛。因为PSS会自适应微调周期但初始给的beat如果离真实值太远求解器要在每一步修正周期非线性方程的迭代次数会急剧增加甚至不收敛。还有一个常见的坑有人把beat设成了PLL参考频率或者一个过低的频率想“从谐波里看振荡”。这对VCO是行不通的PSS默认求的就是基波周期稳态你给它一个错误的周期假设谐波噪声折叠计算全部会错。所以务必确认beat频率等于VCO的振荡频率而不是输入控制信号的频率。Tstab同样重要。它表示在进入周期性稳态计算之前先做多长时间的瞬态让电路稳定下来。LC-VCO的起振时间通常取决于负阻和负载Q值低Q、强负阻起振快高Q、弱起振慢。一般设几百纳秒到几微秒。判断标准是tran波形在tstab之前已经进入稳定的等幅振荡不能在tstab结束那一刻还在起振爬坡。我用一个5GHz LC VCO时Q大概十几设1us的tstab基本稳定如果设300ns有时也能收敛但pnoise低频点会略微异常。宁可稍微多设一点仿真时间增加几十秒换来结果可信完全值得。3.2 Harmonics、maxac与精度设置PSS的Harmonics表示你关心的最高谐波次数。默认可能是3但对于VCO至少要设到5到10。原因在于振荡器工作在强非线性状态输出波形含有丰富的高次谐波PSS要把这些谐波都参与迭代计算才能准确重建周期稳态。谐波次数设少了稳态解本身有偏差Pnoise在折叠噪声边带时也会漏掉高次项的贡献导致相噪低估。当然也别设到几十计算量会暴涨。我做5GHz级LC VCOHarmonics设7到10如果只是简单环形VCO5也可以。Maxac这个参数控制PSS里AC分析的频率上限影响周期稳态解的精度。对高速振荡器默认值可能不够可以设成beat频率的20到50倍。比如5.4GHz的VCOmaxac设100G以上比较稳妥。它的作用是让波形的高频分量和混叠效应在内部AC线性化时能被充分描述低了容易出现“看起来收敛但谐波振幅不对”的情况。精度方面errpreset参数建议从moderate起步不要一上来就conservative。我见过很多新人把精度直接拉到conservative结果PSS跑了一个通宵还没完。相噪仿真对误差的敏感度没有那么夸张moderate精度配合合理的maxac往往足够。只有在最终sign-off或要报告数值时再开conservative复跑一次。3.3 PSS收敛判断与常见处理怎么判断PSS收敛且正确最简单的方法是看输出节点的稳态波形和tran一致频率差在千分之一以内幅度差在百分之几以内。另一个办法是检查PSS求解后的输出变量里是否有“pss.steady”相关节点有时求解器会给出周期时间和谐波幅度跟预期对比即可。不收敛是PSS最常见的崩溃方式通常报错形式是“Newton iterations fail to converge”之类。我的排查顺序如下先检查beat频率和目标振荡频率差多少。差得远PSS必然难收敛改成实际频率再看。再看tstab够不够长。把PSS先拆成tran跑观察恒定振幅建立时间tstab至少要超过这个时间。如果电路本身起振非常缓慢可以适度加大负阻管尺寸或初始条件给PSS一个更好的起点。检查是否有高阻节点或缺少直流直流通路振荡器里有些直流偏置点没建立会导致稳态求解时矩阵奇异。适当放宽iabstol和reltol但注意别太宽否则结果全错。一般设成1e-6到1e-8量级。我踩过的一个坑是某次PSS看起来收敛了波形也正常但pnoise低频曲线呈一个诡异的尖峰后来发现设的beat和实际振荡频率差了0.3%PSS求解器强行收敛到了一个近似解上结果用pnoise做小信号线性化时参考频率就错了。所以务必把beat频率校准到实际频率不要想当然用理论值。4. Pnoise分析提取相位噪声曲线PSS跑通只是第一步真正的相噪曲线要靠Pnoise分析来出。很多人PSS跑得挺好反而在Pnoise参数上犯迷糊最后得到一条看似平滑但完全不可信的曲线。4.1 Pnoise关键参数逐条设置在ADE里选择pnoise分析常见几个关键选项逐一过一遍。第一个是Noise Type。Spectre里有moderate、jitter、sampled等选项。对VCO相噪仿真默认使用moderate模式它会在射频载波附近计算噪声边带同时分离幅度噪声和相位噪声。如果之后想直接看时钟抖动可以再加一个pnoise runNoise Type选jitter能输出cycle jitter之类的统计量。sampled模式一般用于开关电容电路、采样保持电路这类有离散采样特性的场景不适合普通VCO别选错。第二个是Output。Pnoise的“output”指定你要观察的噪声电压或是电流。对VCO通常是选节点电压比如“vout_p”到地。用Moderate模式后在输出结果里可以选择看Phase NoisePM也可以看AM noise。相噪曲线默认就是Phase Noise单位dBc/Hz。第三个是Sweep Type和Sweep Range。最常用的是Relative也就是横轴表示相对载波的频率偏移。典型扫描范围从1kHz或10kHz开始到几百MHz结束。如果只想快速验证可以先把范围缩小到10k到10M跑通后再放开。第四个是Reference Sideband。这个参数决定噪声以哪一次谐波作为参考边带去计算相位噪声。对普通VCO我们关心的是基波附近的噪声所以设为1即可。如果你有特殊需求要看二次谐波附近的相噪再改成2。第五个是Maximum Sidebands。它控制在计算噪声混叠时最多考虑多少个上下边带。默认值在不同版本可能不同但工程上建议手设为7到15。因为振荡器工作在强非线性状态每个谐波附近的噪声都会折叠到载波附近来边带数太少会让相噪曲线在较大offset处偏低。代价是仿真时间增加尤其当Resources不够时。先用7估算如果发现曲线在中远区偏移处有明显不连续再往上加。最后一个容易忽略的选项是“Include All Noise Sources”默认是yes我建议保持开启。虽然跑得慢一点但它会给出每个器件对总相噪的贡献占比对后续优化非常有价值。比如你会看到某个偏置管贡献最大那就可以针对它调尺寸、加滤波电容。4.2 看曲线、读数据跑完pnoise之后在Results窗口打开Phase Noise曲线横轴是offset frequency纵轴是dBc/Hz。典型LC-VCO相噪曲线分三段近载波区低offset频率斜率接近-30dB/dec由闪烁噪声和AM-PM转换主导中间区斜率-20dB/dec对应器件热/散粒噪声通过非线性混频上变频形成远端平坦区则是本底噪声平台受后端buffer和测量设备地板限制。看曲线时不要只盯着某个频点要整体看斜率是否合理。如果低频段斜率比-30dB/dec还陡说明可能有频率牵引或者瞬态泄漏的伪迹检查reference sideband、maxsideband和tstab。如果中频段斜率明显偏平说明可能有额外的白噪声路径或寄生振荡检查是不是有器件进入线性区太深或者电源上叠加了latch-up之类的问题。用曲线还可以快速评估VCO优值FoMFoM L(fm) - 20log10(f0/fm) 10log10(Pdc/1mW)。比如相噪在1MHz offset处为-110dBc/Hz中心频率5GHz功耗5mW那么FoM -110 - 20log10(5000) 10log10(5) ≈ -110 - 74 7 -177dBc/Hz。这是一个不错的水平。建议把每个PVT角点的FoM记录下来设计迭代时用同一个公式来对比比单纯比相噪更公平。4.3 从相位噪声到抖动有些场景你最终需要的是抖动而不是相噪。Pnoise可以换个方式看把Noise Type切到jitter模式设置输出为周期抖动cycle jitter或者周期到周期抖动cycle-to-cycle jitterSpectre会直接给出rms抖动值。此时仿真引擎会基于相位噪声模型做积分比你自己从相噪曲线手工积分高效得多。不过我要提醒一点jitter模式仿真的时间尺度范围要合理。比如你要算一个PLL锁定后的总抖动真正起作用的是PLL环路内的带宽通常在几十kHz到几MHz之间那pnoise的sweep range就该从这个范围往下覆盖不要把从1mHz开始的超低偏移全部积分进去否则结果会被振荡器近载波处极大的闪烁相位噪声主导抖动数值虚高。具体的换算策略每个团队都有自己的习惯做法但至少要搞清楚你在为哪个系统指标服务。5. 常见问题与排查技巧实录这一章把我实际工作中遇到过的问题整理成速查表同时也补充一些“书本上不会写”的调试思路。5.1 直接可抄的排查表现象可能原因处理方法PSS不收敛beat频率与实际振荡频率偏差过大先用tran精确测量振荡频率回填beatPSS不收敛tstab不足电路未进入稳态增加tstab观察tran波形稳定后再跑PSSPSS不收敛高阻节点/漏电通路缺失检查偏置网络增加直流路径PSS收敛但pnoise低频尖峰异常reference sideband、maxsideband设置不对确认参考边带为1maxsideband设7到15pnoise曲线平坦且偏低计算边带数上限太小噪声折叠不全增大Maximum Sidebands后重跑pnoise结果与实测偏差大buffer噪声贡献大输出节点选错将输出探测点放在VCO core输出而非buffer后相噪曲线在远偏频处“翘尾”可能有寄生振荡或电路不稳定检查环路增益、harmonics设置是否足够jitter模式跑出来的值异常大sweep range包含过低频段噪声收窄sweep range到系统关心的带宽内这张表我写的过程里有好几条都是自己实际踩过的。尤其是输出节点选错这件事最初做测试时把pnoise的output直接挂在buffer输出端结果buffer的白噪声压过了core的相噪整条曲线像被罩了一层纱。后来把output改到core输出节点采用高阻探针重新跑曲线就正常了。别看这个细节小它直接影响你有没有在优化VCO core还是buffer。5.2 几个亲测有效的“土办法”除了标准的参数调整我再分享几个我比较依赖的排查口。第一个是“分段验证”法。如果你发现pnoise结果不对劲不要急着调整个pnoise参数先做两层检查第一层只跑PSS看稳态波形、频率、输出谐波幅度是否正常第二层在PSS基础上跑一个最简pnoisesweep range只设10MHz到100MHz一个窄区间观察中远区曲线是否平滑。分段验证可以快速定位问题是出在稳态解还是噪声积累。第二个是“vctrl跨步扫描”法。VCO相噪经常受控于控制电压节点。你可以把vctrl从0.2V扫到1.0V每步都跑一次psspnoise然后画相噪随频率的变化。这样能看出相噪是否在整个调谐范围内保持均衡。做单点仿真的同学往往只测了中心频率一个点结果流片后发现频率高端相噪恶化很多。但全扫一遍要花不少时间建议先跑5个点趋势出来了再细化。第三个是用Ocean脚本批量跑。在ADE里手动点一百遍肯定痛苦。可以写一个简单的ocean脚本例如用foreach循环遍历vctrl和corner每次运行psspnoise把关键频点读出来存成文件。这本质上也是工业界回归测试的雏形对平时审查设计趋势、留档都很有用。第四个是观察“all noise contributions”报告。Pnoise每个run都会生成每个器件对输出噪声的贡献分解。我最常干的事是通过这个报告找到排在贡献榜第一的器件然后问自己一句“为什么它贡献最大”再决定要不要去修它。用这个思路调VCO比盲目改尾电流管尺寸高效得多。6. 写在最后的经验如果非要用一句话总结这套流程我会说VCO相位噪声仿真的上限不在Cadence软件本身而在你设置PSS和Pnoise时对电路稳态本质的理解程度。很多看似“玄学”的不收敛、结果异常最后往回查基本都落在beat频率、tstab、输出节点、maxsideband这类看似基础但极易被忽略的参数上。我自己经历的一个小经验是实际流片回来测到的VCO相噪在近载波低频段通常比仿真会差一些这主要是1/f噪声模型在工艺库里的偏差和电源耦合效应导致的但在远偏频的热噪声区仿真和实测往往对得很好。所以如果你在仿真阶段就把热噪声基底压得很低流片后通常不会太翻车真正让人头疼的往往是闪烁噪声偏大。后续要从这个流程往下扩展的话还可以继续讲PLL闭环相噪仿真、和Noise Analysis里Periodic S-parameter的结合、以及毫米波频段下寄生提取对仿真精度的影响。不过那些话题每个都够再开一篇长的。这篇就先帮你在VCO相位噪声仿真这条路上把路铺平少走几步我当年走过的弯路。最后再分享一个实操习惯每次改完电路之后我习惯把PSS和Pnoise的设置存成一个独立的ocean脚本随电路版本一起提交。这样别人拿到你的设计时能直接复现你的仿真结果不用再去点几十个菜单。相信我三个月后的你会感谢现在的你。
返回列表