私が普段使用しているhspiceでは変数として扱えるのはmeasureの測定結果と.paramで定義されたものと、.measure中でparやparam=で参照されるものだけだと思うのだが、ngspiceではそれ以外に(私が認識している範囲で)以下のものがある
- .csparamで定義されるもの
- .control内で定義されるもの
- letで定義するもの
- これはvector
参照するときはx等
- これはvector
- setで定義するもの
- これはvariaable
参照するときは$x等
- これはvariaable
- measで測定された結果
- 参照するときは{x}等
- alterparamで再定義したparam
必ずresetが必要
- letで定義するもの
これらのスコープをdocumentを読んでもなかなか理解できず、いろいろ探した結果、以下のページの説明が最もしっくり来た。
ngspiceのvariables/parameterの質問
(ただし全部は試せていない)
以下いろいろ実験してわかったこと
- .paramで定義した値は.control内では参照できない
- .csparamで定義した値は.control内で参照できる
例えば.paramで定義したvddは.csparamのvdd0を経由すれば$&vdd0として.controlで参照可能になる。
.param vdd=1.8
.param vss=0
.param gv=0
.csparam vdd0={vdd}
.param lw='1e-008*(width)/(length)'
.csparam lw0={lw}
.control
run
let itarg=abs(i(Vssat))
echo lw "$&lw0"
meas dc vth_satp0 find v(gsat) when itarg=$&lw0
let vth_satp='$&vdd0 - vth_satp0'
.paramで定義した値は.control内でalterparamで再定義すれば参照できるのだが、値を有効にするためにはresetが必要になる。この時どうやらいろいろなものがresetされてしまう。
FFのSetup/hold simのcontrolに既述したようにalterparamで.paramの値を書き換えたときは、元の.paramで定義していた値を参照しているほかのすべての式に影響を与えている模様。(Spiceは基本的にファイル内の構文の順序と実行順には関連がないから)
これは以下のように使った。
.param setup=1n
.param d_start='cycle*2+clk_start-setup'
.csparam pds=d_start
.param cp2q0_para=100p
vclk clk vss pulse( {vss} {vdd} {clk_start} {trf} {trf} {cycle} {cycle*2} )
vdata d vss pulse( {vdd} {vss} {d_start} {trf} {trf} {cycle*2} {cycle*4} )
途中略
.control
途中略
* Initial Setup Time in controll
let st=1n
途中略
alterparam setup=$&st
reset
tran 10p 40n
.measureで測定した結果の値を.controlで参照する方法についてはいろいろ試してみたが、今の所成功していなくて、.control内にすべてのmeasを持ってくる方法しか成功していない。