HSPICE
研究にてHSPICEを用いる機会が多いため、構文についてまとめました。
HSPICE
回路設計、シミュレーションを行うことができるソフトウェア。
ファイル関係
シミュレーションを行う上で必要な情報は2つ(入力ファイル)
- 接続情報(ネットリスト) いわゆる回路図
- ライブラリ(モデルパラメータ) デバイス特性をまとめたもの
拡張子は.sp
拡張子は.inc,.lib
シミュレーションを行ったあと、結果が出力される(出力ファイル)
- 実行ステータス 拡張子は.st0
- 解析結果出力ファイル 拡張子は.lis
- 波形データ 拡張子は.sw#,.ac#,.tr#
- 測定結果出力 拡張子は .ms#,.ms#,.mt#
SPICEモデルの種類
- コンパクトモデル パラメータでデバイス特性を表した式で記述したモデル
- マクロモデル 等価回路で表現したモデル
- ビヘイビアモデル デバイスの特性式をユーザーが任意に変更できるモデル
スケールファクタ
SI接頭語を用いることができる。いわゆるスケールファクタである。
t:10^12
g:10^9
meg:10^6
k:10^3
m:10^-3
u:10^-6
n:10^-9
p:10^-12
f:10^-15
諸注意
HSPICEでは大文字小文字の区別は一切されない。これは変数であっても区別されない。
素子定義
電源
- 電圧源
V(素子名) (上端子) (下端子) `dc/ac/pulse/pwl` (出力値)
dc 直流(direct current)
ac 交流(alternating current) 出力値に振幅と位相を指定できる
pulse パルス 任意のパルス波の生成
pulse(初期値 パルス値 遅延 立上り 立下り パルス幅 周期)
pwl
pwl(時間 電圧 時間 電圧...)
例)
VDC V GND dc 1.2
VAC V GND ac 124 90
VP V VGND pulse(0 5 10n 1p 1p 10n 20n)
以下のように電圧源を設置してもショートしていると判断されるため、電流は流れる。VAM wire GND 0
のちに.probe I(VAM)
と指定するとVAMに流れる電流を測ることができる。つまりは電流計として動作する。電流制御電圧源の入力値としてこの方法を使う場合がある。
I(素子名) (上端子) (下端子) `dc/ac/pulse` (出力値)
dc 直流
ac 交流 出力値に振幅と位相を指定できる
例)
IDC I GND dc 20m
IAC I GND ac 20m 90
E(素子名) (+出力端子) (-出力端子) (+入力端子) (-入力端子) (倍率)
例)
Eamp out 0 in 0 5
G(素子名) (+出力端子) (-出力端子) (+入力端子) (-入力端子)
受動素子
- Resistor
- Capacitor
- Inductor
R(素子名) (端子1) (端子2) (抵抗値)
例)
R0 w1 w2 1k
C(素子名) (端子1) (端子2) (容量)
例)
C0 w1 w2 1u
L(素子名) (端子1) (端子2) (インダクタンス)
例)
L0 w1 w2 1u
能動素子
- MOSFET
M(素子名) (ドレイン) (ゲート) (ソース) (ボディ) (モデル名) (*形状パラメータ)
形状パラメータ(単位は全てm)
l チャネル長
w チャネル幅
ad ドレイン拡散面積
as ソース拡散面積
pd ドレイン接合周囲長
ps ソース接合周囲長
例)
Mn1 drain gate source body NCH l=0.1u w=0.5u
実際にこれを使うには.modelによってNCHを定義する必要がある。
解析
シミュレーションにおいて、横軸を何で取るかという選択でもある。
DC電圧⇒直流解析
周波数⇒交流解析
時間⇒過渡解析
温度⇒温度解析
直流解析
静特性についての解析
.dc (端子) (初期値) (最終値) (計算間隔)
例)
.dc Vin 0 1.2 0.1
交流解析
周波数特性についての解析
過渡解析
過渡特性についての解析
.tran (出力間隔) (終了時間) (開始時間) (計算間隔)
例)
.tran 1ns 10ns 0 0.01ns
計算間隔を0にしてはいない。
収束しない場合についてはその他>収束性へ。
温度解析
.temp (温度1) (温度2)...
温度1,2での温度で解析を行う。
単位が摂氏であることに注意。
測定
時間測定
電力測定
.measure `dc/ac/tran` (出力名) `avg/min/max/pp/rms/integ` (測定端子) from=(開始時間) to=(終了時間)
dc 直流動作点解析
ac 交流解析
tran 過渡解析(transient)
avg 平均値(average)
min 最小値(minimum)
max 最大値(miximum)
pp 振幅(peak to peak)
rms 実効値(root mean square)
integ 積分値(integral) 平均値*区間長
例)
.measure tran ave_VIN ave V(VIN) from=10u to=20u
波形出力
CosmosScopeなどのエディタを用いて波形の確認ができる。
.probe (観測場所) ...
例)
.probe V(V1) I(wire)
V(node)によりnodeの電圧波形を得られる。同様にI(wire)でwireに流れる電流波形を得られる。
.proveと間違えやすいので注意する。
正確には以下の通り。
.probe (解析) (観測場所)
解析はdc,ac,tran,noiseの種類を指定できる。
観測できる項目は電圧,電流,温度の3種類を指定できる。
波形出力は.graphでもできるが、現在はこちらのコマンドを使うのが吉。
オプション類
- post
- probe
- reltol
- dcvolt ノードに初期電圧を与える。
.option post=`0,1,2,3,ascii,binary`
0 シミュレーション結果を出力しない
1,binary バイナリにて結果を出力
2,ascii asciiにて結果を出力
3 NewWaveBinaryにて出力
.option probe=`0,1`
出力結果を.probeもしくは.printにて指定したもののみ出力するようになる。
初期値は0であり、その場合は全てのノードの電圧と、電源電流を出力する。
1に変更した場合は、指定したもののみ出力を行う。これによりシミュレーション出力ファイルのサイズを大幅に削減できる。
.option reltol=(相対誤差)
相対誤差の定義。初期値は1E-3(0.001)。タイムステップが小さすぎると怒られた時に使うと良い。
例)
.option reltol=0.01
.dcvolt v(端子)=電圧値
.ICよりは優先度が低い。
その他
parameter
.param (変数名)=(代入値)
個人的なイメージで言えば、Clangにおけるfloatみたいな感じ。
data
.data (dataによる動作の名前)
+(変数名)
+(代入値)
.enddata
.paramにて定義された変数名に+以降の値を代入して実行する。例)
.param hoge fuga
.data hogehuga
+hoge fuga
+0 0
+1 1
.enddata
サブサーキット化
複数個の素子を群としてまとめることができる。
(定義)
.subckt (サブサーキット名) (端子1) (端子2) ...
(ネットリスト)
.ends
(呼び出し)
X(名前) (端子1) (端子2) ... (サブサーキット名)
例)
.SUBCKT INV OUTPUT INPUT VDD GND
Mn OUTPUT INPUT GND GND NCH
Mp OUTPUT INPUT VDD VDD PCH
.ENDS
XINV OUT IN VDD GND INV
余談
収束性
収束性(安定性)とは、シミュレーションを行った際に動作点が1点に落ち着くことを指す。収束性が損なわれると以下のような問題が起こる。
- 実行しても計算が開始しない
- シミュレーションが途中で止まる
- わずかな条件変更で大幅に結果が変わる
- 非現実な結果を出力する
HSPICEはシミュレーションにニュートン法を用いるため起きてしまう問題である。
デバイス特性において、本来の動作点と初期点の間に変曲点があると発散してしまう。つまりは収束点エラーになる。
過渡解析を行う時、まずは時刻0でのDC解析(正確にはDCコンバージェンス)を行う。ここで収束点エラーが起きることがある。
この対処として、DCコンバージェンスをスキップすることがそのひとつである。
.tran 行にuicを追加することによって実質的にスキップすることができる。
正確には.IC,.NODESET,0vの順序でノード電圧を検索し、それぞれ決定する。
例).tran 10p 100n uic