4. 瞬态仿真中的收敛与精度调试

开关电容电路是瞬态仿真中最容易“翻车”的一类对象:时钟跳变瞬间,电容通过开关在极短时间内与另一节点交换电荷,节点电压出现陡峭阶跃;而在时钟保持阶段,电路又几乎静止。这种“快变—静止—快变”的强非线性时变特征,会同时触发三类典型问题:不收敛(Newton 迭代无法在给定迭代次数内满足容差)、时间步长被压得过小(仿真推进极慢甚至停滞)、以及精度与速度的矛盾(放宽容差后波形失真,收紧容差后仿真时间不可接受)。本节以典型开关电容积分器为例,说明如何用 .option、.method、ic、nodeset 等手段完成调试。

先定位:是“不收敛”还是“步长太小”

Spectre 在瞬态分析中报错通常分两类。第一类是 Newton iteration failed to converge,出现在某个时间点反复迭代仍不满足 reltol/abstol;第二类是 Time step too small 或仿真进度长时间停在某一时刻,说明 trtol 与局部截断误差控制把步长压到了 tmin 以下。两者处理思路不同:前者要改善迭代收敛性,后者要放松步长控制或消除电路中的“硬跳变”。

调试前先建立参照约定:本文所有节点电压均以地为参考,时钟高电平记为 VDD,低电平记为 0;电荷守恒以电容上极板为观察点。开关用理想电压控制开关建模,导通电阻 Ron=1kΩ,关断电阻 Roff=1GΩ,时钟周期 T=1μs,占空比 50%,上升/下降时间 tr=tf=1ns。这些是教学示例参数,实际值需按工艺与设计调整。

开关电容积分器瞬态仿真:收敛与精度调试路径 被仿真对象(示例) Vin φ1 Cs φ2 GND φ1 采样,φ2 积分;时钟跳变处为收敛难点 两类典型报错 ① Newton iteration failed 迭代不收敛:容差/初值/非线性 → 调 option、ic、nodeset ② Time step too small 步长被压至 tmin:硬跳变/trtol → 调 method、trtol、tmin 四类调试手段 .option:reltol / abstol / vntol / itl1 .method:gear2 / trap / traponly ic:强制初始节点电压 nodeset:给迭代一个起点 调试决策顺序(先易后难,先局部后全局) 1. 看报错类型 收敛 / 步长 2. 加 ic / nodeset 给初值,避免盲迭代 3. 调 option 容差 reltol/abstol/itl1 4. 换 method gear2 更稳,trap 更准 5. 验证 电荷守恒 若仍不收敛:回到第 2 步,检查 ic/nodeset 是否与电路真实工作点冲突,或减小 trtol 与 tmin 的激进程度 核心原则:先给“合理起点”(ic/nodeset),再放“迭代空间”(option),最后选“积分器”(method)

用 ic 与 nodeset 给迭代一个合理起点

开关电容电路在 t=0 时,电容电压往往未知。若直接让 Spectre 从全 0 开始迭代,时钟跳变瞬间的电荷再分配会让 Newton 迭代在“全 0”与“真实解”之间来回震荡。此时最有效的手段是 ic 与 nodeset。

ic 是强制初始条件,它把节点电压在 t=0 时刻钉死,并参与直流工作点计算;nodeset 只是给迭代一个初始猜测,不强制保持。对开关电容积分器,若已知复位阶段输出为 0,可写:

ic v(out)=0 v(x1)=0
nodeset v(out)=0 v(x1)=0.5

注意 ic 与 nodeset 不要同时把同一节点设成互相矛盾的值,否则会人为制造不收敛。经验做法是:对确定已知的复位节点用 ic,对不确定的中间节点用 nodeset 给一个接近预期的值。若电路有多个稳定工作点,nodeset 还能帮助收敛到目标解。

用 .option 调整迭代容差与迭代次数

当 ic/nodeset 仍不能解决时,检查是否容差过紧。Spectre 默认 reltol=1e-3、abstol=1e-12、vntol=1e-6、itl1=100。对开关电容电路,可先适度放宽:

simulator lang=spectre
option reltol=1e-4 abstol=1e-11 vntol=1e-5 itl1=200

这里 reltol 从 1e-3 收紧到 1e-4 是为了精度,但会加重迭代负担;itl1 从 100 提到 200 是给 Newton 更多迭代机会。若仍不收敛,可临时把 reltol 放宽到 1e-3 甚至 5e-3 先跑通,再逐步收紧验证。需要强调的是,放宽容差是诊断手段,不是最终交付状态;最终精度必须回到设计要求的量级。

用 .method 选择积分方法

Spectre 瞬态默认使用 trap(梯形法),精度高但可能在陡变处产生数值振荡;gear2 阻尼更强,适合开关电容这类含跳变的电路,代价是精度略低。切换方式:

method trap
method gear2
method traponly

实际调试中,若波形在时钟跳变后出现非物理的振铃,优先试 gear2;若 gear2 导致波形过度平滑、丢失细节,再回到 trap 并配合更小的 trtol。此外 method 还可设置 maxstep,例如 method trap maxstep=10n,强制最大步长不超过 10ns,避免在保持阶段步长被放得过大而漏掉跳变。

精度与速度的矛盾:用 trtol 与 tmin 做权衡

trtol 控制局部截断误差与步长的关系,默认约 7。减小 trtol 会强制更小步长、更高精度,但速度下降;增大则相反。当出现 Time step too small 时,可先检查是否 trtol 过小或 tmin 设置过激。示例:

option trtol=7 tmin=1e-15

若仿真在时钟边沿附近卡住,可把 tmin 从 1e-15 放宽到 1e-12,同时把时钟上升/下降时间从 1ns 改为 10ns(若电路允许),让跳变不再“硬”。这是从源头消除步长过小,而不是一味放宽容差。

调试闭环与结果判读

完成上述调整后,用三个指标判断是否达标:其一,仿真能完整跑完设定时长且无收敛报错;其二,输出波形在时钟保持阶段应平坦,跳变处无持续振铃;其三,用 ic 设定的初始电荷与最终输出做电荷守恒核对,误差应在 reltol 量级内。若三者都满足,说明收敛与精度已平衡;若仍不满足,回到 nodeset 检查初值是否与真实工作点冲突,或检查开关模型是否存在 Ron 过小导致的刚性。

调试顺序建议:先 ic/nodeset 给初值,再 option 放容差,最后 method 换积分器。每一步只改一个变量,便于定位真正原因。
不要用“把 reltol 放到 0.1”这种方式强行跑通后直接交付;这会让开关电容的电荷转移误差被掩盖,后续 AC 或噪声仿真结果不可信。