はじめに
本記事は、SPICE系シミュレータの過渡解析における時間ステップ制御と誤差推定の考え方を、台形法 と Gear 法(BDF)を中心に整理し、以前の記事 理論上の数値積分誤差とSPICE実装の違い からさらに解説を深掘りするものです。
以前の記事では説明が不十分だった誤差推定の系統分類や、実装ごとの使い分けについて、本記事では以下の点を主眼に置いて解説しています。
- 誤差推定の二大系統: 回路の物理量(電荷/磁束)に基づく誤差推定と、数値計算上の予測子–修正子差分に基づく誤差推定の違いを明確にします。
- 主要シミュレータの方式比較: SPICE 2g6 / SPICE 3f5 / ngspice / LTspice / HSPICE / Spectre / QSPICE といった各派生シミュレータがどの方式を採用し、どのような設計思想を持つかを比較します。
- Spectreの設計思想: なぜSpectreが電圧(および電流)の差分を直接誤差として管理するのか、その背景と利点を解説します。
- 実践的な調整方法: 具体的なシミュレーションの場面で、どのようにオプションを調整すればよいかを、その理由と共に詳述します。
以降では、基礎となる回路方程式から始め、誤差制御の核心部分、そして実践的なチューニング方法までを順番に説明します。
1. 回路方程式と数値積分の前提
1.1 修正ノード解析(MNA)と微分代数方程式(DAE)
SPICEシミュレータは、回路網を修正ノード解析(Modified Nodal Analysis, MNA) を用いて連立方程式に変換します。MNAは、各ノードにおけるキルヒホッフの電流則(KCL)を基本とし、インダクタの電流や電圧源の電流などを未知数として追加します。
これにより、回路は以下のような微分代数方程式(Differential-Algebraic Equation, DAE) の形で表現されます。
$$
\frac{d\mathbf{q}(\mathbf{v})}{dt} + \mathbf{f}(\mathbf{v}) = \mathbf{s}(t)
$$
各項の意味は以下の通りです。
- $\mathbf{v}$: ノード電圧やインダクタ電流など、回路の状態を表すベクトル。
- $\mathbf{q}(\mathbf{v})$: 蓄積量を表すベクトル。コンデンサの電荷量 ($q=Cv$) やインダクタの磁束量 ($\phi=Li$) がこれにあたります。この項が微分形式で含まれるため、方程式は「微分方程式」の性質を持ちます。
- $\mathbf{f}(\mathbf{v})$: 抵抗やトランジスタなどの静的な素子を流れる電流の総和。この項は代数的な関係(例: $I=V/R$)を表します。
- $\mathbf{s}(t)$: 独立電流源や独立電圧源などの外部からの入力(励振源)を表すベクトル。
この方程式を時間 $t$ について解くことで、過渡解析の結果(各ノード電圧や素子電流の時間変化)が得られます。しかし、この式を解析的に解くことは困難なため、コンピュータ上で時間を離散化して数値的に解く数値積分が必要となります。
1.2 代表的な数値積分法
DAEを解くために、SPICEでは主に以下の時間離散化手法(数値積分法)が用いられます。
台形法 (Trapezoidal Rule)
現在のステップ $t_n$ から次のステップ $t_{n+1}$ への変化を台形で近似する手法です。
A安定という優れた特性を持ち、振動的な解でも安定して計算できます。しかし、L安定ではないため、急峻な変化の後に発生する高周波の数値的な振動(リンギング)を十分に減衰させられないことがあります。これは、台形法の増幅係数が高周波領域で1に近い値を持つため、数値的な高周波成分が時間とともに減衰しにくいという特性に起因します。特に高Q値の共振回路や理想的なスイッチング回路で問題となることがあります。
Gear法(BDF: 後退差分公式)
**後退差分公式(Backward Differentiation Formula)**の総称で、SPICEでは次数を自動で変更する可変次数法として実装されることが一般的です。
- 1次BDFは後退オイラー法とも呼ばれ、非常に安定性が高い(L安定)ですが、精度は低いです。
- 2次BDFはA安定かつL安定であり、安定性と精度のバランスが良いため、多くのシミュレータでデフォルトまたは主要な選択肢とされています。
- 3次以上のBDFはA安定ではなくなりますが、滑らかな波形に対してはより高い精度を発揮します。
BDFは数値的ダンピング(数値計算上の減衰効果)が台形法より強いため、剛性(Stiff)の強い問題(時定数が大きく異なる回路)で安定しやすく、台形法のリンギングを抑制する効果があります。一方で、その減衰効果が鋭い過渡応答をわずかに「なまらせる(丸める)」傾向もあります。
2. 誤差の用語整理と次数則
シミュレータは、計算精度を保ちながら可能な限り大きな時間ステップで計算を進めようとします。そのために、1ステップごとに発生する誤差を監視し、ステップ幅を動的に調整します。
局所離散誤差(LTE: Local Truncation Error)
数値積分を1ステップ進める際に生じる、真の解とのズレを指します。これは、連続的な微分方程式を離散的な差分式で近似することによって本質的に発生する誤差です。BDFの次数を $p$、時間ステップ幅を $h$ とすると、理論上のLTEはステップ幅の $p+1$ 乗に比例します ($\mathrm{LTE}=O(h^{p+1})$)。
累積誤差(GTE: Global Truncation Error)
シミュレーション開始からある時間までに積み重なった誤差の総量です。一般的に、LTEが小さければGTEも小さく抑えられます。BDFの場合、GTEはステップ幅の $p$ 乗に比例します ($\mathrm{GTE}=O(h^{p})$)。
SPICEは直接GTEを管理できないため、各ステップのLTEを一定の許容値以下に抑えることで、間接的にGTEを制御します。
ステップ幅の更新
ステップ幅 $h$ の更新は、推定された正規化誤差 $E$ を用いて、次の式に基づいて行われるのが一般的です。
$$
h_{\text{new}} = h \cdot \text{safety} \cdot E^{-\frac{1}{p+1}}
$$
- $E$ が許容値(通常1.0)より大きい場合、ステップは棄却され、より小さな $h$ で再計算されます。
- $E$ が許容値以下の場合、ステップは受理され、次のステップ幅 $h_{\text{new}}$ がこの式で計算されます。
- $\text{safety}$ は急激なステップ変更を避けるための安全係数(通常0.8〜0.9程度)です。
- シミュレーションの安定性のため、$h_{\text{new}}$ は予め定められた最小値 $h_{\min}$ と最大値 $h_{\max}$ の範囲に制限されます。
3. 誤差推定は二系統ある
シミュレータがLTEをどのように推定(計算)するかには、大きく分けて二つの流儀があります。この違いを理解することが、シミュレータのオプションを適切に使いこなす鍵となります。
注意: 以下の説明における各シミュレータの採用方式は、デフォルト設定またはバージョンによって異なる場合があります。詳細は各シミュレータのドキュメントを参照してください。
3.1 電荷/磁束ベースのLTE(Berkeley SPICE 直系)
SPICE2g6から続く伝統的な手法で、ngspice, LTspice, QSPICEなどが採用しています。この方式は、回路方程式の微分項 $\frac{d\mathbf{q}(\mathbf{v})}{dt}$ に着目します。
考え方:
数値積分の誤差は、状態量 $\mathbf{q}$(電荷や磁束)の近似精度に直接現れます。そこで、高次の項をテイラー展開などを用いて評価し、$\mathbf{q}$ のLTEを推定します。この推定された電荷/磁束の誤差 $\Delta q$ を、ユーザーが設定した許容誤差で正規化して、ステップ受理の可否を判断します。
各状態量 $i$ に対する正規化は、典型的には以下のように行われます。
$$
\mathrm{scale}_i = \mathrm{abstol}_i + \mathrm{reltol} \cdot \max\bigl(|x_i|,|x_i^{\mathrm{pred}}|\bigr)
$$
$$
E = \sqrt{\frac{1}{N}\sum_i\left(\frac{\Delta x_i}{\mathrm{scale}_i}\right)^2}
$$
ここで重要なオプションが CHGTOL(電荷の絶対許容誤差)と TRTOL です。CHGTOL は微小な容量を持つノードの精度を保つために重要です。TRTOL はLTEの推定値をスケーリングする係数で、実質的に誤差評価の厳しさを調整する役割を果たします。
3.2 予測子–修正子(P–C)差分ベース
Spectreなどが採用する、より数値解析的なアプローチです。多段法であるGear法などと非常に相性が良い手法です。
考え方:
- 予測子 (Predictor): 現在までの解の履歴から、次の時刻 $t_{n+1}$ の解 $x_{n+1}^{\mathrm{pred}}$ を明示的に予測します。
- 修正子 (Corrector): 予測した解を初期値として、非線形方程式(ニュートン法)を解き、より正確な解 $x_{n+1}^{\mathrm{corr}}$ を求めます。
このとき、予測子解と修正子解の差分 $(x_{n+1}^{\mathrm{corr}}-x_{n+1}^{\mathrm{pred}})$ は、そのステップで発生したLTEの良い代理指標となることが知られています。この差分が大きければ誤差が大きく、小さければ誤差も小さいと判断できます。
Spectreはこの差分を電圧や電流の単位で直接評価します。したがって、CHGTOL のような電荷に関する許容誤差は存在せず、代わりに vabstol (電圧の絶対許容誤差) や iabstol (電流の絶対許容誤差) と、それらの許容誤差に対するLTEの比率を制御する lteratio というオプションで精度を管理します。
3.3 HSPICE の DVDT 系
HSPICEは、歴史的な経緯から両方の系統を選択できる柔軟なアーキテクチャを持っています。
オプション LVLTIM によって制御方式を切り替えられます。
- LVLTIM=2: 伝統的な電荷/磁束ベースのLTE制御。精度を重視する場合に選択されます。
- LVLTIM=1/3: DVDT (dv/dt) 制御系。これはP–C差分ベースに近い考え方で、電圧や状態変数の時間変化率を重視します。収束性が良く、高速なシミュレーションが期待できるため、大規模なデジタル回路などで有効です。
4. 時間ステップと次数の自動制御の流れ
どのシミュレータも、内部では以下のようなループを回して時間ステップを制御しています。この流れを理解することで、なぜシミュレーションが遅くなったり、収束しなくなったりするのかを推測する助けになります。
時間ステップ自動制御のフロー
-
予測 (Prediction):
過去の解を用いて、次の時刻の解を外挿(予測)します。 -
修正 (Correction):
予測値を初期値として非線形ソルバー(ニュートン・ラフソン法)を反復計算し、回路方程式を満たす解を求めます。ここで収束しない場合は、時間ステップを縮小してリトライします("Time step too small" エラーの原因の一つ)。 -
誤差推定 (Error Estimation):
「3. 誤差推定は二系統ある」で説明した手法のいずれかを用いて、このステップで発生したLTEを計算します。 -
受理/棄却 (Accept/Reject):
推定された誤差が許容値以下であれば、計算結果を受理して時間を進めます。許容値を超えた場合は、計算結果を破棄(棄却)し、時間ステップを縮小して再度ステップ2からやり直します。 -
次ステップ調整 (Next Step Control):
ステップが受理された場合、誤差の大きさに基づいて次のステップ幅を計算します。誤差が許容値よりずっと小さければステップを拡大し、許容値ぎりぎりであればステップを維持またはわずかに縮小します。 -
次数制御 (Order Control):
可変次数のGear法を使っている場合、最近の数ステップの誤差の傾向を分析し、より効率的(大きなステップで進める)と判断されれば積分次数を上げ、不安定であれば次数を下げます。
フローチャート
以下に、時間ステップ自動制御の全体的な流れを視覚化したフローチャートを示します。
このフローチャートから、以下の重要なポイントが読み取れます:
- 収束失敗時のリトライ: ニュートン法が収束しない場合、ステップを半分にして再試行します。これが繰り返されると "Time step too small" エラーになります。
- 誤差推定方式の分岐: 電荷/磁束ベースとP-C差分ベースで、使用するオプションが異なります。
- 受理/棄却の判定: 正規化誤差 E が 1.0 を超えると、計算結果は破棄され、より小さなステップで再計算されます。
- 適応的ステップ制御: 誤差が小さければステップを拡大し、大きければ縮小することで、効率と精度のバランスを取ります。
5. 派生ごとの方式と主要オプション
| シミュレータ | 誤差推定の主軸 | 使い分け・補足 | 主な関連オプション |
|---|---|---|---|
| SPICE2g6 | 電荷/磁束ベースLTE | 台形 / Gear(可変次数)。LVLTIM=2 がLTE(既定)。LVLTIM=1 はiteration・dv/dt系に近い簡易制御で、収束性を優先する古い方式。 | .OPTIONS reltol, abstol, vntol, chgtol, trtol, lvltim / method=trapezoidal or gear / maxord |
| SPICE3f5 | 電荷/磁束ベースLTE | 台形 / Gear。デバイスモデル側でLTEを見積もり(TRUNC)、回路方程式ソルバー側で集約してステップを制御する構造が確立された。 | .options trtol, reltol, vntol / method=trap or gear / maxord |
| ngspice | 電荷/磁束ベースLTE | 既定は台形法。method=gear も選択可能。誤差判定はSPICE3f5の思想を継承し、LTEで一貫している。 | .options trtol, chgtol, reltol, abstol / method=gear or trap / maxord |
| LTspice | 電荷/磁束ベースLTE | 既定は数値的ダンピングを少し加えた修正台形法 (modified trap)。method=gear も選べるが、リンギング抑制より波形忠実性を重視する思想から、常用は非推奨とされることが多い。 | コントロールパネルや .options で trtol, chgtol, reltol, abstol など |
| HSPICE | DVDT と LTE を切替 | LVLTIM=1/3 がDVDT(P-C差分系)、LVLTIM=2 がLTE(電荷系)。デジタル回路など速度優先ならDVDT、アナログ回路で精度優先ならLTEが選択される傾向がある。 | .OPTION lvltim, trtol, chgtol, relq / method=gear or trap |
| Spectre | P–C差分(電圧/電流) | 積分法は euler, trap, gear2 等から選択。誤差判定は電圧/電流の絶対・相対許容値と lteratio で管理する一貫した設計。物理量(電荷)ではなく、観測量(電圧/電流)で誤差を直接制御する思想。 | reltol, vabstol, iabstol, lteratio / method=euler or trap or gear2 |
| QSPICE | 電荷/磁束ベースLTE | 既定は台形法。method=gear も可能。スイッチング電源などリンギングが問題になりやすい回路での利用が想定されており、trtol や最大ステップ調整が重要なチューニング項目となる。 | .option trtol=..., chgtol=..., method=gear or trap |
注意: シミュレータによってオプション名が異なる場合があります(例:
maxstep,tstep,maxtstepなど)。詳細は各シミュレータのマニュアルを参照してください。
5.1 積分法のパフォーマンス比較
典型的な回路タイプごとに、台形法とGear法の相対的な性能を比較したデータを以下に示します。
典型的な回路での比較表
| 回路タイプ | 台形法 | Gear2 | 相対精度 | 計算時間比 | 推奨事項 |
|---|---|---|---|---|---|
| RC回路 (τ=1ms) | 基準 | 1.2倍遅い | 同等 | Gear/Trap = 1.2 | 台形法で十分 |
| LC共振 (Q=100) | 基準 | 0.8倍速い | 台形法が優秀 | Gear/Trap = 0.8 | 位相精度重視なら台形法 |
| スイッチング電源 | リンギングあり | 安定 | Gearが優秀 | Gear/Trap = 0.7 | Gear2推奨 |
| PLL (ロック過程) | 基準 | 位相誤差大 | 台形法が優秀 | Gear/Trap = 1.5 | 台形法必須 |
| デジタル回路 (大規模) | やや不安定 | 安定 | Gearがやや優秀 | Gear/Trap = 0.9 | Gear2またはDVDT |
| MEMS/機械系 | 基準 | 1.1倍遅い | Gearが優秀 | Gear/Trap = 1.1 | 剛性問題ならGear |
注意点:
- 計算時間比は回路規模や非線形性により大きく変動します
- Q値が高い(100以上)共振回路では台形法の位相精度が重要になります
- スイッチング回路では、Gear法のダンピング効果が実用上有利に働きます
6. シミュレーション時の調整
状況別に、変更を検討するオプションの優先順を具体的に示します。
6.1 台形法のリンギングが気になる
台形法はL安定でないため、急峻な信号変化の後に数値的な高周波振動(リンギング)が残ることがあります。
-
出力刻みと最大ステップを小さくする (
maxstep):
リンギング自体を抑制する効果は限定的ですが、振動を観測しやすくします。また、maxstepを小さくすることで、シミュレータがステップを拡大しすぎるのを防ぎ、結果的に安定化に寄与することがあります。 -
TRTOL を小さくする(例: 7 → 2):
誤差評価を厳しくすることで、シミュレータはより小さなステップ幅を使わざるを得なくなり、高周波成分の追従性が向上し、リンギングが抑制される場合があります。(Spectreではlteratioを下げすぎると逆に不安定になることがあるため注意が必要です)。 -
Gear法(2次)を試す (
method=gear,maxord=2):
Gear法は数値的ダンピングが強いため、リンギングを効果的に抑制します。ただし、高Q値の共振回路などでは、本来の振動まで減衰させてしまう「波形が痩せる」現象が起きないか確認が必要です。 -
物理的な減衰を追加する:
シミュレーション上のリンギングが、実は現実の回路で寄生抵抗や寄生容量によって減衰するはずの成分である場合もあります。モデルに微小な抵抗(R)や容量(C)を追加することで、より現実に近い安定した結果が得られることがあります。
6.1.1 スイッチング電源での台形法リンギングの実例
実際の回路例を用いて、台形法とGear法の違いを観察してみましょう。
* Buck Converter Example - 台形法リンギング観察用
.subckt buck_converter vin vout
L1 sw vout 10u
C1 vout 0 100u ESR=0.01
D1 0 sw diode
S1 vin sw ctrl 0 switch
.model switch SW(Ron=0.01 Roff=1Meg Vt=1.5)
.model diode D(Is=1e-14 Rs=0.01)
.ends
* テストベンチ
Vin in 0 DC 12
Xbuck in out buck_converter
Vctrl ctrl 0 PULSE(0 3 0 10n 10n 1u 2u)
Rload out 0 1
* === 台形法(デフォルト)- リンギング発生 ===
.tran 10n 100u 0 10n method=trap
* この設定では、スイッチング直後に高周波のリンギングが観察される
* === Gear法 - リンギング抑制 ===
*.tran 10n 100u 0 10n method=gear maxord=2
* Gear法に切り替えると、リンギングが大幅に抑制される
* === 台形法でTRTOLを厳しくする ===
*.option trtol=2
*.tran 10n 100u 0 10n method=trap
* TRTOLを厳しくすることで、ステップが細かくなり、リンギングが軽減
.probe v(out) v(sw) i(L1)
.end
実行結果の典型的な傾向:
- 台形法(デフォルト): スイッチング直後に 100kHz~1MHz程度の数値的な振動が現れる
- Gear法(maxord=2): 振動が効果的に抑制されるが、立ち上がり波形がわずかに鈍る
- 台形法+TRTOL=2: 振動は残るが振幅が小さくなり、計算時間は約1.5倍に増加
6.2 収束が不安定・時間がかかる
"Time step too small" などのエラーで停止したり、シミュレーションが異常に遅くなったりする場合の対策です。
-
最大ステップ (
maxstep) を少し大きくし、TRTOL を少し緩める:
過度に厳しい制約が、かえってステップ制御を不安定にしている可能性があります。少し制約を緩めることで、スムーズに計算が進むことがあります。 -
HSPICE で DVDT 系を試す (
LVLTIM=1または3):
DVDT系は収束性が良いとされるため、特に大規模な回路で効果が期待できます。 -
Gear法(2次)に切り替える:
L安定であるため、台形法では不安定になるような剛性の強い問題に対して安定しやすいです。 -
ニュートン法関連のオプションを緩和する:
ITL4(DC/Tranでの反復回数上限) の増加、GMIN(最小コンダクタンス) の調整、Source Stepping (電源の段階的投入) など、時間ステップ制御とは別の収束改善策も有効です。
6.3 微小容量が効く精度問題
チャージポンプやスイッチドキャパシタ回路など、微小な電荷の移動が重要な回路での対策です。
-
電荷ベース(SPICE直系):
CHGTOLを小さめに設定します(例:1e-14→1e-16)。これにより、微小な電荷量の誤差も検出できるようになり、精度が向上します。 -
電圧ベース(Spectre):
vabstolを小さく設定します。微小容量 $C$ における電荷の誤差 $\Delta q = C \Delta v$ は、電圧の誤差 $\Delta v$ に比例するため、vabstolを厳しくすることが直接的に精度向上に繋がります。reltolやlteratioも整合性を取るように見直します。
6.3.1 チャージポンプの高精度シミュレーション
チャージポンプ回路では、pFオーダーのフライングキャパシタによる電荷転送の精度が重要になります。以下に、精度問題とその対策例を示します。
* Dickson Charge Pump - 微小容量精度問題の例
.subckt charge_pump_stage vin vout clk clkb
* フライングキャパシタ(微小容量)
Cfly n1 vout 1p
* スイッチ(理想化)
S1 vin n1 clk 0 SW1
S2 n1 vout clkb 0 SW1
.model SW1 SW(Ron=100 Roff=1G Vt=0.5)
.ends
* 4段チャージポンプ
Vin in 0 DC 1.0
X1 in n1 clk clkb charge_pump_stage
X2 n1 n2 clkb clk charge_pump_stage
X3 n2 n3 clk clkb charge_pump_stage
X4 n3 out clkb clk charge_pump_stage
Cload out 0 10p
Rload out 0 10Meg
* クロック生成
Vclk clk 0 PULSE(0 1 0 1n 1n 50n 100n)
Vclkb clkb 0 PULSE(1 0 0 1n 1n 50n 100n)
* === 問題のある設定(デフォルト) ===
.tran 1n 10u
* 出力電圧が理論値(約4V)に達しない。電荷の累積誤差が原因。
* === 対策1: CHGTOLを厳しくする ===
.option chgtol=1e-16 ; デフォルト1e-14から強化
*.tran 1n 10u
* 微小電荷の転送精度が向上し、理論値に近づく
* === 対策2: TRTOLも併せて調整 ===
.option chgtol=1e-16 trtol=1
*.tran 1n 10u
* より高精度だが、計算時間は約2倍に
* === 対策3: 初期過渡の詳細解析 ===
.option ITL3=10 ITL4=20 ; 初期ステップの反復回数増加
.option chgtol=1e-16
*.tran 1n 10u
* === 診断用: 電荷を直接モニタ ===
.save @x1.cfly[q] ; フライングキャパシタの電荷を保存
.probe v(out) v(n1) v(n2) v(n3) @x1.cfly[q]
.end
トラブルシューティングのポイント:
-
症状の確認:
- 出力電圧が理論値に達しない → 電荷転送の累積誤差
- 電圧リップルが異常に大きい → 各サイクルでの電荷計算誤差
- 起動時間が異常に長い → 初期の電荷蓄積計算の誤差
-
段階的な対策:
- まず
CHGTOLのみを調整して改善を確認 - 必要に応じて
TRTOLも併せて調整 - それでも不十分な場合は、ニュートン反復の設定も見直す
- まず
-
検証方法:
-
.save @c[q]で電荷を直接観測し、理論値と比較 - 各ノードの電圧波形から、電荷保存則が満たされているか確認
- FFT解析で異常な周波数成分がないか確認
-
7. よくある症状と対策
| 症状 | ありがちな原因 | 手早い対処 |
|---|---|---|
| 台形で高周波の波打ち | L安定ではない性質による数値的リンギング / イベント点のサンプリング不足 | maxstep を縮小 / TRTOL を厳しくする / それでもダメなら method=gear (maxord=2) を試す |
| 収束が途切れる | ステップ刻みが急変点に対して大きすぎる / 非線形性が急峻でニュートン法が発散 | maxstep を縮小 / HSPICEならDVDT系(lvltim=1) / method=gear / DC収束オプション(Gmin等)を調整 |
| 波形がやせる/なまる | Gear法の数値ダンピングが過剰に効いている / 積分次数が高い | method=trap へ戻す / maxord=2 に制限する / TRTOL を厳しくしてステップを細かくする |
| シミュレーションが遅い | 許容誤差が厳しすぎる / 出力点が多すぎる | TRTOL や lteratio を緩める / 出力刻みを粗くする / 一時的にDVDT系を試す(HSPICE) |
| 微小信号が消える | 電荷/電圧の絶対許容誤差が粗すぎる | CHGTOLを小さく(電荷系)/ vabstolを小さく(電圧系) |
| 起動時の異常な振動 | 初期条件の不整合 / DC解析の精度不足 | .IC文で初期条件を明示 / DC収束オプションを調整 |
8. 設定例
実装やバージョンで名称が異なる場合があります。あくまで典型例です。
ngspice / SPICE 3f5 / SPICE 2g6
.options method=gear maxord=2 trtol=7 chgtol=1e-14
.tran 1n 10u 0 100p
LTspice
; Control Panel もしくは .options で設定
.options trtol=2
; リンギングがひどい場合の診断目的で試す
.options method=gear
HSPICE
* 精度を重視するアナログ回路向け
.option method=gear lvltim=2
* 速度を重視する大規模デジタル回路向け
.option method=trap lvltim=3
Spectre
// errpreset=moderate (中間的な設定) を基準に調整
// methodにgear2onlyを指定すると、BDF2次のみを使用する
tran stop=10u maxstep=100p method=gear2only errpreset=conservative
QSPICE
.option trtol=7
; スイッチング回路のリンギング対策
.option method=gear
9. FAQ
Q. 台形法とGear法のどちらを最初に使えばよいですか?
A. まずはデフォルト設定(多くは台形法)で試すのが基本です。その上で、
- LC共振回路、発振器、PLLなど、波形の忠実性や位相が重要な回路では台形法が第一候補です。
- スイッチング電源、デジタル回路、時定数が極端に異なる回路など、剛性が強く安定性が求められる回路でリンギングや収束の問題が出た場合は、**Gear法(特に2次)**が有効な候補となります。
Q. 出力刻みを細かくしたのに精度が上がりません。
A. 出力刻み(.tran の第4引数など)は、あくまでシミュレーション結果を**ファイルに書き出す間隔(プロービング間隔)**です。内部の計算で使われる時間ステップとは直接関係ありません。内部ステップは、reltol, abstol, chgtol, trtol (電荷系) や lteratio (電圧系)、そして maxstep (最大ステップ幅) によって制御されます。精度を上げたければ、これらの許容誤差オプションを厳しくする必要があります。
Q. 収束しないときの対策のフローは?
A. まずはエラーメッセージを確認し、問題がDC収束なのか過渡解析の途中なのかを切り分けます。過渡解析で "time step too small" が出る場合、以下の順で試すのが一般的です。
-
maxstepを小さくして、急峻な変化点でのステップ幅を強制的に制限する。 - 誤差許容値 (
TRTOLやlteratio) を見直す(厳しすぎても緩すぎても失敗することがある)。 - 積分方法を
method=gearに変更して安定性を高める。 - DC収束オプション (
GMINの調整、.NODESETの利用など)を見直す。
Q. reltol と abstol / vntol の違いと使い分けは?
A. これらは主に、各時間ステップ内で行われるニュートン法の収束判定に使われる許容誤差です。
-
reltol(Relative Tolerance / 相対許容誤差):
信号レベルに比例した許容誤差を定義します。例えばreltol=0.001の場合、1Vの信号に対しては1mV、1mVの信号に対しては1uVといった具合に、誤差の許容範囲が変動します。主に、ある程度大きさのある信号の精度を決定づけます。 -
vntol/abstol(Absolute Tolerance / 絶対許容誤差):
信号レベルに関わらず、一定の絶対的な許容誤差を定義します。これは、電圧や電流がゼロを横切る付近や、非常に小さい信号を扱う際に重要となります。reltolだけだと、ゼロ近辺で許容誤差がゼロに近づいてしまい、永遠に収束しなくなるため、このvntolやabstolが「誤差の床」として機能します。
使い分けとしては、両方を適切に設定することが重要です。シミュレーションしたい信号の振幅に対して reltol を、最小分解能として vntol (電圧) や iabstol (電流) を意識して設定します。
Q. TRTOL と reltol はどう違うのですか?どちらを優先して調整すべきですか?
A. この2つは役割が明確に異なります。
-
reltol: 「空間」的な精度を決めます。つまり、ある瞬間の回路方程式(ニュートン法の連立方程式)を、どのくらいの精度で解くかを決定します。これはDC解析や、過渡解析の各時間ステップ内での計算精度に影響します。 -
TRTOL: 「時間」的な精度を決めます。つまり、時間ステップを1つ進める際の**局所離散化誤差(LTE)**をどのくらい許容するかを決定するスケーリング係数です。この値が小さいほど、シミュレータは時間ステップを細かく刻むようになり、過渡波形の再現性が高まります。
調整の優先順位としては、
- 過渡解析の波形がおかしい(リンギング、振動など)場合は、まず時間軸の精度を司る
TRTOLやmaxstepを調整します。 - DC収束に失敗する、あるいは非常に微小なレベルでの精度が問題になる場合に、
reltolやvntolを厳しくすることを検討します。
多くの過渡解析の問題は、reltol よりも TRTOL の調整で改善することが多いです。
10. 歴史的な位置づけ
-
SPICE2g6 (1983年頃): Fortranで書かれたバークレーSPICEの最終安定版。現在のSPICEの機能の原型がこの時点でほぼ完成しています。
LVLTIMによるステップ制御方式の切替、TRTOL/CHGTOLによる誤差制御、台形法/Gear法の選択など、今も使われる基本概念を備えています。 -
SPICE3 (1989年頃): C言語で全面的に再実装されました。大きな変更点として、デバイスモデルのコード内にLTEを評価する部分(
TRUNC関数)が組み込まれ、デバイスごとに最適な誤差評価を行う構造が一般化しました。このアーキテクチャは ngspice などのオープンソースシミュレータに直接受け継がれています。
まとめ
-
SPICEの過渡解析における誤差推定には大きく二つの系統があります。Berkeley SPICE直系(ngspice, LTspice等)は電荷/磁束ベースのLTEを、Spectreは電圧/電流のP-C差分を誤差指標として採用しています。HSPICEは両者を切り替え可能です。
-
数値積分法として代表的な台形法はA安定で波形忠実性に優れますが、L安定ではないため数値的リンギングが残ることがあります。一方、Gear法(特に2次) はL安定で剛性(Stiff)の強い問題に強いですが、数値ダンピングにより波形がなまる可能性に注意が必要です。
-
実用上は、シミュレータのデフォルト設定を基本とし、問題が発生した場合にその現象(リンギング、収束エラー、精度不足)に応じて、
TRTOL・CHGTOL(電荷系)やlteratio・vabstol(電圧系)、maxstep、methodを適切に調整していくことが、効率的で正確なシミュレーションへの近道です。 -
具体的な回路例での実験と、パフォーマンス比較データを参考にすることで、より効果的なオプション選択が可能になります。