
斩波运放做出来了投片前最难受的不是画版图而是仿真怎么仿。常规AC能跑但结果根本不对普通Noise分析跑完低频1/f噪声看着也没被搬走。因为斩波运放本质上是个线性时变周期系统开关在不停调制信号你的老一套频域工具在它面前就是失效的。PSS、PAC、Pnoise、PSTB这四个仿真组合拳才是真正能把这颗运放的全貌看清楚的途径。这篇文章就把这套流程掰开揉碎讲一遍为什么要这么仿、参数怎么设、结果怎么看以及我在多个项目里实打实踩过的坑做信号链的模拟IC设计师和刚碰周期性仿真的研究生应该都用得上。1. 为什么斩波运放不能只跑AC和Noise1.1 斩波原理导致的“周期性时变”先简单回顾一下斩波运放的工作方式。输入信号先经过第一组斩波开关被调制到斩波频率f_chop附近然后经过运放放大再经过第二组斩波开关解调回原来的频段。这样做的核心目的是把运放的输入失调电压和1/f噪声调制到斩波频率附近而不是让它们直接叠加在基带信号上。问题就出在这两组开关上。开关的导通和截止动作让电路的小信号行为随着时钟周期不断变化。你今天把电路调到某个工作点下一秒开关翻转工作点又变了。这个系统从数学上属于线性周期时变系统英文缩写叫LPTV。对LPTV系统它的传递函数不再是一个简单的H(s)而是包含无数个边带分量的多输入多输出系统输入频率f的信号会在输出端产生f n·f_chop的一系列分量。这就是为什么常规AC分析在斩波运放上不好使的原因。1.2 常规AC和Noise仿真失效的深层原因常规AC分析的前提是线性时不变也就是说仿真器在工作点附近做小信号线性化后默认这个线性化模型在整个时间轴上保持不变。但斩波运放的小信号模型是随时间周期变化的仿真器在某个固定时刻做线性化只能得到那一瞬间的响应丢了调制/解调带来的边带混叠信息。实际跑一次就会发现同样的电路直接跑AC得到的低频增益可能只有30dB而真正的基带等效增益可能是80dB。为什么差这么多因为常规AC输出结果是多个边带的矢量叠加这些边带之间相位关系复杂在某些频率点上互相抵消增益就被人为拉低了。更迷惑人的是AC曲线还会出现一些来历不明的“凹陷”和“隆起”这并不是电路真的有零极点而是边带混叠造成的假象。Noise分析也一样。普通Noise仿真把每个噪声源当做一个时不变源来处理忽略了噪声源在开关调制下的频谱搬移。斩波运放的核心卖点——把1/f噪声搬到高频——在普通Noise分析里根本体现不出来。你跑完得到的结果里低频噪声依然很大跟实测对不上然后就开始怀疑是不是电路本身有问题其实是仿真方法没选对。1.3 四个仿真工具怎么分工既然老办法不行就得用周期性仿真系列。这四种仿真分工很明确PSSPeriodic Steady State用来计算电路在周期条件下的稳态工作点是整个组合拳的地基。没有PSS后面三个全都跑不了。PACPeriodic AC回答的是“在周期工作点附近某个频率的小信号输入会产生哪些频率分量、增益多大”的问题。Pnoise回答的是“周期时变电路中各个噪声源经过调制、混叠之后在输出端形成的噪声谱是什么样的”的问题。PSTBPeriodic Stability回答的是“周期工作点附近环路的增益和相位裕度到底是多少”的问题。这四个工具不是可以互相替代的关系而是层层依赖的关系。PSS是公用的底座PAC看传输特性Pnoise看噪声PSTB看稳定性。用一个表格整理一下仿真类型依赖前置解决的问题斩波运放里最关心的结果PSS无周期稳态工作点斩波时钟频率下的启动稳定状态PACPSS周期时变系统的小信号传输基带等效增益、带宽、边带特性PnoisePSS噪声源的周期调制与混叠低频噪声抑制程度、输出噪声谱PSTBPSS周期时变环路的稳定性环路增益、相位裕度、增益裕度把这四个仿真的结果拼在一起才能回答“这颗斩波运放到底能不能用”的问题。2. 仿真前准备与Bench搭建2.1 测试电路拓扑怎么搭开始仿真之前先把测试电路搭对。我建议用一个标准拓扑输入信号源通过斩波开关进入运放输入端运放输出端先经过第二组斩波开关解调然后接一个RC低通滤波器把斩波频率及其谐波滤掉最后接到输出负载。这里有一个非常关键的选择斩波开关用什么模型如果只是验证斩波原理和仿真方法用理想开关模型最合适收敛性最好跑起来也快。理想开关可以选verilog-A写的理想开关模型或者Cadence里自带的理想开关。如果要做更接近实际的设计验证再用传输门Transmission Gate加上时钟驱动电路这时候时钟的非交叠时间、开关导通电阻等效应就都会被纳入仿真。2.2 关键参数怎么起点我通常以一个具体的参考设计来说明参数选择。假设斩波频率f_chop 100kHz运放单位增益带宽10MHz目标是等效基带增益80dB输出低通滤波器截止频率放在50kHz左右。这是一个典型的高精度传感器接口应用场景斩波频率不高不低开关模型用理想开关就能跑。用这个频率作为基准PSS的beat frequency就设置为100kHz。为什么要用斩波频率而不是别的频率因为整个电路的所有周期行为都由斩波时钟支配只有以这个频率为基频做傅里叶分解才能把电路稳态行为表达正确。2.3 PSS参数设置与收敛调优PSS设置里我重点调整三个参数beat frequency、number of harmonics、tstab。Beat frequency直接用100kHz。Number of harmonics起步设31不够再加。斩波开关的方波沿越陡需要的高次谐波就越多。理想开关模型上升沿为0理论上需要无穷多个谐波才能完美表示实际取到31~63就够用了。继续增加谐波数会明显拖慢仿真速度但精度提升有限。Tstab这一步很多人容易忽视。Tstab的意思是启动瞬态的时长PSS会先跑一段瞬态让电路进入稳态然后才提取周期稳态解。对于斩波运放来说环路是低带宽的大时间常数系统运放的建立时间可能到几百微秒甚至毫秒级。如果Tstab设太短PSS会在电路还没有完全建立好的状态下强行提取周期解结果自然不对。我在跑一个低功耗斩波运放时遇到过这个问题运放偏置电流只有1uA输出建立时间很长。第一次跑PSS时Tstab只给了20us结果后级的PAC和Pnoise全都出现异常振荡。后来把Tstab加到500usPSS收敛后面所有结果都正常了。所以Tstab的经验法则是至少是钳位/环路建立时间的5到10倍如果拿不准就扫两次Tstab看结果是否稳定。PSS还有一个核心参数是errpreset通常选moderate有风险我的习惯是直接选conservative。对于精密运放宁可多花点仿真时间也要确保PSS解足够精确因为后面PAC、Pnoise、PSTB全在这上面加工底座腰杆不硬上层建筑全是危楼。如果PSS不收敛怎么办排查顺序是这样先把Tstab拉大尤其是低带宽电路。降低谐波数试试有时候谐波数太多反而因为数值噪声导致不收敛。检查开关模型是否引入了过于陡峭的边沿如果是可以把上升沿设一个很小的值比如1ns来辅助收敛。检查电路中是否存在没有初始条件的浮空节点这会让瞬态建立阶段出现大的数值振荡。实在不行把errpreset提高到conservative同时降低vabstol和iabstol的容限。2.4 PSS结果的验证习惯这里分享一个我个人的验证习惯。PSS跑完后不要把数据存了就急着跑后面三个仿真。先用PSS的波形查看功能看斩波输出节点的瞬态波形是否已经进入周期性稳态。具体方法PSS计算完成后在Direct Plot里看fo_0处的频谱分量尤其是直流分量和解调后的基带增益应该跟理论估算对得上。这一步看着不起眼但能在最早的时间暴露PSS的问题好过等Pnoise跑出来发现噪声谱不对再回头查PSS。3. PAC周期传输特性的正确打开方式3.1 PAC的边带概念跑完PSS之后就可以跑PAC了。PAC做的是在PSS工作点附近加一个小信号正弦激励然后计算这个激励经过周期时变系统后在所有边带频率上产生的响应。在LPTV系统中输入频率f的一根谱线在输出端会产生f n·f_chop、n取整数的无数根谱线。这就像混频器一样开关的周期性导通和关断相当于本振信号PSS基频就是本振频率输入信号与本振的各个谐波混频后就在输出端产生了大量边带分量。PAC设置里的sidebands参数就是控制计算多少个这样的边带。这个参数极其关键。3.2 sidebands怎么给才合适sidebands给太少是PAC跑不对最常见的原因。斩波运放中输入信号先被调制到100kHz附近经过运放放大后再被解调回基带。在整个链路中信号至少经历了两次混频每一次混频都会产生多个边带。如果sidebands给到5以下高频部分的传输特性基本就是错的会出现莫名其妙的增益跌落或抬升。我的实践起点是sidebands15对于斩波运放这种开关频率和信号带宽相差不大的电路这个值一般就够用了。如果电路里开关沿很陡或者信号带宽能到几倍斩波频率就需要加到31。判断是否给够的方法是把sidebands从15加到31对比PAC结果如果曲线变化不大说明已经收敛如果曲线有显著变化继续加直到结果稳定。3.3 读PAC结果时注意边带选择PAC结果查看需要特别注意一个点你在Bode图上看到的增益是哪个边带的响应Spectre的PAC分析默认支持输出选择你可以指定看哪个边带的幅度也可以看所有边带叠加的总输出。对于斩波运放最有意义的是输出端那个落在基带的分量也就是sideband 0。实际查看时我会用Direct Plot - Main Form选择PAC然后在“Sidebands”选项里选0读出基带增益和带宽。举个具体例子。我的参考设计里输入交流源频率从1Hz扫到1MHz输出节点选在低通滤波电容两端PAC结果应该显示低频段约80dB增益在50kHz左右因输出低通滤波开始滚降。这个结果和多步瞬态仿真计算出的等效增益一致就说明PAC的设置正确。如果读出来的增益明显比预期低大概率是看错了边带或者sidebands给少了导致边带混叠不完整。3.4 PAC和瞬态/傅里叶分析的交叉验证PAC结果有个快速验证方法就是用瞬态仿真加离散傅里叶变换DFT来看。具体做法在输入加一个固定频率10kHz的正弦小信号跑足够长的瞬态然后对输出波形做DFT提取输出在10kHz处的幅度和相位再和PAC在10kHz处的结果对比。这个方法不能全频段做因为太耗时但在几个关键频率点比如基带中间频率、斩波频率附近、2倍斩波频率附近各验证几个点就能确认PAC整体结果是否可信。我每次在做到一个新的斩波架构时都会先做这个交叉验证等于是给PAC结果买了个保险。4. Pnoise噪声折叠的真相与抖动计算4.1 斩波运放的噪声是怎么折叠的斩波运放的噪声行为比普通运放复杂得多。运放输入管的闪烁噪声和失调在斩波开关的调制下被向上搬移到f_chop附近。同时白噪声又会在多个边带之间混叠。所以你在Pnoise结果里看到的输出噪声谱实际上是无数个噪声源、无数个边带分量共同叠加的结果。如果只跑普通Noise分析仿真器只考虑噪声源在当前工作点的贡献没有考虑开关调制导致的频谱搬移和折叠效应结果会严重偏离真实情况。这也是为什么Pnoise在这个场景下不可替代。4.2 Pnoise实操设置Pnoise基于PSS运行。设置项里我重点关注噪声类型输出参数、频率扫描范围和maxsidebands。对于直接看输出噪声电压谱密度的需求Pnoise的noise type选timeaverage输出节点选在低通滤波器的输出端。频率扫描范围建议从1Hz扫到10倍斩波频率以上。如果只关心基带噪声可能扫到f_chop就够了但我建议至少扫到5倍f_chop否则你看不到噪声在斩波频率附近那个“隆起”的形状。Maxsidebands参数同样要重视。Pnoise计算噪声折叠时需要把各个边带的噪声贡献加起来。如果maxsidebands太小就会漏掉大量折叠噪声结果会严重偏低。我的做法是Pnoise的maxsidebands和PSS的harmonics保持在同一量级比如harmonics31maxsidebands15到31这样计算资源和精度比较均衡。在Pnoise结果里能明显看到三个特征低频段噪声被大幅压低因为1/f噪声被调制到了高频。在f_chop及其整数倍附近噪声谱出现明显的凸起或驼峰。整个频段的白噪声底可能会比普通运放稍高因为开关的折叠混叠增加了噪声功率。这就是斩波运放的噪声特性用高频噪声的小幅增加换取低频噪声的大幅降低。在很多直流精密测量场景里这个交换是值得的。4.3 pnoise里的jee到底是哪个jitter看到这里你可能要问那为什么总听说Pnoise还能算jitter就是很多热搜词里说的“pnoise里怎么计算absolute jitter”这个问题。先搞清楚Spectre Pnoise里的两个概念。当Pnoise的噪声类型选择为jitter相关时它是在统计输出边沿的时间偏差。这里最常见的两个统计量Cycle-to-cycle jitter输出波形的相邻周期之间的差即第n1个周期和第n个周期的时间间隔之差的标准差反映的是“相邻沿之间”的短期抖动。Absolute jitter第n个输出边沿相对理想边沿的时间偏差反映的是“输出相对输入/理想参考”的长期累计抖动。那么问题来了pnoise里的jee到底指哪个从我实际使用的经验来看Spectre里看到的jee有的版本标注为edge to edge jitter默认是对应于“边沿相对于其理想位置的绝对抖动”也就是absolute jitter而不是相邻周期之间的cycle-to-cycle jitter。具体地说如果Pnoise以输入时钟沿作为参考jee就是输出沿相对输入沿的抖动如果以理想时钟边沿为参考比如输入本身就是理想时钟那jee就是绝对抖动。这个点很容易搞混因为不同版本的仿真工具、不同公司的PDK文档里对jitter术语的定义并不统一。有的工具把相邻周期差叫jitter又把绝对累计偏差叫accumulated jitter。所以我建议在工程报告里不要只写“jitter值”而要把统计定义写清楚是相邻周期差还是相对理想边沿的绝对偏差。否则两个工程师对着同一句话能做出完全不同的判断。4.4 用Pnoise计算absolute jitter的实操方法如果你要用Pnoise算absolute jitter操作步骤是这样的第一步确保PSS已经收敛。PSS的beat frequency要设成时钟频率f0这样Pnoise的相位噪声结果才有正确的载波频率。 第二步建立Pnoise分析选择输出节点为时钟输出或信号整形电路后的方波输出噪声类型选为jitter。 第三步如果有输入参考时钟把它的周期设为f0让仿真器以这个周期作为理想边沿基准。如果电路自己产生时钟、没有外部参考就以PSS计算得到的边沿位置作为理想位置。 第四步读取结果。Spectre会直接给出RMS jitter值对你算absolute jitter来说这个值就是输出边沿相对理想边沿的标准差。还有一种更原始但从原理上非常清楚的计算方法从相位噪声积分得到absolute jitter。公式是σ_abs sqrt(∫₀^∞ L(f) / f² df) / (2π·f0)其中L(f)是相位噪声功率谱密度f0是载波频率。工程上积分范围一般从某个低频offset比如10Hz或1kHz积到2倍信号带宽取多少取决于你关心的观测时间窗。Pnoise给出了单边带相位噪声谱然后用Calculator里的积分函数做这个运算也能得到和jitter类型直接输出基本一致的结果。需要特别说明的是斩波运放的输出是一个连续时间模拟信号不是方波所以一般情况下不要去算它的jitter。只有当你后续接了比较器、整形电路把信号变成数字沿之后才有必要用Pnoise的jitter功能。否则在模拟输出节点上看噪声谱密度就好了这也是很多新手容易混淆的地方。4.5 一个容易忽略的收敛参数Pnoise还有一个让我踩过坑的参数noisefmax。在某些版本的Spectre里Pnoise的噪声源采样频率和频率扫描范围是分开的。如果noisefmax设得太低高于这个频率的噪声源贡献会被忽略导致输出噪声谱在高频段莫名掉下来。建议noisefmax至少设到分析最高频率的5到10倍特别是电路里有宽带白噪声源时更要注意。5. PSTB周期稳态下的环路稳定性测量5.1 为什么不能用普通STB直接测很多人在斩波运放上翻车是因为直接跑STB。STB的原理是在直流工作点附近线性化然后计算环路增益。但斩波运放环路里有两个开关在周期性翻转在某个固定时刻开关状态只是整个周期行为的一个片段。STB在这个片段上算出来的环路增益不能代表整个周期内的平均稳定性。想象一个场景你在斩波开关刚好闭合的那个时刻去做小信号分析得到一组环路增益但开关断开时环路拓扑完全变了增益和相位都不一样。普通STB只会选一个静态工作点所以结果取决于你选择了哪个时刻不同时刻结果差别很大完全没有参考价值。PSTB则在PSS解的基础上做小信号分析它把周期时变效应全部纳入计算给出的是“等效主环路增益”这才是我们判断相位裕度时要的东西。5.2 PSTB的probe选择PSTB设置里我花最多心思的是环路断开点的选择。Loop probe放到哪里对结果影响很大。我的经验原则把probe放在反馈网络到误差放大器输入之间避开斩波开关直接耦合的位置。为什么因为斩波开关本身是时变元件放在它附近测量容易把开关动作造成的奇次谐波混叠当成环路特性导致读出的相位裕度偏低或出现多个交叉点。举例来说假设反馈电阻网络从输出分压到运放输入端那就在反馈分压电阻和运放输入端之间插入一个iprobe这样测到的环路包含输出级、反馈网络、输入斩波开关的调制效应但又不会在同一个节点上叠加开关的实际动作。如果电路是多环结构就分别测主环和次级环不要指望一个probe能搞定所有环路。5.3 实战读懂PSTB的环路增益曲线PSTB跑完看环路增益曲线时会发现一个普通STB里不太常见的现象增益曲线在低频段很平然后在中频段出现第一主极点但在f_chop附近还可能再次出现相位转折甚至在更高频段出现相位穿越到-180°后又回来。第一个相位穿越点决定主环的稳定性重点关注这个点上的增益裕度和相位裕度。如果在f_chop附近还有一次穿越也不要忽视因为这说明电路中存在由斩波频率引入的额外不稳定模态。我曾经在项目里遇到一个斩波运放PSTB读出的主环相位裕度高达70多度看起来非常稳但f_chop附近还有一次相位穿越相位裕度只有十几度。虽然这个次要模态在实际应用中不一定会振荡但导致输出出现了明显的振铃。后来在环路里加了一个补偿电容把这个穿越推到了更高的频率振铃问题才消失。5.4 和阶跃响应对照判断PSTB结果是否可信我习惯用瞬态阶跃响应来做交叉验证。具体方法在输入加一个小的阶跃信号跑足够长的瞬态观察输出是否出现振铃振铃的频率和衰减速度再和PSTB算出的相位裕度对照。比如PSTB算出相位裕度45°实际阶跃响应应该表现为约30%到40%的过冲振铃频率应该在主环交叉频率附近。如果PSTB说PM有60°但阶跃响应振荡明显那就要回头检查PSTB的probe位置或者PSS收敛性。6. 常见问题与排查实录6.1 问题速查表现象可能原因排查/解决办法PSS不收敛Tstab太短、谐波数过多、开关沿过陡增大Tstab调整谐波数给开关设1ns上升/下降沿PSS收敛但PAC增益异常sidebands不够看错了边带增大sidebands在Direct Plot中明确选择输出边带号PAC高频段出现莫名凹陷sidebands数量不足导致边带混叠不全将sidebands翻倍对比两次结果是否稳定Pnoise低频噪声没有被压低输出取点错误PSS不准确未在PSS基础上跑确认Pnoise基于PSS取点在解调后检查PSS谐波数Pnoise高频噪声偏高噪声折叠正常现象需要结合实际需求判断用白噪声底对比普通运放的等效输入噪声来评估PSTB相位裕度随电流/频率变化剧烈probe位置不当PSS不精确多环未拆开移动probe检查PSS收敛分环测量阶跃响应振铃和PSTB结论不符PSS精度不足或PSTB交叉频率附近多模态干扰提高PSS精度检查f_chop附近第二次相位穿越jitter结果和手算差很大jitter统计定义不同积分带宽不对参考未定义好确认统计类型是absolute还是cycle-to-cycle明确参考沿6.2 独家验证技巧最后分享一个我一直在用的验证流程它帮我在多次项目评审中提前发现问题。第一步PSS结果跑完后先把输出节点的基带增益用手算一遍。比如运放开环增益80dB反馈系数0.5等效闭环增益应该接近6dB。如果PSS给出的稳态频谱连这个都对不上别往后走回头调PSS。第二步跑PAC时顺手跑几个单频点的瞬态DFT做对照。我一般选基带中间频点、f_chop附近、2倍f_chop三个点各做一次验证。这三个点覆盖了斩波运放传输特性最重要也是容易出问题的区域。第三步Pnoise的结果要和理论公式互验。斩波运放的等效输入1/f噪声在白噪声以下的日子理论上在低频段应该是平坦的白噪声底而不是的直线下降。如果看到低频仍有大斜率上升通常说明调制没起效要么是开关时序不对要么是仿真设置错了。第四步PSTB跑完惯用阶跃响应来收官。这一步会把前面所有潜在问题都暴露出来因为相位裕度这个东西仿真器可以出错但阶跃响应的振铃不会骗人。6.3 关于组合拳的执行顺序这套组合拳在执行顺序上也有讲究。我的习惯是先把PSS在典型工艺角、典型温度、典型电源电压下发透确认PSS在每个条件下都收敛且稳态解合理。然后再拿这个PSS结果去并行跑PAC、Pnoise、PSTB。这里不推荐每换一个仿真类型就重跑一次PSS因为PSS是最耗时的一环重复跑纯属浪费机器资源。不过在调整了任何影响工作点的参数后必须重跑PSS再跑后续仿真。有人图省事改了个偏置电阻后只重跑了PSTB结果相位裕度全变了还找不到原因。记住在周期性仿真这条链路里PSS永远是源头源头一变下游所有结果都要重新生成。这个内容如果后面要扩展我会建议把PSS/PAC/Pnoise的组合应用到比较器或调制器的仿真里去因为这几类电路同样受周期时变效应困扰仿真的思路是相通的。跑斩波运放这一整套周期性仿真说实话难度不在操作而在你有没有耐心把每个基础参数都调到收敛。尤其是PSS很多人一看到报错就急着去改后面仿真里的复杂选项其实大部分问题回到PSS的设置就能解决。仿真器报错大多数时候不是它不行而是你给它的周期描述本身就有问题。我自己的体会是把PSS的谐波数、tstab、maxsidebands这几个参数当成设计规格一样认真对待后面所有结果都会省心很多。最后再提醒一句凡是报告里涉及斩波频率附近边带的指标一定把仿真设置参数一并写清楚不然评审或流片后对比时很难追溯数据是怎么来的。