Glade:アナログ・ディジタル混在回路の設計
(2020/05/16: akita11=1st)
※別のツール・ライブラリで「555」を作る例(「WGexで555回路を作る」)をひととおり読んでいただくと、なんとなく全体の流れがわかるかと思います。 必要な部品
↑の555の説明を読んでみると、必要そうな部品は以下のものです。
コンパレータ(2個)
SR-FF
nMOS
抵抗
このうち、コンパレータはすでにつくりました。またSR-FFは、NORゲート(またはNANDゲート)2個でつくれますので、「Glade:スタセルを使った論理回路の設計」で使ったスタンダードセルを使えばよさそうです。nMOSは「Glade:アナログ回路の設計」で使ったP-Cellで作れますね。最後の抵抗は、実はちょっと面倒(回路図で描けてもレイアウトとの対応がとりにくい)なのですが、実はP-Cellがあります(詳細は後述します)。 回路図の作成
まずはこれまでにも使った、部品となる、OpenRule1um_BasicとOpenRule1um_StdCellの2つのライブラリを開いておきます。それとあわせて、今回つくる回路を入れるライブラリを、テクノロジファイルOpenRule1um.tchを使ってつくっておきます(または以前に同じテクノロジファイルを使って作ったライブラリを使ってもよい)。
https://makelsi.github.io/images/docs/Glade/ms01.png
まずスタセルを使って、SR-FFのところをつくります。普通のSR-FFはNORゲート2個でつくれるのですが、後述する理由から、入力側にインバータを入れる必要があり、そのため負論理SR-FFのほうが都合がよいので、NANDゲート2個を使ってつくります。
https://makelsi.github.io/images/docs/Glade/ms02a.png
Gladeで描くとこんなかんじです。ライブラリOpenRule1um_StdCellのinv1/symbolとna21/symbolを2個ずつ呼び出してつなぎます。なおそれぞれには電源が必要なので、すべてを配線でつなぐか、ライブラリbasic内のvdd/vssを使って、それぞれ各論理ゲートの正電源(VDD)と負電源(VSS)につないでおくと回路図がスッキリして少し見やすいので使うとよいでしょう。(※Gladeの仕様で、vdd/vssのマークに配線が重なるとショートしてしまうので、重ねないようにします)
https://makelsi.github.io/images/docs/Glade/ms02.png
続いて、抵抗を置きます。抵抗は、ライブラリOpenRule1um_Basicの中にrpolyOR1があるので、そのsymbolを呼び出して配置します。抵抗の値は、抵抗を配置するときに(または配置したあとで)プロパティを開き、”Property"タブの中に、↓のように"w"と"r"の2つの値を「+」ボタンで追加して記入しておきます。wはレイアウト時の抵抗素子の幅(太さ)、rは抵抗の値(抵抗値:単位=Ω)です。(※rのPropertyTypeがString(文字列)になっていますが、float(実数)にしたほうがいいかも)
https://makelsi.github.io/images/docs/Glade/ms03.png
次はnMOSです。これはライブラリOpenRule1um_BasicにあるPCellのnchOR1/symbolを使います。このnMOSは外部につなぐコンデンサを放電するので、けっこう電流を流す能力が必要なので、ここではゲート幅(w)を100u(100μm)にしてみます。これはプロパティから設定します(デフォルトでは2uになっているので、これを変更する)。
https://makelsi.github.io/images/docs/Glade/ms04.png
あとは「Glade:アナログ回路の設計」で作ったコンパレータを2個呼び出しておきます。これで部品は全てそろったので、回路図通りに配線でつないでいきます。入力端子のCONT、TH、TRIG、出力端子のOUT、DIS、電源のVDD、VSSも端子(Pin)として置いてつないでおきます。この例では、電源端子VDD/VSSを、回路図中で使うvdd/vssのシンボル(ライブラリbasicから)とつないでいます。これで回路図中のvdd/vssがすべて電源端子VDD/VSSとつながるわけです。 https://makelsi.github.io/images/docs/Glade/ms05.png
回路シミュレーション
まずはこの段階で、回路シミュレーションで正しく動作するかを確認してみましょう。これまでにもやってきたのと同じ手順で、まずは回路図をFile→Export→ExportCDLでこの回路のネットリストを出力します。
続いて、回路シミュレーション用のファイルをテキストエディタ(メモ帳)等でつくります。
code:sim_555.sp
* circuit simulation
.lib 'mos_PTS06.lib'
.inc '555.cdl'
* target circuit
*.SUBCKT 555 TH vss vdd TRIG CONT DIS OUT
x1 TRIG VSS VDD TRIG CONT DIS OUT n0 n3 n4 555
* Dummy resistor to connect circuit's GND(VSS) to GND
rp VSS GND 1e-30
* Power Supply
vdd VDD GND dc 5v
ra vdd DIS 1k
rb DIS TRIG 10k
cb TRIG vss 1u
.ic v(TRIG)=0v
* Input Signal
.tran 1us 100ms
.end
この例では、最初に紹介した555の発振回路のとおりに、外部に抵抗Ra(1kΩ)、Rb(10kΩ)、Cb(1μF)をつないでいます。またシミュレーションのコツとして、TRIG端子の初期電圧を0vに設定しています(.icの行)。555の発振回路の発振周波数f[Hz]は、「f = 1.44 / (Ra + 2Rb)Cb」で与えられますから、今回のRa/Rb/Cbだと、f=68[Hz]、つまり周期は15[ms]くらいになるはずです。
LTspiceでシミュレーションして、出力OUT(と確認用にTRG)の電圧波形をみると、たしかに発振していることが確認できます。発振周波数は約67Hzで、だいたい計算通りになっています。(nMOSのゲート幅wをもっと大きくすると、理論値に近づくはずです。ぜひ試してみてください)。
https://makelsi.github.io/images/docs/Glade/ms06.png
レイアウトの作成
これで正しくする回路図ができたので、それにあわせてレイアウト設計を進めていきます。Create→CreateCellから、この回路にlayoutビューを作成し、ここにレイアウトを描いて行きます。
まずはnMOSを置いてみます。PCellのOpenRul1um_Basic/nchOR1/layoutを作成します。ゲート幅wは100umですが、そのままだと細長すぎるので、↓のようにw=2e-5(20um)、nf=5として、20um幅のnMOSを5個にして、これらを並列につないでゲート幅20um✕5=100umのトランジスタとして使うことにします。
https://makelsi.github.io/images/docs/Glade/ms07.png
続いて抵抗です。PCellのOpenRule1um_Basic/rpolyOR1/layoutを配置します。抵抗の値は1000Ω(1kΩ)ですので、プロパティの"r"の値を1000にしておきます。ただこれを直線状のPolyレイヤの図形で描くと細長すぎるので、適当に折れ曲げた形状にしてみます。これはプロパティの"numsegs"から設定できます。ここでは、これを3にして、3本の線が折れ曲がった形状にしてみます。
https://makelsi.github.io/images/docs/Glade/ms08.png
これを3個作成します。(必要に応じて配置を左右反転(InstタブからPlaceをMYにする)にするなどします。ここでは左端と右側の2個を左右反転にしています)
https://makelsi.github.io/images/docs/Glade/ms09.png
残りのコンパレータcmp、インバータinv1、NANDゲートna21も配置しておきます。
https://makelsi.github.io/images/docs/Glade/ms10.png
各回路が近づきすぎないように、適宜DRCをかけながら、なるべく近くに配置していきます。基本的にcmp,inv1,na21は、FRAMEレイヤで描かれている外枠の長方形が接するように配置すればOKです(コンパレータcmpを設計したとき、高さをinv1等のスタセルと同じにしたので、横に並べると上下の電源VDD/VSSがぴったり並ぶようにできるわけですね)。
https://makelsi.github.io/images/docs/Glade/ms11.png
あとは主に2層メタル(ML2)を使って、回路図をみながら、相互の配線をパス(Path)で配線していきます(幅は1umとするとよい:Path描画時の詳細設定(F3キー)から設定)。ML1とML2をつなぐところは、ライブラリOpenRule1um_BasicにあるセルViaを置いておくことで、ML1とML2が接続されます。
https://makelsi.github.io/images/docs/Glade/ms12.png
https://makelsi.github.io/images/docs/Glade/ms12a.png
入出力端子と電源端子には、それぞれのレイヤ(基本的に入出力はML2、電源はML1)でラベル(Text)を置いておきます(↓の赤字の箇所)。
https://makelsi.github.io/images/docs/Glade/ms13.png
レイアウトの検証
続いてこのレイアウトと、先に描いた回路図とが一致しているかをLVSで検証します。Check→RunLPEで、スクリプトOpenRule1um-lvs.pyを指定してい回路抽出したextracted viewを作成します。
https://makelsi.github.io/images/docs/Glade/ms14.png
こんな感じのextracted viewができます。NetBrowserで、各ノードとレイアウトの対応を確認できます。
続いてCheck→RunLVSで、回路図(schematic)を指定してLVSをかけると、以下のような結果になりました。
https://makelsi.github.io/images/docs/Glade/ms15.png
"The netlist match"なので、素子どうしの接続(ネットリスト)は一致しているのでOKです。ただ、"device property error"が3箇所ある、となっています。LVSの結果が"555.lvs"というファイルに保存されています(ログには"555.err"に保存されたと書いてあるが"555.lvs")ので、これをテキストエディタ(メモ帳)等で開いて内容を確認してみます。
code:555.lvs
(中略)
The following devices have property mismatches:
555_extracted.cdl 555.cdl_flat
(1) Device type: R R
Inst name : R11 R2
Model : rppoly
Terminals : n12 n3
VSS vss
Value (ohm): 1.12e+03 1e+03
W/L (um) : 2.000/104.000 2.000/0.000
(中略)
これを見ると、"555_extracted.cdl"(レイアウトから回路抽出したネットリスト)中のR11(抵抗)の素子値が1.12e+3、つまり1120Ωなのに対して、"555.cdl_flat"(回路図のネットリスト)中の抵抗R2の素子値が1e+3、つまり1000Ωで、一致していない、という内容です。つまり接続関係は正しいのだが、素子(抵抗)の値が違う、というエラーです。実はこれは抵抗のPCellのバグのようなもので、PCellが指定した抵抗値から生成するレイアウトと、そのレイアウトから回路抽出で求める抵抗値が一致しないのが原因です。抵抗のレイアウト生成と回路抽出のアルゴリズムは複雑(特に今回のように折れ曲がった形状の場合)なので、ここは妥協して、回路図の素子値を、レイアウトから回路抽出で求められた1120Ωにあわせておくことにします。
https://makelsi.github.io/images/docs/Glade/ms16.png
改めてLVSをかけると,今度は完全一致していることがわかります。これで回路シミュレーションで動作OKで、製造にまわせるレイアウトが完成しました。
https://makelsi.github.io/images/docs/Glade/ms17.png