Glade:はじめの一歩(6)=インバータの設計(回路シミュレーション)
「Glade:はじめの一歩(3)=インバータの設計(回路の抽出:LPE)」で回路抽出を行いました。その結果を使って、設計した回路が正しく動作するか、回路シミュレーションで検証してみましょう。LPEの手順の中で、ルールファイルとして回路シミュレーション用の"OpenRule1um-ext.py"を指定して、回路抽出後のextractedビューを作成した状態まで進めてください(OpenRule1um-ext.pyは、LVSで使ったOpenRule1um-lvs.pyと違って、寄生容量も抽出します)。 それを開いた状態で、File→Export→Export CDL、で回路の情報(ネットリスト)を出力します.
https://makelsi.github.io/images/docs/Glade/sim01.png
https://makelsi.github.io/images/docs/Glade/sim03.jpg
左上の枠の中に、電源(VDD/VSS)と入出力(AとX)があることを確認します。また左下の「"True Spice format"」にチェックを入れておきます。(※↑の図だとチェックが入ってないかもですが、チェックを入れておきます)
ファイル名(とフォルダの位置)を指定し、例として、inv1.cdl として保存します。回路シミュレータのSpiceについて詳しい方であれば、いわゆるSpiceネットリストであることがわかると思います。
code:inv1.cdl
.SUBCKT inv1 X VDD A VSS
*.PININFO X:B VDD:B A:B VSS:B
MM15 X A VDD VDD pchOR1ex w=6e-06 l=1e-06 as=1.2e-11 ps=1e-05 ad=1.2e-11 pd=1e-05
MM14 X A VSS VSS nchOR1ex w=2e-06 l=1e-06 as=4e-12 ps=6e-06 ad=4e-12 pd=6e-06
CP0 VSS X 6.54e-16
CP1 VDD VSS 6.24e-16
.ENDS
この回路がどう動作するかを検証する、回路シミュレーションを行うソフトはいろいろありますが,ここではAnalogDevices社のLTspiceを使ってみます(無料で使えます).LTspiceをダウンロードしてインストールしておいてください. メモ帳などのテキストエディタで新規のファイルを作成し、以下の内容を書いて、"sim_inv1.sp"として保存しておきます。(拡張子が*.spになっているかを要確認。Windowsだと見えないけど拡張子が*.txtになってハマることが多いので注意)
code:sim_inv1.sp
* circuit simulation
.lib 'mos_PTS06.lib'
.inc 'inv1.cdl'
* target circuit
*.SUBCKT inv1 X VDD A VSS
x1 X VDD A VSS inv1
* Dummy resistor to connect circuit's GND(VSS) to GND
r0 VSS GND 1e-30
* Power Supply
vdd VDD GND dc 5v
* Input Signal
vin A GND pulse(0v, 5v, 0.5u 1n 1n 0.5u 1u)
.tran 1us 4us
.end
それぞれの意味の詳細はSpiceに関する資料を参照していただければと思いますが、大まかには以下のような内容が書かれています。
"*"から始まる行はコメント
"x1"から始まる行で、レイアウトから抽出した、inv1.cdlにある回路を呼び出している(入力、出力にそれぞれA、Xというノード名をつけている)
電源(vdd)と、入力信号(vs)を、それに与えている
(※ややトリック:ネットリスト名の仕様から、LTspice内では基準電位は"GND"という名前である必要があるため、事実上0Ωのr0で、回路の最低電位VSSとつないでいる)
.tranから始まる行で、行うシミュレーションの内容を指定している(この例では、4usまでの時間変化(過渡応答)を求めている)
もう1つだけ、準備するファイルがあります。それは、MOSトランジスタのシミュレーションでの挙動を定義するモデルファイルと呼ばれるもので、一般にはチップを製造するファウンドリから提供されます。今回は、以前フェニテックセミコンダクタ社のCMOS 0.6umプロセス用のテスト回路から抽出したMOSトランジスタのモデルを使ってみます。(※Windowsだとファイルを保存時に、自動的に拡張子"txt"がついてしまって、"mos_PTS06.lib.txt"というファイル名になってしまうので、ファイル名を"mos_PTS06.lib"に変更しておいてください)
ではいよいよシミュレーションです。さきほどの"sim_inv.sp"のウインドウを選択した状態で、上にある"Run"ボタンをおすと、シミュレーションが実行されます。
https://makelsi.github.io/images/docs/Glade/sim07.jpg
すると、次のような黒いウインドウ(これからシミュレーション結果を表示する)が現れます。
https://makelsi.github.io/images/docs/Glade/sim08.jpg
黒いウインドウのところで右クリックして現れるメニューの中から、"Add trace"(波形を追加)を選びます。
https://makelsi.github.io/images/docs/Glade/sim09.jpg
次のように、表示させたい信号の選択画面になりますので、ここから、v(a)(ノードAの電圧波形、つまり入力信号)とv(x)(ノードXの電圧波形、つまり出力信号)をクリックして選択します(このダイアログの下のほうのボックスの中にその信号名が追加されていく)
https://makelsi.github.io/images/docs/Glade/sim10.jpg
信号の選択が終わったらOKを押すと、以下のような波形(横軸が時間なので時間変化)が表示されます。よく見ると、AとXの電圧が0V/5Vで逆になっていますので、正しくインバータ(NOTゲート)として動作していることがわかります。
https://makelsi.github.io/images/docs/Glade/sim11.jpg