1
3.3
Verilog-Aによる動作モデリ
ング
アナログ動作記述
典型的記述例から、アナログ言語記述の考え方を学ぼう。
ここでは、自分でバリバリ記述できるほど詳しい文法を学
ぶ必要はない。与えられた記述が大まかに追えて、パラ
メータが何を表しているか分かれば十分。
(参考URI)
http://homepage3.nifty.com/hdl_design/
3
準理想的
OPA, OTAの仕様
OPAの特性
理想
OPA
動作モデル(準理想)
直流差動利得
A
d∞ (dB)
有限値(大きいほうが理想)
入力インピーダンス
Z
i∞ ()
∞ ()
出力インピーダンス
Z
o0 ()
必要なら設定
最大出力電圧振幅
V
sat∞ (V)
必要なら設定
遮断周波数
(Pole)
p1∞ (Hz)
必要なら設定
OTAの特性
理想
OTA
動作モデル(準理想)
直流差動トランスコンダクタンス
G
m有限値
有限値(現実的な値を設定)
入力インピーダンス
Z
i∞ ()
∞ ()
出力インピーダンス
Z
o∞ ()
必要なら設定
最大出力電圧振幅
V
sat∞ (V)
必要なら設定
遮断周波数
(Pole)
p1∞ (Hz)
必要なら設定
※
GBP(OPA) =
p1* Ad(倍) で与えられる。GBPをパラメータとして記述してもよい。
OPAの動作記述(利得)
module opa_i(inp, inn, outp, outn);
inout inp, inn, outp, outn;
electrical inp, inn, outp, outn;
// dc gain = 80 (dB)
parameter real GAIN = 10000;
analog begin
V(outp) <+ GAIN * V(inp, inn);
V(outn) <+ GAIN * V(inn, inp);
end
回路モジュールの宣言 ポートの宣言 (電気特性を記述する場合は双方向) ポートのディシプリン宣言(双方向アナログ配線) コメント パラメータの宣言(実数のgainを10000で初期化) アナログ動作記述の開始 <+は、コントリビューション演算子(後述) V(inp, inn)は、innに対するinpの電位差を表すA
d以外理想の
OPAの特性
設定例
直流差動利得
A
d80 (dB)
入力インピーダンス
Z
i∞ ()
出力インピーダンス
Z
o0 ()
最大出力電圧振幅
V
sat∞ (V)
遮断周波数
(Pole)
p1∞ (Hz)
詳細は
Verilog-A Language Manualを参照
+
- +
-inp
inn
outn
outp
gain
5
OPAの動作記述(出力インピーダンス)
• 出力インピーダンス Zo = 100 () をモデル化
module opa_zo(inp, inn, outp, outn); inout inp, inn, outp, outn;
electrical inp, inn, outp, outn;
parameter real GAIN = 10000 from (0:inf), // dc gain Rout = 100 from (0:inf); // output R real vin, voutp, voutn, vout0, ioutp, ioutn;
analog begin
vin = V(inp, inn); voutp = V(outp); voutn = V(outn); // dc gain
vout0 = GAIN * vin; // output current
ioutp = (vout0 - voutp)/Rout; ioutn = (-vout0 - voutn)/Rout;
// output I(outp) <+ -ioutp; I(outn) <+ -ioutn; end endmodule 出力インピーダンスから出力電流を計算
直流差動利得の計算
OPAの動作記述(周波数特性)
• ポールとなる角周波数
p1
= 2・1MHz をモデル化
module opa_wp(inp, inn, outp, outn); inout inp, inn, outp, outn;
electrical inp, inn, outp, outn;
parameter real GAIN = 10000 from (0:inf), // dc gain Rout = 100 from (0:inf), // output R
POLE_FREQ = 1M from (0:inf); // pole frequency real vin, voutp, voutn, vout0,
ioutp, ioutn; analog begin
vin = V(inp, inn); voutp = V(outp); voutn = V(outn); // dc gain and 1st pole
vout0 = laplace_nd(GAIN*vin, {1},{1,1/(`M_TWO_PI*POLE_FREQ)});
// output current
ioutp = (vout0 - voutp)/Rout; ioutn = (-vout0 - voutn)/Rout; // output I(outp) <+ -ioutp; I(outn) <+ -ioutn; end endmodule
伝達関数の記述を追加
polef
s
s
H
2
POLE_FREQ
`M_TWO_PI
POLE_FREQ
`M_TWO_PI
1
1
vin
gain
vout0
)
(
polef
s
s
H
2
POLE_FREQ
`M_TWO_PI
POLE_FREQ
`M_TWO_PI
1
1
vin
gain
vout0
)
(
OPAの伝達関数
7
OTAの動作記述(Gm)
module ota_i(inp, inn, outp, outn);
inout inp, inn, outp, outn;
electrical inp, inn, outp, outn;
// transconductance = 50 (S)
parameter real Gm = 50u from (0:inf);
analog begin
I(outp) <+ Gm * V(inp, inn) ;
I(outn) <+ Gm * V(inn, inp);
end
endmodule
回路モジュールの宣言 ポートの宣言 (電気特性を記述する場合は双方向) ポートのディシプリン宣言(双方向アナログ信号) コメント パラメータの宣言(実数のgmを10mで初期化) アナログ動作記述の開始 処理内容(<+はコントリビューション演算子(後述))OTAの特性
設定例
トランスコンダクタンス
G
m50 (S)
入力インピーダンス
Z
i∞ ()
出力インピーダンス
Z
o∞ ()
最大出力電圧振幅
V
sat∞ (V)
OTAの動作記述(出力インピーダンス)
•
p
= 800 (MHz), Zo = 5(M) をモデル化
module ota_zo(inp, inn, outp, outn); inout inp, inn, outp, outn;
electrical inp, inn, outp, outn;
parameter real Gm = 50u from (0:inf), // transconductance Gout = 0.2u from (0:inf), // output conductance POLE_FREQ = 800M from (0:inf); // pole freq. real vin, voutp, voutn, ioutp, ioutn, iout0;
analog begin
vin = V(inp, inn); ioutp = I(outp); ioutn = I(outn); // Gm and pole iout0 = laplace_nd(Gm*vin, {1}, {1, 1/(`M_TWO_PI*POLE_FREQ)}); // output voltage
voutp = (iout0 + ioutp) / Gout; voutn = (-iout0 + ioutn) / Gout; // output current
V(outp) <+ voutp; V(outn) <+ voutn; end
9
コンパレータの動作記述
• イベントドリブンモデルによる記述例
module comp(inp, inn, clk, outp, outn, vdd, vss); inout inp, inn, clk, outp, outn, vdd, vss;
electrical inp, inn, clk, outp, outn, vdd, vss; parameter real
Voff = 10n from (-inf:inf), // offset Trf = 100p from (0:inf), // rise/fall time TOL = 1p from (1p:inf); // timing tolerance integer bout;
real vin, vtg; analog begin
vin = V(inp, inn);
vtg = (V(vdd) + V(vss)) /2; // comparing
@(initial_step or cross(V(clk) – vtg, 1, TOL)) begin
if (vin >= Voff) bout = 1; else bout = -1; end // output V(outp) <+ V(vdd)*transition(bout, 0, Trf, Trf); V(outn) <+ V(vss)* transition(bout, 0, Trf, Trf); end endmodule
立上りだけ検出
遅延時間、
立上り時間、
立下り時間
電圧比較
比較結果を
1/-1
で表現
初期状態を決めるため
にシミュレーション開始
時に比較
V(clk) - vtg = 0 を検出
Verilog-Aの文法解説(1)
入出力ポート宣言
input
: 入力ポート
output
: 出力ポート
inout
: 双方向ポート
Verilog-A (またはVerilog-AMS)の解説書は少ないので、簡単に解説しておく。
ディシプリン
(discipline)宣言
electrical : アナログ電流、電圧値を持つ配線・・・SPICEネットリストと
接続可能(定義済み)
voltage : アナログ電圧値を持つ配線(定義済み)
※ 他に多くのディシプリンがある。ユーザが独自に作成することもで
きる
パラメータ
(parameter)宣言と初期化
モジュール内で有効な定数や式を定義
モジュールをインスタンスとして呼び出すときに再設定できる
11
Verilog-Aの文法解説(2)
変数宣言
real 変数名;
: 実数スカラ
integer 変数名;
: 整数スカラ
real 配列名 [low:high];
: 実数配列
integer 配列名[low:high];
: 整数配列
信号アクセス関数: 代入演算子の左辺ではソース、右辺ではプローブを表す
V(n1)
: ノードn1とGNDの間の電圧を取得する
V(n1, n2): ノードn1, n2間の電圧を取得する
I(n1)
: ノードn1からGNDに流れる電流(モジュール内部方向)を取得する
I(n1, n2) : ノードn1からn2の間に流れる電流を取得する
(参考) 信号アクセス関数を用いて、現在の電圧値、電流値を表す実変数
に代入してから、変数を用いて演算すると可読性が良い
analog begin ~ end : アナログ手続き文(代入文や制御文)を書く部分。
モジュールに
1回だけアナログブロックを含めることができる。
(参考) ディジタル
Verilog HDLのalways文に相当するが、ノンブロッキ
ング代入
(<=)は使用しない。以下は、analogブロックの中に記述する。
analogブロック
Verilog-Aの文法解説(3)
コントリビューション(アナログブランチ代入文)
V(n1, n2) <+ 式;
: 式で計算した結果をノードn1, n2間の電圧ソースに与える
I(n1, n2) <+ 式;
:式で計算した結果をノードn1, n2間の電流ソースに与える
(注意) 同一ノード間に複数のコントリビューションが記述された場合、複数式
の加算が実行される。電圧の加算と電流の加算は、回路的には意味が異なる
ので注意が必要(下記の図参照)。
式
1
式
2
V(n1, n2) <+ 式1;
V(n1, n2) <+ 式2;
I(n1, n2) <+ 式1;
I(n1, n2) <+ 式2;
ポテンシャル代入(直列接続)
フロー代入(並列接続)
式
1
n1
n2
手続き的代入文
=
: 変数(real integer) に対して演算結果を代入する
※ 記述の上から下へ順に代入が実行される
13
Verilog-Aの文法解説(4)
条件演算子
変数
<+ 条件式 ? 式1 : 式2;
変数
= 条件式 ? 式1 : 式2;
条件式
=True のとき式1の値を代入、False のとき式2の値を代入
制御構文
if文
if (条件式2)
実行文
1;
else if (条件式2)
実行文
2;
else
実行文
3;
case文
case (分岐式)
評価値
1: 実行文1;
評価値
2: 実行文2;
default: デフォルト文;
endcase
※
1 実行文が2つある場合は、begin ~ end で囲む
※
2 repeat文, while文もある
for文
for (初期値; 条件; 代入) begin
実行文
1;
実行文
2;
end
ddt(式, 誤差)
: 時間微分
idt(式, 誤差)
: 時間積分
※時間積分や時間微分のように、条件文の中には記述できない演算があるので注意
absdelay(式, 遅延時間)
: 遅延時間経過後に処理
slew(式, 立上がりSR, 立下りSR)
: 式の時間変化速度を制限
transition(式, 遅延, 立上り時間, 立下り時間, 誤差)
: 離散値の変化に遷移時間帯を設けて直線でつなぐ
ラプラス変換演算子
laplace_nd(式, 分子, 分母, 誤差) : 伝達関数を通す(分子・分母形式)
laplace_zp (式, ゼロ, 極, 誤差)
: 伝達関数を通す(ゼロ・ポール形式)
z変換演算子
zi_nd(式, 分子, 分母, Ts, 立上/下時間, td): 伝達関数を通す(z
-1の分子・分母形式)
zi_zp (式, ゼロ, 極, Ts, 立上/下時間, td ): 伝達関数を通す(z
-1のゼロ・ポール形式)
その他:
abs, exp, ln, max, min, sqrt など殆どの算術関数が使える
Verilog-Aの文法解説(5)
アナログ演算子と関数1(連続ベースモデル)
15
Verilog-Aの文法解説(6)
2 1 10
1
1
0
)
(
z
z
z
z
K
21
0
1
1
0
)
(
s
s
s
s
K
分子・分母形式
ゼロ・ポール形式
laplace_zp(V(node), {-1, 0}, {-1, -1, -1, 1});
laplace_nd(V(node), {0, 1}, {-1, 0, 1});
)
1
1
)(
1
1
(
0
1
1
)
(
j
s
j
s
j
s
s
K
ラプラス変換
/z変換演算子の形式
zi_nd(V(node), {0, 1}, {-1, 0, 1}, Ts);
zi_zp(V(node), {-1, 0}, {-1, -1, -1, 1}, Ts);
)
1
1
)(
1
1
(
0
1
1
)
(
1 1 1j
z
j
z
j
z
z
K
(立上り
/立下り時間、遅延時間は省略可能)
Verilog-Aの文法解説(7)
アナログ演算子と関数2(イベントドリブンモデル)
@(cross(式, 1(立上り)/-1(立下り)/無指定(両方向), 時間誤差, 式の誤差))
: 電圧、電流、時間を含む式がゼロを横切るタイミングで処理を実行
@(initial_step(ac/dc/tran/noise))
: ()内のシミュレーションの初期状態において処理を実行
last_crossing(式, 方向)
: 直前の電圧、電流、時間を含む式がゼロを横切る時刻を求める関
数。
crossでは、時間誤差の時間精度で処理が実行されるが、
last_crossingでは時間ステップの間を直線補間により、正確な交差
時刻を求める。
@(timer(開始時刻, 周期))
: 指定された時刻から周期的に処理;を実行
※ 連続ベースモデルで制御文
(case, if)を使用すれば 、イベント動作と同様
の機能を記述できるが、クロックに合わせて動作する回路は、イベントドリブ
ンモデルを使うと記述しやすい。
(参考)Verilog-AとVerilog-AMS
17 module analog_sw (vin, control, vout);
inout vin, vout; input control; voltage control; electrical vin, vout; [略]
real roff, rratio, rout; integer rstate;
analog begin
rstate = (V(control) >= vth);
@(cross(V(control)-vth, 0, slack, vtol));
rout = roff*pow(rratio,transition(rstate, …)); I(vin,vout) <+ V(vin,vout)/rout;
end endmodule
module analog_sw (vin, control, vout); inout vin, vout;
input control; logic control; electrical vin, vout; [略]
real roff, rratio, rout; reg rstate;
always @(control) begin
if (control===1'b1) rstate<=1'b1; if (control===1'b0) rstate<=1'b0; end analog begin rout = roff*pow(rratio,transition(rstate, …)); I(vin,vout) <+ V(vin,vout)/rout; end endmodule
Verilog-A記述
Verilog-AMS記述
Verilog-AMSでは、crossを使用せずalways
文でイベントが記述できる(
Verilog-AMS環
境の場合は、こちらを推奨)
謝辞:ルネサスエレクトロニクス(株)
大沢秀行様からの情報提供です。
アナログ動作モデルの使用上の注意点
• 考慮していない特性に関するシミュレーションはできない
– 前記OPAモデルで考慮していない特性の例
• 第2番目以降のポールとゼロ
• スルーレート(SR)
• 入力インピーダンス
• 同相入力電圧レンジ
• オフセット
• 非線形歪み
• CMRR
• 温度特性
• 最終的にトランジスタレベルの回路を使って回路シミュレーションする
なら、あまり詳細なモデル化は必要ない
• 動作モデルに取り込む特性は必要に応じて取捨選択する(次ページ)
– 必要以上に詳細な動作モデルを使用することは、どのパラメータが回路全
体の性能に影響するのか分からなくなるので逆効果
19