1GHz LC VCO相位噪声仿真:PSS/Pnoise设置与避坑指南
发布时间:2026/10/2 11:38:58 锦皓数字建站

前阵子帮一位刚转做射频的同事调一个1GHz LC VCOCADENCE ADE里PSS跑了快两个小时眼看着进度条走完结果弹了个not able to find the steady state solution当场血压就上来了。这大概是每个做过VCO相位噪声仿真的人都有过的经历电路本身在Spectre瞬态下振得好好的波形幅度、频率都没问题可一旦切到PSSPnoise这套组合各种妖蛾子就全冒出来了。这件事其实跟运气无关更多是没搞清楚PSS/Pnoise这套仿真机制到底在算什么、每一步设置的物理含义是什么。这篇文章就是想把1GHz VCO相位噪声仿真的完整流程掰开揉碎讲清楚重点放在定向PSS收敛、Pnoise参数设置以及我踩过N次之后总结出的避坑经验上。无论你是刚入门模拟/RF IC设计的学生还是正在用Cadence Virtuoso做产品级VCO的工程师这篇都值得收藏——尤其是那些“看起来设置都对了但结果就是不对劲”的时刻。1. 为什么1GHz VCO的相位噪声仿真总在“最后一步”翻车1.1 相位噪声是VCO所有指标里最“虚”的一个很多同学跑VCO仿真时重心放在调谐范围、输出幅度、功耗这些“一眼看得到”的指标上。这些指标属于直流或大信号稳态特性用普通的直流扫描、瞬态仿真就能看个八九不离十。唯独相位噪声不一样——它定义在频域描述的是振荡器输出信号在载波附近的频谱纯净度单位是dBc/Hz。这个东西你不能直接拿瞬态波形看出来必须通过PSSPeriodic Steady-State周期稳态分析先求出振荡器的周期稳态解再做PnoisePeriodic Noise周期噪声分析才能得到。1.2 PSS/Pnoise是什么先搞清楚你在跑的仿真到底在算什么网上很多教程一上来就让你点这个设那个但如果你不理解原理出了问题根本无从下手。用一句人话概括PSS解决的是“大信号周期工作点”Pnoise在这个工作点上求解“小信号噪声如何被周期时变系统调制”。VCO是一个自激振荡器它没有外部时钟输入输出频率由电路自身决定。这跟LNA、Mixer这类“被驱动”的电路完全不同。PSS的默认思路是“你给我一个周期我迭代到稳态”而VCO因为频率未知需要额外告诉仿真器“你去自己找振荡频率”。这个本质差异决定了VCO的PSS设置和普通电路根本不是一回事。再看Pnoise。振荡器里的噪声源晶体管沟道热噪声、闪烁噪声、电阻热噪声都是随机的但它们经过非线性、周期时变的振荡器之后一部分AM调制成幅度扰动一部分PM调制成相位扰动。Pnoise做的事就是把每个噪声源在基波和各次谐波附近对输出相位噪声的贡献算出来最终给出单边带相位噪声谱L(f)。所以它跟AC分析那种“静态工作点上的小信号增益”是两套逻辑不能混用。1.3 一个能当座标的典型指标参考做1GHz VCO之前心里先要有杆秤。这里给一组典型参考值0.18um RF工艺、LC VCO、尾电流约2mA在100kHz频偏处大约-100~-110dBc/Hz1MHz频偏处大约-125~-135dBc/Hz10MHz处基本到-145dBc/Hz以下。如果仿真出来的曲线偏离这个量级太远大概率不是你运气差而是设置有问题。2. 仿真前夜VCO拓扑、器件库与ADE环境三件套2.1 1GHz LC VCO的拓扑与参数估算1GHz这个频段工程上首选LC VCO而非环形VCO。环形VCO优点是面积小、调谐范围宽但相位噪声天然吃亏——没有高Q谐振腔帮你滤噪声同样的功耗下相位噪声通常比LC VCO差20dB以上。所以正儿八经做无线收发机里的本振基本都是LC结构。一个经典的1GHz LC VCO长这样两个交叉耦合NMOS或PMOS构成负阻中间一个电感L和一个变容管固定电容阵列构成的谐振腔尾电流源负责定功耗。负阻把谐振腔里的能量损耗补回来维持振荡。谐振频率的估算用最基本的公式[ f_0 \frac{1}{2\pi\sqrt{LC}} ]假设选一个4nH的电感要振荡在1GHz总电容约[ C \frac{1}{(2\pi \times 1\text{GHz})^2 \times 4\text{nH}} \approx 6.3\text{pF} ]这6.3pF里包含变容管的结电容、固定电容阵列和管子寄生电容。设计时留出调谐余量实际C总可以取7~8pF让频率落在950MHz~1050MHz之间可调。我个人的习惯是先用理想电感和理想电容把拓扑跑通确认起振和相位噪声趋势再换成工艺库里的实际器件——这样做的好处是先把“仿真设置”和“电路设计”这两个变量分开排错。2.2 器件库选型与工艺角的准备说到器件库Cadence里仿真之前第一件麻烦事就是确认.lib加载对了。ADE L/ADE XL里通常通过model libraries窗口加载工艺厂的PDK模型文件比如rf018.l、spectre_models这类。要特别注意选对corner。tt/ss/ff会影响增益和相位噪声尤其ss corner下跨导管gm变小起振条件可能就不够了。射频器件和数字器件分开。很多PDK里普通NMOS和RF NMOS模型不一样RF管子带了更多的寄生和噪声模型VCO里一定要用RF器件视图否则1/f噪声可能严重低估。电感的Q值模型。工艺库里的电感一般带频率相关Q值如果你的库里只有理想电感那相位噪声仿真结果会偏乐观只能用来验证流程不能当最终指标。2.3 跑通之前的电路检查清单花两分钟过一遍这个清单能帮你省几个小时电源和地有没有干净电源网络别串大电阻VCO对压降敏感。尾电流源的偏置电平对不对跨导管栅压要保证gm足够起振判据是跨导管等效负阻小于电感并联等效电阻R_p。输出缓冲有没有加直接拿振荡器的谐振腔抽头去接后级测试负载Q值会被拉低相位噪声也会变差。一般会加一个源随器或者反相器缓冲仿真时只在缓冲输出端取波形。有没有设置初始条件给谐振腔节点一个几mV的初始差模扰动能有效避免起振死锁。最简单的方法是把两个输出节点初始电压设成略有差异比如V(VoutP)1.8、V(VoutN)1.799。3. PSS收敛的命门beat频率、tstab与maxsidebands如何配合3.1 beat频率先让仿真器知道电路“周期”是多长在Cadence ADE里PSS分析的设置界面第一栏就是beat frequency。很多新手在这里直接填振荡频率的估计值比如1GHz。但对于VCO更好的做法是在fundamental tones里设置beat frequency为auto或者使用oscillator选项。Cadence Spectre支持把PSS设置为振荡器分析让它自己在指定频段内搜索稳态振荡频率。如果必须手动指定beat一个稳妥的获取方式是先跑一个2~3us的瞬态仿真在波形里测一下实际的振荡周期然后用1/T填进去。你会发现仿真器标称的1GHz和你实际电路振荡出来的1.013GHz往往有偏差——如果你硬填1GHzPSS会强行以1GHz为周期去寻找稳态结果就是“看起来收敛了其实电路根本没处于真实振荡状态”相位噪声曲线全是错的。在pss设置中还有一个容易被忽略的oscillator选项目录需要指定node和direction。node选一个振荡幅度最大的输出节点direction填oscillator仿真器会按自激振荡器的方式处理自动迭代出真实频率。这一步做对了PSS收敛概率会大幅提升。3.2 tstab初始瞬态到底要熬多久tstab是PSS在进入迭代寻找稳态之前先让电路“自由跑”一段瞬态的时间。为什么要这个因为PSS需要的是一个严格的周期稳态如果起始瞬态里电路还没振稳谐波含量还在变化迭代就很难甚至无法收敛。对于LC VCO来说tstab的设置要看谐振腔Q值和起振时间。Q值高意味着建立时间长前面第2节那个4nH电感的例子tstab给个2us甚至5us都不过分。这里有个判断技巧先跑瞬态看输出幅度在多少ns之后基本不再增长然后tstab至少取那个时间的2~3倍。比如瞬态到800ns幅度就稳了tstab给1.5us以上比较安心。有些人喜欢开overshoot保护或者调gear2但我的经验是先把tstab给足再用默认积分器反而最稳。tstab太短导致“伪周期”收敛的问题症状是PSS显示converged但输出幅度和瞬态对不上。你可以在PSS跑完后重放输出波形如果幅度明显小于瞬态稳态幅度基本就中招了。3.3 maxsidebands与混叠侧带数量决定精度上限maxsidebands是PSS里另一个要命的参数。它的含义是周期稳态求解时仿真器最多考虑多少个谐波边带。对振荡器来说非线性越强、谐波越丰富需要的sidebands越多。在实际操作中如果maxsidebands设置太小比如默认的1或3结果往往有两种要么收敛时间拖长要么Pnoise曲线在高频偏移处出现异常上翘。这是因为许多噪声成分在谐波附近混叠你没给足边带数它们就会“塞”到你能看到的低频偏移区间污染相位噪声曲线。LC VCO不是强非线性电路maxsidebands取10~20是安全范围。如果电路里有强的开关动作比如注入锁定分频器或开关电容阵列在振荡周期内通断就要适当往30以上调。注意它会显著影响仿真时间别盲目拉满。3.4 解算器与精度选项reltol、iabstol、vabstol怎么给PSS的收敛误差控制和瞬态仿真的reltol是同一套参数但它对结果的影响更微妙。通常ADE默认的reltol1e-3对普通瞬态够用但相位噪声是极小的量-140dBc/Hz这个级别如果PSS本身的精度只有1e-3底噪会直接把PN曲线抬高、变毛。我一般把reltol设到1e-5同时配合iabstol1e-12、vabstol1e-6。注意这几个参数不是越小越好——太小会卡收敛仿真时间爆炸。建议顺序是先用默认精度reltol1e-3跑PSS确认能收敛、能出Pnoise结果。把精度提高到1e-5对比PN曲线是否明显变化。如果两条曲线几乎重合说明默认精度已经够了如果有偏差说明噪声小信号确实受大信号求解精度影响必须用高精度。4. Pnoise设置逐项拆解从噪声类型到相位噪声曲线4.1 选择输出量phasenoise与jitter的区别Pnoise分析的选项里默认会让你选noise type。常见的有phasenoise相位噪声、jitter周期抖动、sources等。如果你的目标是看频谱纯净度、画经典的相位噪声曲线选phasenoise。而jitter模式直接对相位噪声在全频频段积分输出的是周期抖动RMS值和各噪声源的贡献占比。工程上PLL锁定后带内需要一个RMS jitter预算那你最终很可能要的是jitter结果。但我建议这两步分开做先用phasenoise把曲线看清楚确认曲线形状正确再切到jitter模式看集成值。直接上jitter模式容易把问题藏起来——它只给你一个数曲线形态错了你根本不知道。4.2 扫频范围与点数既要全还要快Pnoise的扫描范围一般从1kHz或10kHz扫到1GHz频偏。1GHz载波的附近我们要评估的offset通常覆盖10kHz~100MHz。起始频率太低仿真时间会大幅增加而且1/f噪声模型在极低频往往不准确起始频率太高比如直接1MHz起步又会漏掉VCO很重要的近载波指标。扫频类型建议选relative而不是absoluterelative是指相对载波的偏移频率扫描结果直接就是经典相位噪声曲线。点数points per decade设10或20即可再往上只是让曲线更平滑对RMS积分影响不大。除非你要看很窄频段的细节否则10倍频程20个点足够。4.3 正确设置参考谐波才能拿到相对载波的PNPnoise里有一项output要选“相对于哪个谐波的相位噪声”。很多教程不细讲但这一步错了结果直接偏大或偏小。对于1GHz VCO载波是基波所以reference harmonic选1。如果你的PSS设置里基波被仿真器识别成了0次或某次谐波需要手动核对。判断方法很粗暴跑完Pnoise后回到PSS的频谱结果看输出节点在哪个频率上能量最大那个频率对应的谐波次数就是你要填的reference harmonic。大多数情况下是1但如果你从分频器输出取噪声可能就要填0.5或2这种“分数谐波”了——分数谐波常见于subharmonic injection锁定时钟LC VCO直接输出一般用不到但要知道有这个坑。4.4 曲线读法-30dB/dec、-20dB/dec与平坦区一条健康的1GHz LC VCO相位噪声曲线有三段特征低频偏移区~1kHz~10kHz以-30dB/dec下降对应器件闪烁噪声上变频。中频偏移区~10kHz~1MHz以-20dB/dec下降对应热噪声引起的白相位扰动是Leeson模型中最典型的一段。高频偏移区1MHz逐渐走向平坦接近噪底/测量本底。如果曲线在中频段斜率明显小于-20dB/dec比如变成-15dB/dec通常说明有额外噪声源或者混叠污染如果高频段出现上翘优先怀疑maxsidebands不够如果曲线整体在某个偏移频率突然跳变要检查PSS的谐波次数是否覆盖到了相关频率成分。5. 高频踩坑实录6个最隐蔽的PSS/Pnoise问题5.1 坑1仿真器找不到振荡频率double-check direction第一个最常见的问题是PSS根本不收敛报错或者卡死。如果你已经确认直流工作点没问题、瞬态也能起振那80%是direction设错了。在pss的oscillator设置中direction不是随便选的它告诉仿真器“你应该沿哪个信号通路识别振荡正反馈”。我遇到过一种情况VCO输出经过缓冲器再接电阻负载我把node设在缓冲器输出而不是谐振腔输出结果PSS一直找不到稳态。换成谐振腔的高阻抗节点一次就通了。经验法则node选和LC谐振腔直接相连、幅度最大的那个点direction选振荡器输出最自然的那一端。5.2 坑2tstab看似足够实际振幅还没摆稳另一个隐蔽情况是从波形上看输出幅度好像已经稳定了但PSS结果却悄悄“漂”了。这多半是因为你只看了几百ns的波形但振荡器的频漂或热漂移在微秒级才会显现。怎么检查跑完PSS后让仿真器输出最后一个周期的波形用Calculator量一下两个相邻周期的峰值幅度差。如果差超过0.1%说明离真稳态还有距离加长tstab。尤其是使用了自动幅度控制AGC或者有偏置建立过程的VCOtstab建议直接给10us量级。5.3 坑3beat频率估算错一倍整条PN曲线跟着错这条几乎人人中招。因为LC谐振频率是1GHz于是beat直接填1GHz但实际工艺偏差和寄生让振出来是1.06GHz。这1.06GHz和1GHz不是1倍关系但会导致PSS去“硬凑”一个不存在的周期稳态表面上收敛实际输出的基波频谱会在错误的位置PN曲线整体偏移、数值偏高。避免方法就是前文说的先瞬态测周期再填beat或者干脆用oscillator模式让它自动搜索。自动搜索也有代价——如果搜索范围太宽会慢但正确性优先慢一点值得。5.4 坑4maxsidebands太小高频offset曲线“翘尾”有段时间我调一个带开关电容阵列的VCO相位噪声曲线在10MHz以上猛然上翘从-150dBc/Hz一路抬到-130dBc/Hz怎么看都像引入了额外噪声源。查了器件噪声、衬底耦合最后发现就是maxsidebands3惹的祸。开关电容阵列在振荡周期内周期性地导通、关断产生的噪声和谐波极其丰富。sidebands不够噪声折叠到低中频曲线就出问题。把maxsidebands从3改到20翘尾立刻消失。所以我的建议是碰到PN曲线高频异常先怀疑sidebands再怀疑电路。5.5 坑5参考谐波选错数值直接差出3dB以上如果你跑出来的相位噪声数值整体明显地“偏大”或“偏小”但曲线形状没问题大概率是reference harmonic设置错误。选了0直流或者2二次谐波作为参考噪声相对的对象就变了数值就不是严格的“相对载波”。另外还要分清SSB还是DSB。Cadence的Pnoise默认输出是单边带相位噪声L(f)单位dBc/Hz这个和频谱分析仪上看到的SSB PN一致。如果你看到有些资料用“双边带噪声”记得数值上要差3dB。仿真时别搞混输出报告里会标明SSB phase noise。这个3dB差值是很多“PN总差一点”的元凶。5.6 坑6只看相位噪声曲线忽略了积分抖动检查最后一个坑不算仿真设置而在于你怎么验收。曲线好看不代表系统能用必须集成到PLL链路里去看RMS jitter。你辛辛苦苦把PN从-110dBc/Hz100kHz优化到-115dBc/Hz但如果积分区间起点从1kHz开始闪烁噪声区的贡献可能远大于1MHz附近的改善。所以拿到PN曲线后建议立刻在Calculator里做一次带限积分比如10kHz~10MHz算出RMS jitter作为“一条龙”验收指标。仿真流程通不通最后以这个数字闭环。6. 一次跑通的参数速查表、Ocean脚本与后处理技巧6.1 PSS/Pnoise参数速查表可直接抄作业下面这张表是我个人在Cadence IC617/IC618上验证过的一组起点参数适合大多数1GHz级LC VCO。注意这是“起点”不是“终点”工艺库不同需要微调。分析类型参数项推荐初值说明PSSbeat frequencyoscillator/auto或先用瞬态测周期不要盲填1GHzPSStstab2us~5us至少让幅度建立到稳态PSSharmonic numbers7~10覆盖到7~10GHz谐波PSSmaxsidebands10~20有开关阵列取20以上PSSerrpresetmoderate/conservativeconservative更稳更慢PSSreltol1e-5相位噪声对精度敏感PSSvabstol / iabstol1e-6 / 1e-12配合reltol收紧Pnoisenoise typephasenoise需要集成抖动再切jitterPnoisesweep typerelative直接出相对载波曲线Pnoiseoffset range10kHz ~ 1GHz起始频率太低会拖仿真Pnoisepoints per decade20用于曲线和积分足够Pnoisereference harmonic1从PN输出直连的载波谐波Pnoisemaxsidebands20和PSS保持一致或更高有同学问errpreset是什么意思。它是一组预设的Newton容差档位liberal最快但精度差moderate中等conservative最稳。我的建议是第一次用moderate跑通再切conservative复跑一次看曲线是否变化。两者的PN曲线如果完全重合说明你已经跑到了“这个仿真设置之下的极限精度”可以放心用moderate节约时间。6.2 用Ocean脚本固化你的仿真流程当你不断调整VCO参数、重复做相位噪声仿真时每一次都在GUI里点那几个菜单其实很烦而且容易点错。Cadence自带的Ocean脚本可以完整固化PSS/Pnoise流程。这里给一个可供参考的示例IC617/IC618环境Spectre仿真器; 1GHz LC VCO PSS/Pnoise 示例脚本 simulator( spectre ) design( ~/simulation/vco_test/spectre/schematic/netlist ) modelFile( ~/pdk/models/spectre/rf018.scs tt ) analysis(pss ?fund 1G ?harm 7 ?tstab 3u ?maxsideb 20 ?errpreset conservative ?oscillator (outp oscillator)) analysis(pnoise ?pss pss ?noisetype phasenoise ?sweeptype relative ?start 10k ?stop 1G ?pointsperpdecade 20 ?relref harm ?refharm 1 ?maxsideb 20 ) run() selectResult( pnoise ) phaseNoise( ?from 10e3 ?to 10e6 )这个脚本里的变量名在不同版本略有差异但思路通用先加PSS分析再加基于该PSS的Pnoise分析跑完后直接打出积分相位噪声。有了这个脚本你每次改完电路只需要在ADE L里重跑一遍或者用命令行批处理方便做corner、做参数扫描。6.3 后处理看曲线、打marker、算RMS抖动跑完Pnoise之后Cadence的Direct Plot窗口里可以直接生成相位噪声曲线。我要特别提醒一点先在Results - Direct Plot - Main Form里选中合适的输出再在曲线图上加marker读数值。不要在波形窗口里瞎点否则读出来的可能是总输出噪声而不是相位噪声单位也可能不对。如果你要把相位噪声积分成RMS jitter用Calculator里的phaseNoise函数可以带限积分也可以导出CSV后拿Python或MATLAB自己算。我自己习惯的做法是导出CSV再用Python做一次数值积分因为这样能顺手画图、对比多个corner、检查曲线斜率有没有异常。最后再分享一点个人体会我在Cadence ADE上跑VCO相位噪声仿真踩过的坑比这篇文章里写的还要多。但经验积累下来发现绝大多数问题都出在“没有先理解PSS/Pnoise每一步的物理需求”而不是电路本身不行。相位噪声仿真这件事60%靠正确的PSS收敛30%靠正确的Pnoise参数剩下的10%才是你对电路结构的理解——这个比例跟很多人的直觉正好相反。所以下次再遇到PN曲线不对别急着改电路先回去把tstab、maxsidebands、beat frequency、reference harmonic这四个参数逐项审一遍很可能答案就在那里。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。