前阵子调一个LC-VCO,输出频率大概5.4GHz,在Cadence ADE里用Spectre跑相位噪声仿真,第一次PSS跑完明明看波形挺正常,结果pnoise曲线出来一个巨大的尖峰,低频段直接上翘到不可信。排查了半天,最后发现是beat频率设置和tstab没配合好。这种坑,估计很多新手甚至工作一两年的工程师都踩过。
今天这篇文章就把Cadence ADE环境下VCO相位噪声仿真的完整流程掰开揉碎讲一遍。从testbench搭建、PSS参数设置、pnoise参数设置,到常见的报错和不收敛问题,全部结合我自己的实操经验来说。适合正在做模拟/RF IC设计、PLL方向的研究生,以及刚接触PLL设计的工程师参考。已经跑过很多次仿真的人,也可以重点看第5章的排查技巧,里面有几个问题我折腾了很久才搞明白。
1. 相位噪声仿真为什么绕不开Cadence ADE
1.1 相位噪声到底在“吵”什么
相位噪声是衡量振荡器频谱纯净度的核心指标。简单说,理想振荡器的频谱应该是一条单一谱线,只存在于振荡频率f0处。但实际电路里,电源噪声、器件热噪声、闪烁噪声会不断扰动振荡器的相位,使谱线两边出现一个连续噪声裙边。这个裙边用单边带噪声功率与载波功率的比值来度量,单位是dBc/Hz。
这个指标对系统的影响非常直接。接收机里,本振的相位噪声会把相邻信道信号混频到目标信道,降低灵敏度;发射机里,本振相噪又会在相邻信道产生干扰。对数字电路来说,相噪积分就是抖动,直接决定了时钟能否满足建立保持时间。你可以把相位噪声理解成一个时钟的“心跳稳定性”——心跳越不稳,整个系统越不敢在快节奏下工作。PLL设计里,VCO的带外相噪几乎决定了整个环路最终的带外噪声地板,所以把VCO的相噪仿准,是整个PLL设计的前置条件。
1.2 ADE、Spectre、PSS/Pnoise是啥关系
很多新人第一次打开Cadence会被这串名词绕晕。简单理一下:ADE(Analog 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 VCO,Harmonics设7到10;如果只是简单环形VCO,5也可以。
Maxac这个参数控制PSS里AC分析的频率上限,影响周期稳态解的精度。对高速振荡器,默认值可能不够,可以设成beat频率的20到50倍。比如5.4GHz的VCO,maxac设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 run,Noise Type选jitter,能输出cycle jitter之类的统计量。sampled模式一般用于开关电容电路、采样保持电路这类有离散采样特性的场景,不适合普通VCO,别选错。
第二个是Output。Pnoise的“output”指定你要观察的噪声电压或是电流。对VCO,通常是选节点电压,比如“vout_p”到地。用Moderate模式后,在输出结果里可以选择看Phase Noise(PM),也可以看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优值FoM:FoM = 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 jitter),Spectre会直接给出rms抖动值。此时仿真引擎会基于相位噪声模型做积分,比你自己从相噪曲线手工积分高效得多。
不过我要提醒一点,jitter模式仿真的时间尺度范围要合理。比如你要算一个PLL锁定后的总抖动,真正起作用的是PLL环路内的带宽,通常在几十kHz到几MHz之间,那pnoise的sweep range就该从这个范围往下覆盖,不要把从1mHz开始的超低偏移全部积分进去,否则结果会被振荡器近载波处极大的闪烁相位噪声主导,抖动数值虚高。具体的换算策略,每个团队都有自己的习惯做法,但至少要搞清楚你在为哪个系统指标服务。
5. 常见问题与排查技巧实录
这一章把我实际工作中遇到过的问题整理成速查表,同时也补充一些“书本上不会写”的调试思路。
5.1 直接可抄的排查表
| 现象 | 可能原因 | 处理方法 |
|---|---|---|
| PSS不收敛 | beat频率与实际振荡频率偏差过大 | 先用tran精确测量振荡频率,回填beat |
| PSS不收敛 | tstab不足,电路未进入稳态 | 增加tstab,观察tran波形稳定后再跑PSS |
| PSS不收敛 | 高阻节点/漏电通路缺失 | 检查偏置网络,增加直流路径 |
| PSS收敛但pnoise低频尖峰异常 | reference sideband、maxsideband设置不对 | 确认参考边带为1,maxsideband设7到15 |
| pnoise曲线平坦且偏低 | 计算边带数上限太小,噪声折叠不全 | 增大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基础上跑一个最简pnoise,sweep range只设10MHz到100MHz一个窄区间,观察中远区曲线是否平滑。分段验证可以快速定位问题是出在稳态解还是噪声积累。
第二个是“vctrl跨步扫描”法。VCO相噪经常受控于控制电压节点。你可以把vctrl从0.2V扫到1.0V,每步都跑一次pss+pnoise,然后画相噪随频率的变化。这样能看出相噪是否在整个调谐范围内保持均衡。做单点仿真的同学往往只测了中心频率一个点,结果流片后发现频率高端相噪恶化很多。但全扫一遍要花不少时间,建议先跑5个点,趋势出来了再细化。
第三个是用Ocean脚本批量跑。在ADE里手动点一百遍肯定痛苦。可以写一个简单的ocean脚本,例如用foreach循环遍历vctrl和corner,每次运行pss+pnoise,把关键频点读出来存成文件。这本质上也是工业界回归测试的雏形,对平时审查设计趋势、留档都很有用。
第四个是观察“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脚本,随电路版本一起提交。这样别人拿到你的设计时,能直接复现你的仿真结果,不用再去点几十个菜单。相信我,三个月后的你会感谢现在的你。