首页 / 资讯中心 / 文章详情

PLL相位噪声仿真实战:HBnoise配置与结果解读

PLL相位噪声仿真实战:HBnoise配置与结果解读 ★ FEATURED ARTICLE
搞射频或者模拟的同学应该都有体会PLL的相位噪声仿真在流片之前是最容易让人焦虑的一环。尤其是锁相环这种带反馈、带硬开关分频器、还必须在频域看噪声指标的模块直接用SPICE跑瞬态再做FFT那分辨率跟仿真时长基本能把人折磨疯。后来在Cadence Virtuoso里面把HBnoise这套流程跑通之后我才算真正把PLL的相噪分析从“玄学”变成了可量化、可拆解的工程活。这篇文章我就以实际项目中常见的整数分频PLL为例从原理选型、仿真搭建、HBnoise配置到结果怎么读、抖动怎么算再到我踩过的那些坑完整讲一遍。适合正在做PLL、或者刚接手别人PLL需要快速上手验证的工程师实验室里跑过Cadence但不知道HBnoise怎么用的朋友尤其适用。1. 为什么PLL相位噪声仿真首选HBnoise1.1 PLL相噪构成和HBnoise的定位PLL的输出相位噪声不是单一模块决定的。参考时钟的相噪会被环路低通整型VCO相噪被高通整型PFD/CP和分频器的噪声则在一个带内平坦的区域共同贡献。你要在一个仿真里把这几路噪声都算准而且要能看到每个模块对输出相噪的单独贡献这就不是普通tran仿真能干的活了。HBnoise全称是Harmonic Balance Noise在Cadence Spectre RF里做的事情是先在频域上求一个大信号周期稳态工作点HB然后在这个工作点上做线性周期时变小信号噪声分析。它跟PSSPnoise思路类似但关键区别在于稳态工作点是通过谐波平衡求出的不是时域积分推到稳态再采周期点。对PLL这种包含强非线性开关电路PFD、CP、分频器和振荡器VCO的系统HB比PSS更容易收敛尤其是分频器这种切得干干净净的方波HB天然适合处理。还要注意这里的HBnoise不是跑一个open loop的噪声仿真而是在闭环PLL工作状态下把整个环路的噪声传递特性都算进去。也就是说参考源噪声经过低通、VCO噪声经过高通、CP/分频器噪声以带通形式出现在输出端这些整型效果会直接体现在HBnoise的曲线里。1.2 为什么不用PSSPnoise一条路走到黑很多兄弟一开始会用PSSPnoise仿真VCO的相噪这没问题VCO本身是自治振荡器PSS配合Pnoise能给出开环相噪。但整个PLL闭环之后再用PSS去推你会发现收敛难度陡增。尤其是环路里有分频器和PFD这种大信号开关行为PSS的Newton迭代很容易在分频沿附近发散或者要非常多的beat周期才能达到收敛精度。而且PSSPnoise通常只能做“单频点、周期恒定”的小信号分析。PLL的PFD输入比较频率跟你VCO输出频率差一个整数分频比如果VCO是两个频点输出正交I/Q你还要处理多音情况。HB对多音信号处理是有天然优势的可以设置多个fundamental频率比如参考频率和VCO频率虽然实际用的时候大多数是单beat频率但那种需要同时看整数边界和分谐波噪声的场景HB就比PSS舒服得多。1.3 HBnoise能拿到什么跑一次HBnoise可以获得三类关键数据输出节点比如VCO输出、分频器输出或者最终测试点的相位噪声谱密度单位通常是dBc/Hzoffset frequency各个噪声源每个晶体管、每个模块实例或者某个端口注入噪声对输出相噪的单独贡献曲线对相位噪声谱进行积分折算得到的RMS抖动或者相位误差。这三样东西凑齐你就能把一个PLL的噪声表现从“指标有没有过”推进到“到底是哪个模块拖了后腿”的定位层面。2. 仿真环境和前期准备2.1 PLL网表和模块划分HBnoise仿真对网表结构要求不高但为了后续能单独看每个模块的噪声贡献强烈建议在原理图或网表里把PLL分成明确的subcell参考源REF可以是理想源加noise model也可以是实际晶体振荡器load modelPFD鉴频鉴相器CP电荷泵Loop Filter环路滤波器R/C网络VCO含调谐端口和振荡核心Divider分频器。我自己习惯把PFD、CP和分频器都用晶体管级因为HB能啃得动这样噪声贡献看得更真实。Loop Filter用理想R/C即可因为无源器件的热噪声本身可以通过设置电阻噪声来体现。网表组织好之后在Virtuoso里建一个testbench顶层比如pll_tb里面放上PLL模块、负载电容和必要的激励源。注意输出负载不要悬空尤其是VCO输出到测试点之间建议加一个理想buffer或至少一个高阻节点用来提相噪不然HBnoise算出来的功率会因为节点阻抗异常而虚高。2.2 激励与初始条件设置PLL的参考源激励要设置成与实际频率一致的周期信号比如10MHz。初始条件上有两个重点VCO控制端电压的初始值尽量接近最终锁定值这能让HB收敛快很多。可以先跑一个快速tran看到锁定电压大概在多少比如0.8V然后投到HB的初始条件里分频器状态建议全部初始化到一个确定状态避免HB在起振沿上反复试。HB是个求稳态解的过程它不关心你的PLL怎么从失锁回到锁定只关心最终稳定周期解。所以给一个“接近稳态”的初始猜测是加速收敛的重要手段。2.3 HB分析设置的关键参数在ADE XL或者ADE L里选择aha或者spectre RF的hb analysis需要设置以下参数Beat Frequency优先选PLL的参考比较频率也就是PFD输入频率fref。千万别想当然选VCO输出频率。HB的fundamental决定所有谐波的基点选fref之后VCO频率自然落在N次谐波上N为分频比这样分频器、PFD的开关行为才能正确被捕捉。Number of Harmonics / Max Harmonics这个是最影响内存和收敛的选项。原则上要覆盖到VCO振荡频率比如VCO2.4GHzfref10MHz分频比N240那至少需要240阶谐波。实际跑的时候我会设置到256或320留一点余量给噪声边带。如果你还要看谐波附近的底噪可能得更高。求解精度errpreset建议先用moderate跑通流程再用conservative精确收敛。别一上来就conservativeHB迭代慢不说还容易因为精度太高反而难收敛。2.4 HB分析的收敛手段HB不收敛是常态我不止一次被卡在“failed to converge”上。最常见的三板斧增加tstab瞬态稳定时间。HB本身在Cadence里可以搭配tstab设置先跑一段瞬态让电路“预热”到接近稳态然后才启动HB迭代。PLL这种环路收敛较慢的系统tstab可能要设置到几十个参考周期甚至上百个。比如fref10MHztstab至少给5us到10us。放宽errpreset从conservative降到moderate先把解找到再去看有没有警告最后再用conservative复验关键指标。给谐波加窗或截断。比如有些版本里可以设置harmonics order的扫描范围从一个较小的maxharm开始跑通之后再逐步提高。3. HBnoise的具体配置与实施细节3.1 新建hbnoise分析在Cadence的Analysis窗口里当hb分析存在或同时设置时可以添加一个hbnoise分析。hbnoise依赖之前的hb稳态解所以两者必须共用一个design和corner。hbnoise设置面板里核心选项有这么几项Sweep Type一般用Absolute从某个低偏频比如1Hz或10Hz扫到最大偏频比如100MHz或fref/2。用Relative的话在某些情况下更省点但我习惯Absolute直观看曲线。最大偏频不是越大越好超过一定频率后相位噪声曲线会被噪声底淹没而且仿真点太多拖慢速度。Noise Type选time-varying或LPTV建议用LPTVLinear Periodically Time-Varying以正确反映PLL内部噪声的周期调制特性。输出变量一般是选择输出节点的电压在Phase Noise Output栏里选“SSB Phase Noise”或者“Phase Noise (dBc/Hz)”。有些版本需要你选一个“modulated signal”并且指定载波频率是多少。载波频率要填VCO实际输出频率不是fref。输入参考源这里可以指定参考源作为噪声输入或者让所有device噪声都参与。3.2 噪声源的处理和参考源噪声注入HBnoise默认会把网表里所有器件的噪声源都带上MOS管的热噪声、闪烁噪声、电阻热噪声等。如果你用的是理想电压源作为参考时钟这个源本身是没有噪声的那整体相噪曲线会偏低测不到“参考源主导”的频段。如果你想看到真实的带内相噪可以给参考源串一个噪声模型或者用Cadence的verilog-A/AHDL噪声源加上相位噪声。做法是在参考源旁边加一个noise source比如noise voltage source射入白噪声和闪烁噪声幅度参考实际参考时钟的相噪指标比如-150dBc/Hz 1MHz之类的。还有一种办法把参考源的jitter模型建在PFD输入前端。比如用一个带噪声的电压源串联在参考时钟通路上噪声谱密度按需要的相位噪声折算成等效输入电压噪声。这样HBnoise跑出来能直接看到参考时钟噪声沿环路到输出的传递。3.3 分频器噪声与噪声折叠问题分频器是数字逻辑电路噪声主要来自那几个反相器/触发器的开关切换时刻的抖动。HB处理这种电路的时候要注意maxsidebands默认值可能不够。HBnoise计算在每一个输出偏频点的时候会最多考虑maxsidebands个边带对输出噪声的贡献。对PLL来说分频器开关噪声会在多个谐波上被折叠到低频段所以如果maxsidebands设成0或1你会漏掉大量从高频振铃和边带折叠回来的噪声导致结果不准。实际操作中如果扫频点数多、maxsidebands又给得高仿真时间会指数上升。折中方案是先用maxsidebands3跑全频段确定整体形状没问题再把感兴趣的带宽附近用更高边带细化跑一遍。3.4 输出节点选取和相位噪声提取HBnoise结果里你会看到几种数据电压噪声谱V²/Hz功率谱和相位噪声dBc/Hz。对PLL来说看相位噪声就够了。注意选节点的时候最好选VCO输出经过分频器之前的高频节点比如VCO直接输出这样表示的是VCO频率下的相位噪声如果你想看反馈分频器输出的噪声贡献也可以同时提取那个节点的相噪。这里有个容易搞混的地方VCO输出2.4GHz你测到的phase noise是2.4GHz载波的相噪分频器输出24MHz节点的相噪却是以24MHz为载波的两者不能直接拿同一条归一化曲线比较。但因为PLL闭环情况下分频器输出相噪等效到VCO输出要乘20log(N)所以你看到的分频器相噪曲线要先加上这个分贝值再和VCO输出相噪曲线对比。3.5 一个实际PLL HBnoise设置示例用一个2.4GHz整数分频PLL举例fref10MHzN240环路带宽目标100kHz左右电荷泵电流1mA分频器用真实CMOS逻辑。我的设置会是参数设置值HB Beat Frequency10MHzMax Harmonics320tstab5userrpresetmoderatehbnoise sweep typeabsoluteStart frequency10HzStop frequency50MHzNumber of points50或log distributionMaxSidebands3OutputVCO输出节点Phase Noise Reference2.4GHz载波这套设置在16核服务器上大概跑20到40分钟具体看网表复杂度。如果只保留少数关键模块的晶体管级其他用verilog-A行为模型替代能压到5分钟内。4. 结果解读与关键指标提取4.1 读懂相位噪声曲线的三段特征跑完hbnoise之后在Direct Plot里选phase noise会看到一条典型PLL相噪曲线。通常能看出三个区域带内平坦区低偏频偏频低于环路带宽时输出相噪主要由参考源、PFD/CP、分频器贡献曲线相对平坦斜率为0或很缓。如果这条线偏高八成是PFD/CP噪声太大或者参考源噪声没压住。带宽附近尖峰环路相位裕度越差峰值越高。这个峰对应阻尼系数一般来说峰高超过5到8dB说明环路稳定性有隐患。HBnoise频域结果能看到这个峰但具体相位裕度要另外用stb仿真验证。带外VCO相噪区偏频高于环路带宽时VCO相噪主导曲线呈-20dBc/Hz每十倍频理想LC-VCO热噪声或者带闪烁噪声转折。如果这里曲线出现隆起或者异常斜率往往是有寄生耦合或者VCO工作在非最佳偏置点。4.2 各模块噪声贡献怎么看HBnoise最值钱的功能就是噪声贡献分析。在Cadence ADE里跑完hbnoise后可以用“Results → Direct Plot → Main Form”在noise contribution选项里选择contributions就能看到每个instance/device对输出相噪的贡献量以及相角。注意噪声贡献是矢量叠加有的模块贡献可能是负的代表它与另一路噪声相消。这时候不要慌PLL里某些噪声通过负反馈确实会出现部分抵消尤其是分频器噪声和PFDCP噪声在某些频段会有相位关系导致的降幅。但如果你看到整个带宽内主要贡献模块在反复正负交替那大概率是仿真设置里的边带数不够或者收敛点有问题不能全信。我自己查看贡献曲线时习惯分别提取三个频点带内100Hz看参考/CP/分频器贡献、环路带宽附近1MHz看稳定性和噪声峰值来源、带外10MHz看VCO自身相噪。这三个频点就能快速定位短板。4.3 从相位噪声积分到RMS抖动很多PLL规格不写相噪曲线只写RMS jitter比如1ps RMS积分从1kHz到100MHz。拿到HBnoise的相噪曲线L(f)单边带RMS抖动可以按下面积分算$$J_{rms} \frac{1}{2\pi f_{out}} \sqrt{2 \int_{f_1}^{f_2} L(f) , df}$$这里涉及dBc/Hz转线性再积分的操作。在Cadence里可以直接用计算器函数phaseNoise或jitter函数也可以导出曲线到Matlab里自己算。我个人更倾向于导出后用脚本算因为能顺便看每个频段的贡献占比。实际算的时候积分下限最好比“测量窗口倒数”还低不然会低估长期抖动积分上限高到噪声底和仪器带宽极限即可一般取fref/2或100MHz。4.4 验证结果的交叉检查HBnoise结果不是测完就行最好能用tran仿真交叉验证一下锁定时间和最终稳态输出频率。一个常见现象是HB跑出来的稳态频率和tran锁定到的频率差几十ppm这会导致带外VCO相噪在远偏频处出现一个细小的尖刺实质上是HB没有完全解到基频准确的周期解。这个误差对带内相噪影响小但看带外远偏频时可能干扰判断。遇到这种情况可以在HB的options里把“oscillator”相关项打开如果是HB oscillator分析或者提高maxharm和收敛精度重新跑一次。5. 常见问题与排查技巧实录5.1 hbnoise报错、不收敛怎么处理最常遇到的就是“hb failed to converge”。我的处理顺序是看tstab是否足够。PLL时间常数跟环路带宽相关100kHz带宽对应时间常数1.6us左右那tstab至少要3到5个时间常数才能接近稳态我很多时候直接给10us。降低errpreset到moderate把harmonics从320降到256先求一个粗糙解。把CP和PFD的理想化程度提高比如给switching管加一点realistic的导通电阻但不要加太小的vth避免出现硬切换。实在不行就用“hb init”的方式先用hb跑一个粗略解再拿这个解初始化另一个更精细的hb。5.2 曲线在低频端翘起来或者出现异常平底低频端如果出现一条平坦的底噪一般是数值噪声或收敛精度不够。真正的闪烁噪声在低频端应该持续上升-30dB/dec或类似斜率如果出现水平段先把谐波数和maxsidebands提上去再确认一下是不是有某个理想源没有设置噪声但是算法硬加了一个floor noise。一个隐蔽的原因是给CP的电流源用的理想电流源而不是实际MOS管电流镜理想电流源在HBnoise里可能没有1/f噪声源导致低频频段“特别干净”低到不合理。这种情况下的低频相噪曲线就不具备参考意义至少要给CP的尾电流管加一个flicker noise模型。5.3 仿真速度慢到不可接受HB本来就是个吃内存的活。如果仿真时间实在压不下来我的做法是分级降复杂度第一级只有VCO是晶体管级PFD/CP/Divider用verilog-A行为级跑一遍HBnoise看整体趋势第二级把CP和PFD替换成晶体管级重点看带内低频噪声第三级全部晶体管级跑最终确认。这种多级方案既能保证方向正确又不至于在探索阶段浪费一整天等仿真。问题可能原因建议措施HB不收敛tstab不够、谐波数不足、初始条件差增大tstab降errpreset给初始控制电压噪声曲线低频平底理想源无闪烁噪声、收敛精度不足换成MOS管电流源提高maxsidebands带外有尖刺HB基频没解准开启oscillator option提高max后续谐波噪声贡献分解异常边带折叠数量不足增大maxsidebands重跑带宽附近频段仿真过慢谐波数过高、器件级数多模块分级跑、恢复精度、选择性用行为级5.4 关于相位噪声和抖动的最后检查最终报告里需要给出输出频率、参考频率、环路带宽、带内相噪、带外相噪以及积分抖动。如果HBnoise给出的带内相噪比实际测试结果低了一大截先别怀疑仿真不对大概率是参考源噪声、CP上电流源闪烁噪声和PFD死区引入的噪声没建模充分。另外PFD死区会引入额外噪声这在HBnoise里很难直接体现因为死区是一种非线性残余效应。我在流片前会用后仿跑一个纯PFD/CP的Pnoise再结合HBnoise的结果做经验补偿。这样最后测出来的数据对比会靠谱很多。6. 我的几点实操心得HBnoise这个工具说难用也确实难用门槛主要在“你知道它该设置什么但不知道为什么是这个值”。把原理捋顺以后它其实就是一个加强版的Pnoise区别只是稳态解来源不同。如果你之前已经熟悉PSSPnoise转到HBnoise也就是多花一两天熟悉界面和参数的事。有一点我最想提醒大家不要一上来就追求“全晶体管、最高精度、最多谐波”的豪华配置。那种跑法既慢又难收敛最后还容易给你一个看着很精细但实际是假收敛的结果。做相噪仿真跟做tdc测试一样先看形状对不对再看数值准不准最后再看细节稳不稳三步走远比你一次性梭哈要稳。另外一个建议是拿到HBnoise结果之后顺手把VCO单独跑一个PSSPnoise对比两条带外相噪曲线。如果两者在带外偏差超过1到2dB那说明HB的harmonic leakage或者收敛精度有问题回去检查设定。这个交叉验证花不了十分钟但能省掉后续DEBUG的巨大麻烦。最后如果你正在做的是全数字PLL或者sub-sampling PLLHBnoise的适用性和设置会有一些不同尤其是sub-sampling结构里采样开关噪声、kickback噪声的处理更麻烦。那种结构的相噪仿真建议直接把参考和采样电路都搭进HB别偷懒只用一个脉冲源等效。多花这点时间换来的是你后续拿到硅片数据时能对着曲线一眼看出哪个模块的噪声被低估了。
阅读完成 · 觉得有帮助?
咨询建站