简介:这份PDF资料聚焦集成电路电路仿真中的周期性稳态(PSS)分析,面向具备一定仿真基础、熟悉Spectre工具的研发人员与技术专家。内容系统讲解PSS分析的功能定位与适用范围,涵盖谐波平衡(HB)与shooting两种求解方法在频域、时域中的差异,并说明其既可处理放大器、滤波器、混频器等受驱动电路,也可处理振荡器等自治电路。资料详细拆解初始瞬态阶段与周期性稳态求解阶段,逐项解析仿真区间、时间步长、初始条件、收敛与输出等参数配置,并针对不同电路类型给出errpreset、cmin、autotstab、hbhomotopy等具体调优建议,帮助读者平衡仿真速度与精度、解决强非线性或快速跳变电路的收敛难题。资源包为1个PDF文件,约623KB,结构紧凑便于查阅。目前已有461人学习,适合需要深入掌握PSS参数配置与收敛排错思路的读者参考。
1. 从一次振荡器不收敛说起:PSS 到底在算什么
如果你跑过振荡器、混频器或者开关电容滤波器的仿真,大概率遇到过这种情况:瞬态跑了几十个周期,波形看着稳了,但一测频率总差那么一点,相位噪声更是没法往下做。问题不在电路,在于你还没拿到真正的周期性稳态解。PSS(Periodic Steady-State)分析要干的事,就是绕过时间常数限制,直接求解电路的周期性工作点——它不关心电路从零状态爬升要多久,只关心“每个周期结束时波形和上个周期完全重合”这个条件。
这份资料围绕 Spectre 的 PSS 分析展开,把谐波平衡(HB)和 shooting 两种引擎的参数、适用边界、收敛技巧拆得很细。它适合已经能跑通瞬态、准备做 PAC/PNOISE/PSP 这类周期性小信号分析的从业者。换句话说,你要做振荡器相位噪声、混频器交调、开关电容滤波器频响,PSS 是绕不开的前置步骤。下面我按“选引擎 → 配参数 → 避坑 → 验证”的顺序,把这份资料里真正能落地的部分拆出来。
2. 选 shooting 还是 HB:先看非线性强度和频率相关元件
PSS 分析有两个求解引擎,选错了轻则慢十倍,重则根本不收敛。资料里给了一条很清晰的判据:弱非线性电路用 HB 效率极高,强非线性电路(信号急剧上升/下降)用 shooting 更稳。但实际选型还要多看一层——电路里有没有频率相关元件。
2.1 两种引擎的数学本质与适用边界
Shooting 方法在时域里干活。它把周期分成若干时间步,猜一个初始状态,然后一个周期一个周期地迭代,直到周期始末状态一致。牛顿法在这里负责修正初始猜测。它的优势是能处理任意强非线性,因为时域波形可以很陡;缺点是仿真时间跟电路时间常数挂钩,如果电路里有大电容慢节点,shooting 的每个周期都要老老实实积分过去。
HB 在频域里干活。它把节点电压展开成傅里叶级数,用谐波数截断,然后在频域解非线性方程。因为频域天然处理延迟、传输线、S 参数数据,所以资料里明确说“处理频率相关元件时 HB 显著优于 shooting”。但 HB 的精度直接受谐波数影响——谐波太少,混叠效应会把误差带进来;谐波太多,矩阵维度爆炸。
我一般这样判断:如果电路是放大器、混频器这类受驱动电路,且非线性不算极端,优先试 HB;如果是振荡器、开关电容电路,或者信号边沿极陡,先上 shooting。资料里还提到一个细节:HB 的harms直接决定求解维度,而 shooting 的harms只影响输出谐波数,不影响精度——精度由errpreset和reltol控制。这个区别很关键,后面避坑章节会展开。
2.2 自治电路与受驱动电路的配置分叉
PSS 能处理两类电路:自治和受驱动。判断方式很直接——如果你在 PSS 语句里指定了一对节点p和n,仿真器就认为你在跑振荡器,电路是自治的;不指定,就按受驱动处理。
受驱动电路需要你给period或sfund,而且必须是驱动信号周期的正确倍数。这里有个常见翻车点:有人填了基频,但电路里有个分频器,实际稳态周期是基频周期的两倍,结果 PSS 怎么都不收敛。自治电路反过来,你没有驱动信号,只能给一个周期估计值,PSS 会自己算精确周期。资料里说自治 PSS 的初始瞬态第三区间长度是四倍period,专门用来监控波形、优化周期估计。
配置上,受驱动电路重点盯period、sfund、autofund;自治电路重点盯oscic、tstab、pinmode(HB 自治时固定节点用)。下面这段是受驱动电路 shooting 的典型配置骨架:
// 受驱动电路 PSS shooting 配置示例 pss pss_analysis \ period=10n \ // 驱动信号周期,必须与电路稳态周期一致 harms=9 \ // shooting 下仅控制输出谐波数,不影响精度 errpreset=moderate \ // 多周期信号交调场景,平衡速度与精度 tstab=100n \ // 额外稳定化时间,帮助收敛 maxperiods=20 \ // 受驱动 shooting 默认 20 次迭代 outputtype=all // 同时输出时域和频域结果逻辑说明:period是硬约束,填错直接导致错误稳态;harms在 shooting 下只决定频域输出几个谐波,不参与收敛判据;errpreset=moderate适合多周期性信号场景,噪声底约 -90dB;tstab给电路额外稳定时间,对含偏置慢启动的电路很有用。
自治电路的配置差异主要在初始化:
// 自治电路(振荡器)PSS shooting 配置示例 pss pss_osc \ period=2.5n \ // 振荡周期估计值,PSS 会自行修正 oscic=lin \ // 线性初始化,适合 LC/晶体振荡器 p n \ // 指定节点对,声明自治电路 tstab=50n \ // 线性初始化后仍建议给非零 tstab maxperiods=50 \ // 自治 shooting 默认 50 次迭代 errpreset=conservative // 振荡器相位噪声要求高,用保守精度参数说明:oscic=lin基于直流解做线性分析估计频率和幅度,不需要脉冲激励;p n节点对是自治电路的声明方式;maxperiods自治默认 50,比受驱动多一倍;errpreset=conservative把数值噪声底压到 -120dB,适合后续做 PNOISE。
2.3 初始瞬态阶段:tstab 与 autotstab 的取舍
PSS 不是一上来就解稳态,它先跑一段初始瞬态,把电路“预热”到接近周期性的状态,再交给 shooting 或 HB 迭代。这段瞬态分三个区间:从tstart到tonset(源进入周期性的最早时间)、可选的tstab稳定化区间、以及受驱动的一个period或自治的四倍period。
tstab是最常被手动干预的参数。设太小,电路还没稳,shooting 迭代次数暴涨;设太大,白白浪费时间。资料里给了autotstab=yes的选项,让仿真器自己决定是否跑 tstab 以及跑多久,通常初始设为 50 个周期,接近稳态就提前终止。我一般先开autotstab=yes跑一遍,看日志里实际用了多少 tstab,再决定是否手动固定。
autosteady配合autotstab用,在 tstab 期间检测稳态。autosteady=1是标准公差,autosteady=2公差更松但可能帮助收敛。注意这两个参数只在tstab>0或autotstab=yes时生效,别设了autosteady却忘了开tstab。
3. 参数配置实战:从 errpreset 到收敛参数
PSS 的参数表很长,但真正需要你动的没几个。资料里反复强调一句话:errpreset多数情况下是你唯一需要调整的参数。这一章把参数分成三组——精度控制、收敛辅助、输出控制——每组说清楚改哪个、怎么改、改了看什么。
3.1 errpreset 三档精度与数值噪声底
errpreset有三个值:liberal、moderate、conservative。资料里给了明确的噪声底估计:弱非线性电路下,liberal 约 -70dB,moderate 约 -90dB,conservative 约 -120dB。线性电路噪声底更低。
选档逻辑很直接:只关心周期性工作点、电路只有一个周期性信号,用liberal;有多个周期性信号、关注交调,用moderate;要做低噪声底分析、精度优先,用conservative。自治电路同理,快速仿真用 liberal,关注精度用 moderate,精度最关键用 conservative。
这里有个容易忽略的约束:errpreset会设定reltol的默认值,而且这个默认值是“合理设置的强制上限”。如果你手动把reltol设得比默认值大,仿真器会忽略你的增大。想放宽reltol,唯一办法是 relaxerrpreset。想收紧,可以在 options 语句里减小reltol。
另外,errpreset除了reltol和maxstep,不会改变你显式设置的任何参数。实际使用的值会打印在日志文件里,跑完扫一眼日志,能确认仿真器到底用了什么。
3.2 收敛辅助参数:maxperiods、cmin、finitediff
maxperiods控制牛顿迭代上限。受驱动 shooting 默认 20,自治 shooting 默认 50,HB 默认 100。如果日志显示迭代到上限还没收敛,先别急着加maxperiods,先查tstab够不够、errpreset是不是太松。
cmin是每个节点到地的最小电容,默认 0。资料里专门提到:如果电路有无寄生电容到地的节点,存在无穷快跳变,Spectre 可能收敛困难。设一个合理的非零cmin通常能显著改善收敛。我一般从 1fF 量级开始试,太大影响带宽,太小不起作用。
finitediff在 shooting 精修后启用有限差分,能消除节点电压/电流分支的偏差,也能细化时间步网格。设no关闭,yes启用,refine启用并尝试细化时间步。注意:如果你用readpss和writepss复用 PSS 结果,finitediff会自动从no改成yes。
maxacfreq用于自动调整maxstep,减少频域混叠误差。默认是所请求最大谐波频率的 4 倍,且不低于基频的 40 倍。如果你发现频域结果高频段有异常抬升,可以手动收紧这个值。
3.3 输出控制:harms、outputtype 与 saveinit
Shooting 默认只输出时域结果。想要频域结果,得指定harms/harmsvec或设outputtype='freq'或'all'。如果请求频域但没指定谐波数,默认 9。
outputtype='freq'会抑制时域波形生成,省内存。harmsvec是harms的替代形式,可以选特定谐波,仅 shooting 有效。
saveinit=yes保存稳态前初始瞬态的波形。调试收敛问题时很有用——你能看到电路在 tstab 阶段到底稳没稳。但注意这会增加输出文件大小,正式跑的时候关掉。
skipstart和skipstop控制输出数据的跳过区间,skipcount控制保存间隔。如果你只关心稳态后几个周期的波形,用这几个参数裁掉前面的瞬态数据。
4. 避坑与排查:五条血泪经验
PSS 的坑大多集中在“看起来收敛了但结果是错的”和“死活不收敛”两类。下面五条是我和周围人实际踩过的,按现象、原因、解决三段写。
4.1 现象:频域结果高频段异常抬升,时域波形看着正常
原因:shooting 下harms只控制输出谐波数,不控制精度。但如果你请求了频域输出,而maxstep太大,时域离散化引入的混叠误差会跑到高频段。资料里说maxacfreq默认是最大谐波频率的 4 倍,但如果你的errpreset是 liberal,maxstep默认值可能偏大。
解决:先确认errpreset是否够用,必要时切到 moderate 或 conservative。然后检查maxacfreq是否被手动改小过。如果还不行,手动收紧maxstep,或者开highorder=yes激活多区间切比雪夫,资料里说这能让数值噪声底至少降 30dB。
4.2 现象:自治电路 PSS 不收敛,日志显示周期估计一直在变
原因:自治电路的周期估计初始值太离谱,或者oscic选的方法不适合电路类型。资料里说oscic=default走瞬态初始化,需要脉冲激励或初始条件;oscic=lin走线性初始化,适合 LC/晶体振荡器;oscic=fastic快但精度低;oscic=skip直接用你给的频率,仅适用于两级法。
解决:LC/晶体振荡器优先试oscic=lin。如果是环形振荡器,oscic=default配合短脉冲激励可能更稳。检查tstab是否够长——自治 PSS 的初始瞬态第三区间是四倍period,如果tstab太短,周期估计还没优化好就进 shooting 了。必要时把maxperiods从 50 加到 100 试试。
4.3 现象:受驱动电路 PSS 收敛,但 PAC/PNOISE 结果不对
原因:PSS 的period填的是驱动信号基频周期,但电路里有分频或倍频,实际稳态周期是基频的整数倍。PSS 收敛到了一个“看起来周期性”的解,但不是真正的稳态。
解决:确认电路稳态周期与驱动信号周期的关系。如果有分频器,period要填分频后的周期。资料里明确说“分析必须使用驱动信号周期的正确倍数”。另外检查autofund是否被误设为yes——它会忽略你给的period/fund,从源信息自动算基频,可能算错。
4.4 现象:日志报 GMRES 范数缩减不足,HB 迭代停滞
原因:HB 大信号分析的线性矩阵求解器迭代次数不够。资料里说krylov_size默认 10,如果达到迭代次数后收敛速度仍差,会强制终止。
解决:增大krylov_size,比如从 10 加到 20 或 30。同时检查hbprecond_solver是否选了合适的预条件求解器,默认basicsolver,可以试blocksolver或autoset。如果内存够,lowmem=0关闭低内存模式;如果内存紧张,lowmem=1开标准低内存模式,或者设一个大于 10 的数让 Spectre 按 GB 解读内存请求。
4.5 现象:设了 ic 语句但仿真开始时波形跳变,甚至不收敛
原因:资料里专门警告过——用ic语句可能指定“无法由电抗元件维持”的初始条件。比如设置节点电压但该节点无到地电容路径,或设置电感支路电流但该支路无电感。不一致的初始状态会导致仿真区间开始时解跳变,Spectre 调整时可能收敛困难。
解决:检查ic语句对应的节点是否有电抗元件支撑。如果没有,要么加cmin提供到地电容路径,要么改用ic=dc让仿真器自己算直流解。skipdc=yes跳过直流分析时也要小心——资料里说如果电路直流解存在瞬态尖峰,跟踪尖峰比找真实直流解更耗时,不该用这个参数。
5. 进阶验证:用 readpss/writepss 复用结果与 PPV 提取
PSS 跑一次动辄几分钟到几十分钟,能复用结果就别重跑。资料里给了writepss和readpss两个参数,但用的时候有几个硬约束。
5.1 writepss/readpss 的正确用法与限制
writepss把收敛后的稳态解写到文件。readpss从文件读先前收敛的稳态解。但资料里明确说:shooting 和 HB 的文件不可互相复用。shooting QPSS 的结果不能用于 HB QPSS,反之亦然。
Shooting 的readpss流程是:加载方程并检查电路残差,残差满足要求就复用解,否则用有限差分法重新收敛。checkpss=yes会检查条件是否变化,变了就重跑 PSS;checkpss=no则假设无变化,直接用文件里的解,不再跑 PSS。仅 shooting 有效。
我一般这样用:第一次跑 PSS 时设writepss="pss_sol",后续如果只改了输出设置或小信号分析参数,设readpss="pss_sol"和checkpss=yes,让仿真器判断能否复用。如果改了电路拓扑或激励幅度,checkpss会触发重跑,不会拿到错误结果。
// 第一次跑:写入稳态解 pss pss_first \ period=10n \ writepss="pss_sol" \ errpreset=moderate // 后续跑:读取稳态解,检查条件变化 pss pss_reuse \ period=10n \ readpss="pss_sol" \ checkpss=yes \ errpreset=moderate逻辑说明:writepss指定输出文件名;readpss指定输入文件名;checkpss=yes让仿真器检查条件变化,避免复用错误解。注意finitediff在readpss/writepss场景下会自动从no改成yes,这是资料里明确写的。
5.2 振荡器 PPV 提取与后续分析衔接
资料里提到ppv=yes保存振荡器的扰动投影向量(PPV),反映振荡器节点对电压/电流扰动的相位敏感度。这个向量是做振荡器相位噪声分析的关键中间量。如果你后续要跑 PNOISE 或 PSP,开ppv=yes能省不少事。
PSS 收敛后,周期性工作点可以直接喂给 PAC、PXF、PNOISE、PSP、PSTB 这些周期性小信号分析。资料里说 PSS 分析可确定电路的周期性工作点,该工作点随后可用于这些分析。实际流程是:先跑 PSS 拿到稳态解,再在同一个仿真会话里跑小信号分析,仿真器会自动复用 PSS 的工作点。
验证 PSS 结果是否可信,我一般看三个地方:日志里的相对收敛范数是否降到判据以下;时域波形周期始末是否重合;频域谐波幅度是否随阶数合理衰减。如果谐波幅度不衰减反而抬升,多半是混叠或收敛不充分。
5.3 一个具体技巧:用 autosteady=2 救回临界收敛
资料里提到autosteady=2以比autosteady=1更低的稳态公差运行,可能有助于收敛,但会增加 tstab 开销。我遇到过几次 PSS 在autosteady=1下反复震荡不收敛,切到autosteady=2后顺利收敛的情况。代价是 tstab 阶段多跑一些周期,但比完全不收敛强。
用法是配合autotstab=yes或手动设tstab>0:
pss pss_hard \ period=10n \ tstab=200n \ autosteady=2 \ // 更松的稳态公差,帮助临界收敛 errpreset=moderate \ maxperiods=50注意autosteady=2不是万能药。如果电路本身有错误——比如period填错、拓扑有冲突——再松的公差也救不回来。我一般先确认电路和激励没问题,再试autosteady=2。
从那以后我每次跑 PSS 都强制走一遍流程:先autotstab=yes看实际 tstab 需求,再根据电路类型选oscic或period,然后errpreset从 moderate 起步,收敛困难才动cmin和autosteady。这套流程帮我省掉了大量反复试参数的时间。希望帮到你。
本文还有配套的精品资源,点击获取