Glade:スタセルを使った論理回路の設計
(20/05/06:akita11=1st draft)
ここでは、論理ゲートを部品(スタンダードセル:スタセル)として使って、Gladeというフリーの設計ツール(Gladeについては「Gladeを使ったLSI設計」を参照)を使って手動で論理回路の設計をまとめます。(主な流れとしては、別のツールを使った例ですが「WGexでスタンダードセルを使って論理回路を設計する」が参考になりますので軽くみていただくとわかりやすいかと思います)なおVeriloHDL等のHDLからの論理回路設計(いわゆるトップダウン設計)については、別途まとめる予定です(AllianceやQflowというツールを使う予定)。 スタンダードセルは、論理ゲートの物理的なレイアウト設計のデータですから、それを1つの論理ゲートとして、論理回路を設計する調子で並べてつないでいけば、好きな論理回路を作ることが(原理上は)できます。そしてスタンダードセルは、いわば論理回路をつくるための「部品」のようなものですが、多くの場合、「誰かがつくった」ものがありますので、ありがたく使わせてもらうことにしましょう。ここでは、例として、ANDゲート(論理積)をつくってみましょう。ANDゲートは、NANDゲートのあとにNOTゲート(インバータ)をつなげば作れます。
※集積回路(CMOS)では、ANDゲートを直接つくることはできず、必ずNAND・NOR・NOTのように、出力側に○(否定)がつく論理ゲートしかできません。そこでAND・ORのように○がない論理ゲートが必要なときは、このようにNOTゲートをつけたり、あるいはド・モルガンの定理などを活用して、なるべくNAND/NOR/NOTで論理回路を構成するようにします。
https://makelsi.github.io/images/docs/wgex_stdcell_usage/sc00.png
準備
これに必要なNANDゲートとインバータを含むスタンダードセルは、こちらにありますので、それを有り難く使わせてもらいましょう。
ここからgitにくわしい方であれば、gitでCloneします。gitがよくわからない方は、"Download zip"でzip形式でダウンロードすればOKです。
あわせて、OpenRule1umの基本ファイル一式も(まだダウンロードしていなければ)ダウンロードしておきます。
Gladeを立ち上げ、File→OpenLibから、ダウンロードしたファイル一式の中の"Glade"の中にあるのフォルダ”OpenRule1um_StdCell"を指定して開きます。
続いて、これからつくる回路を入れるライブラリをつくっておきます。File→NewLibを選びます。
https://makelsi.github.io/images/docs/Glade/sc01.png
ライブラリ名は"test"などとしておきましょう。設計に使う各種情報が定義されているTechnologyFileには、ダウンロードした"OpenRule1um"内の"Glade"内にある"OpenRule1um.tch"を指定しておきます。(余談ですがGladeはよくフリーズor強制終了するので、まめにSaveLibで保存するのがオススメです)
その後、回路図を描きやすいようにグリッドを"0.0625"に指定しておきます。DisView→DisplayOptionで出てくるダイアログ内の"SnapGrid"で指定できます。
https://makelsi.github.io/images/docs/Glade/sc01b.png
回路図の作成
まずは回路図をつくるために新しく回路一式(Cellと呼ぶ)をつくります。
https://makelsi.github.io/images/docs/Glade/sc02.png
File→NewCellから、以下のように指定してセル"and2"をつくります。
LibraryName(ライブラリ名):さきほどつくった"test"
CellName(セル名=回路一式の名前):今回は2入力ANDゲートをつくるので"and2"
ViewType(ビュー=回路情報の種類):まずは回路図をつくるので"schematic"を選んでおく(ViewNameもそれにあわせて"schematic"になる
https://makelsi.github.io/images/docs/Glade/sc03.png
↑このようにライブラリ"test"の中にセル"and2"ができ、その中にビュー"schematic"がつくられます。
このtest/and2/shematicを開いた状態で、ここに部品となるNANDゲートとNOTゲート(インバータ)を置きます。Create→Instanceから、部品(インスタンス(instance)と呼ぶ)を置きます。
https://makelsi.github.io/images/docs/Glade/sc04.png
※このダイアログが表示されない場合は、F3キーを押すと表示されます。Libraryはスタセルの"OpenRule1um_StdCell"を、CellNameはNANDゲートの"na21"を、"ViewNameは回路図記号の"symbol"を選んでおきます。
(おまけ:View→DisplayOptionのダイアログ内の"Miscellaneous"内の"Always pop up option dialogs"にチェックを入れておくと、毎回このダイアログを表示されるようにできます)
https://makelsi.github.io/images/docs/Glade/sc05.png
↑こんな感じでNANDゲートを適当なところに置きます。
同様に、NOTゲート(セル名=inv1)を、すぐ横においておきます。
https://makelsi.github.io/images/docs/Glade/sc06.png
続いて、ANDゲート全体の入出力端子(ピン)をつくっておきます。Create→CreatePinから、まず入力Aをつくっておきます。
https://makelsi.github.io/images/docs/Glade/sc07.png
これを、NANDゲートの入力Aのすぐ近くに置きます。
ピンには、「向き」(Direction)と属性(Use)を指定できるので、回路全体としての入力ピンにはINPUT/SIGNALを、出力ピンにはOUTPUT/SIGNALを、電源ピンにはINOUT/POWERを指定してピンをつくります。
同様に入力B、出力X、電源2つ(+側のVDDと-側のVSS)を作って置きます。
https://makelsi.github.io/images/docs/Glade/sc08.png
こんな感じに配置しましょう。
https://makelsi.github.io/images/docs/Glade/sc09.png
続いて、Create→Wireで、部品や端子をつなぐ配線をひいていきます。(ピンの位置はぴったりつなげないかもしれませんが、やや長めに置いておけばOKです)以下のような感じになります。
https://makelsi.github.io/images/docs/Glade/sc10.png
これで回路図が完成しましたので、配線が切れているところがないか、Check→CheckCellviewでチェックをします。
https://makelsi.github.io/images/docs/Glade/sc11.png
画面下部のMessageWindowに、↑のように結果が表示されます。配線がつながっていないところなどのエラー箇所があったら、なおしておきます。エラー数が0になったOKです。
最後に、いま作った回路and2を、他の回路でも使えるように回路図記号(symbol)をつくっておきます。Create→Symbolを選びます。
https://makelsi.github.io/images/docs/Glade/sc12.png
↑このように回路図記号(symbol)をつくるときの細かい指定ができますが、とりえずは回路図記号に生える端子の位置は変更しておいた方がいいです。一般には+電源(VDD)は上(top)、-電源(VSS)は下(bottom)、入力は左(left)、出力は右(right)にしておきます。
https://makelsi.github.io/images/docs/Glade/sc13.png
こんな感じの回路図記号が生成され、test/and2内に"symbol"として現れます。このままでも使えるのですが、「ANDゲートだからANDゲートの記号にしたいなあ」という方は、描画機能があるのでそれっぽい記号にしておきましょう。(ただしGladeの円・円弧の描画はけっこうクセがあります・・・)
これで回路図の作成はひととおりおわりです。忘れずにFile→SaveLibでライブラリごと保存しておきましょう。
レイアウトの作成
続いて、ANDゲートのレイアウトをつくります。File→NewCellで、以下のようにtest/and2/layoutを指定します。
https://makelsi.github.io/images/docs/Glade/sc14.png
続いて、レイアウト設計にあわせてグリッドを0.5umに設定しておきます(View→DisplayOptionから)。
https://makelsi.github.io/images/docs/Glade/sc15.png
いま作成したtest/and2/layoutを開いた状態で、ここに部品となるNANDゲートとNOTゲートを置いていきます。
https://makelsi.github.io/images/docs/Glade/sc16.png
まずCreate→Instanceから、↑のようにOpenRule1um_StdCellにあるNANDゲートのレイアウトである、na21/layoutを指定します(このダイアログが現れないときは、F3で表示させる)。
https://makelsi.github.io/images/docs/Glade/sc17.png
NANDゲートのレイアウト(na21/layout)が現れるのでクリックして配置します。場所はカーソル位置を原点(0, 0)にあわせてクリックして配置しておきます(ズレてしまっても、あとから移動すればOK)。
https://makelsi.github.io/images/docs/Glade/sc18.png
同様に、もう一つのNOTゲート(inv1/layout)も近くに置きます。
https://makelsi.github.io/images/docs/Glade/sc19.png
この2つを、白枠(Frame)が接するようにがぴったり並べます(↑の赤で囲った部分が、na21とinv1でぴったり接するようにする)。これで部品となる2つの回路のは位置がおわりました。
続いて、ANDゲートの端子の位置に名前(ラベル)を置いていきます。
https://makelsi.github.io/images/docs/Glade/sc21b.png
まずは入力Aの場所にラベルを置いてみます。この場所は2層目のメタル配線(ML2)でna21/layoutの端子が置かれています。(レイヤ選択(LSW)ウインドウで、各レイヤの名前を右クリックすると表示ON/OFFが切り替わるので、ML2のみを表示した状態にすると確認しやすいです)
そこでまずはML2をクリックして選択(オレンジ色の枠がついた状態)にしておきます。
その後、Create→Labelで、表示されるダイアログ(現れないときはF3)で、LabelNameの入力名端子の"A"にしておきます。
https://makelsi.github.io/images/docs/Glade/sc20.png
すると、メインのウインドウのほうに、そのラベル”A"が現れるので、制御点(小さくて見にくいが↓の赤丸のところにある小さな丸)が、レイアウト上のna21/layoutの入力"A"がある正方形の中にくるように
配置します。
https://makelsi.github.io/images/docs/Glade/sc21.png
↓のように、ML2レイヤの色でラベル"A"が置かれました。
https://makelsi.github.io/images/docs/Glade/sc22.png
https://makelsi.github.io/images/docs/Glade/sc23.png
↑同様に、の赤丸のように、入力"B"、出力"X"、それからML1レイヤで電源"VDD"と"VSS"のラベルを置きます。
続いて、NANDゲートの出力とNOTゲートの入力をつなぎます。ML1レイヤを選択した状態で、Create→Pathで、パス(配線に使う連続した長方形)の作成をはじめます。そのとき、パスの幅は1umを使います(これはOpenRule1umの設計ルールにある最小のML1配線の幅です)。そのために、↓のF3で詳細ダイアログを表示させ、"Width"に1を指定しておきます。
https://makelsi.github.io/images/docs/Glade/sc25.png
この状態で、na21/layoutの出力Xの正方形の中心(↓の赤丸の位置)でクリックしてパスの作成を開始します。
https://makelsi.github.io/images/docs/Glade/sc24.png
途中クリックするごとにパスの折れ曲がりが作成され、最後にダブルクリックするとパスの作成が終わります。
https://makelsi.github.io/images/docs/Glade/sc26.png
↓こんな感じで、na21/layoutの出力Xと、inv1/layoutの入力Aをつないでおきます。
https://makelsi.github.io/images/docs/Glade/sc27.png
これでNANDゲートとNOTゲートをつないがANDゲート(入出力端子のラベルを含む)が完成しました。忘れずに保存しておきましょう。
https://makelsi.github.io/images/docs/Glade/sc28.png
検証(LVSとDRC)
レイアウトからの回路抽出。and2/layoutを開いた状態で、Verify→Extractから。ルールファイルには、ダウンロードしたOpenRule1um/Glade内のOpenRule1um-lvs.pyを指定する。
これで、回路抽出されたand2/extrctedが生成される。ちなみに右下のNetBrowser(表示されていなければTools→NetBrowserで表示できる)に、回路から抽出したノードが表示てされいて、どれかクリックすると、それがレイアウトのどこに該当するかを確認できます。↓は、入力Aを選んだところで、確かにNANDゲートの入力"A"につながる、pMOS/nMOSのゲートなどがハイライト表示されていることが確認できます。
https://makelsi.github.io/images/docs/Glade/sc29.png
続いてVerify→LVSからLVSの実行。表示されるダイアログから、以下の点を設定します。
ExtractedView(レイアウトから抽出分):Library=test、CellName=and2
SchematicSource(回路図側):一番上の"SchematicSource"は"schematic"を選ぶ。下の"SchematicView"は、Library=test、CellName=and2、を指定する。またいろいろな作業ファイルが作成されるので、WorkingDirectoryは、どこかファイルがいろいろ作成されても困らないフォルダを指定しておくとベター。
https://makelsi.github.io/images/docs/Glade/sc30.png
OKするとLVSが実行される。下のMessageWindowに、↓のように"The netlist match"と表示されれば、両者が一致しているのでOK。(ちなみに"0 devices and ... and2.err"は、エラー出力に0個の素子・ネットが出力されたよ、という意味、つまりエラーはなかった、という意味)
https://makelsi.github.io/images/docs/Glade/sc31.png
最後に、Verify→DRC→RunDRCからDRCを実行。ルールファイルにはOpenRule1um/Glade内のOpenRule1um-drc.pyを指定する。ちなみに1箇所エラーが出る。Verify→DRC→ViewErrosでエラーの内容とその箇所を↓のように確認できる。これは作成したパスで、紫色の三角形のところが狭すぎる(設計ルール上は1um以上)のが原因なので、もう少し上にパスを作成すれば解消できるので、いったんパスを削除し、エラーが出ないようにパスを作成しなおす。
https://makelsi.github.io/images/docs/Glade/sc32.png
以上で、回路図とレイアウトの作成と、それが正しいかの検証(LVS)と製造できるかの検証(DRC)が済み、完成しました。この調子で、もっと大きな回路も作れますね。(それなりに大変ですが・・・)