レイアウトから回路を抽出し、第3章の回路図と照合します。寄生成分を含めて特性を再測定し、GDSファイルを出力します。工程5、6、7です。判断点は D07「不一致の原因」。最後に判断点7箇所を集計します。
8.1 照合が必要な理由
ここまでに、回路図(第3章)とレイアウト(第6章)の2つを作成しました。レイアウトは手作業で作成しているため、回路図と一致している保証がありません。この一致を機械的に確認するのがLVSです。
レイアウトの図形から回路を抽出し、回路図と部品・接続・寸法を照合する処理です。
DRCが製造可能な形状かを検査するのに対し、LVSは意図した回路になっているかを検査します。両方に合格して設計が完了します。
8.2 工程5:回路の抽出
レイアウトの図形から、トランジスタと配線の情報を取り出す。
前提
第6章でDRC 0件に到達し、
inverter.mag を保存している。
入力
extract.tcl を作成します。
load inverter select top cell extract do local extract all ext2spice lvs ext2spice -o inverter_layout.spice quit -noprompt実行します。
magic -dnull -noconsole \ -rcfile $PDK_ROOT/sky130A/libs.tech/magic/sky130A.magicrc extract.tcl画面
Extracting inverter into inverter.ext: Processing inverter exttospice finished.
| コマンド | 内容 |
|---|---|
extract do local | 抽出結果を現在のディレクトリに出力する設定 |
extract all | 図形から回路情報(.ext)を生成する |
ext2spice lvs | LVS用の設定。寄生成分を含めない |
ext2spice -o ... | SPICEネットリストとして出力する |
cat inverter_layout.spice画面
* NGSPICE file created from inverter.ext - technology: sky130A .subckt inverter VSS VDD OUT IN X0 OUT IN VSS VSS sky130_fd_pr__nfet_01v8 ad=0.725 pd=3.45 as=0.725 ps=3.45 w=1 l=0.15 X1 OUT IN VDD VDD sky130_fd_pr__pfet_01v8 ad=2.5375 pd=8.45 as=2.5375 ps=8.45 w=3.5 l=0.15 .ends読み方
描いた図形から取り出された回路です。トランジスタが2個、端子が4つ出ています。
w=1 と w=3.5 は、第6章で描いた拡散層の縦方向の寸法です。図形の寸法がそのまま数値になっています。D02 で決めた3.5倍が、ここに現れます。l=0.15 は poly の幅です。ad、pd、as、ps はソースとドレインの面積と周囲長で、図形から計算された値です。第3章で xschem が自動計算した値(ad=0.29、ad=1.015)とは異なります。xschem は標準的な仮定で計算し、magic は実際に描いた図形から計算するためです。.subckt の行に VSS VDD OUT IN が並んでいれば、第6章で付けたラベルとポートが認識されています。確定したこと
レイアウトから回路が取り出せた。次はこれを回路図と照合する。
.subckt inverterのように端子名がない場合、ポートが登録されていません。第7章7.5節の段階7に戻り、
port make を実行したかを確認します。label だけでは端子になりません。また、ラベルが配線の上に載っていない場合も端子になりません。cat inverter.mag の << labels >> の行で、flabel locali ... のように層名が入っているかを確認します。flabel space ... となっていれば、配線のない場所に置かれています。
8.3 工程6:LVSの実行
レイアウトから抽出した回路と、回路図が一致するかを照合する。
前提
回路図側のネットリストが必要です。第3章で作成した
inverter.sch(テストベンチではなくインバータ単体)から出力します。
xschem -n -q -x inverter.sch入力
netgen -batch lvs \ "inverter_layout.spice inverter" \ "inverter.spice inverter" \ $PDK_ROOT/sky130A/libs.tech/netgen/sky130A_setup.tcl \ comp.out
| 引数 | 内容 |
|---|---|
"inverter_layout.spice inverter" | レイアウト側のファイルとセル名 |
"inverter.spice inverter" | 回路図側のファイルとセル名 |
sky130A_setup.tcl | sky130用の照合設定(PDKに同梱) |
comp.out | 結果の出力先 |
Circuit 1 contains 2 devices, Circuit 2 contains 2 devices. Circuit 1 contains 4 nets, Circuit 2 contains 4 nets. Final result: Circuits match uniquely. . LVS Done.読み方
デバイス数とネット数が両側で一致し、
Circuits match uniquely が出れば、接続としては一致しています。ただし、この表示だけでは合格と判定できません。次項を参照します。
確定したこと
接続は一致した。寸法の一致は別に確認する。
netgen は、接続の照合と寸法の照合を別に扱います。トランジスタの幅が違っていても、接続が同じであれば
Circuits match uniquely と表示します。本講座で、PMOSの幅だけを変えた回路図と照合したところ、次の出力になりました。
Final result: Circuits match uniquely. Property errors were found. The following cells had property errors: sky130_fd_sc_hd__inv_1
Circuits match uniquely. の行だけを読むと合格に見えます。実際には幅が違っています。合格の判定は、次の2条件がともに成り立つこととします。
・
comp.out に Circuits match uniquely が含まれる・
comp.out に Property errors were found が含まれない
本講座で3通り確認しました。一致した場合、幅が違う場合、素子数が違う場合のいずれも終了コードは 0 です。
Makefile の判定に終了コードは使えません。
comp.out の中身を文字列で調べる必要があります。
lvs: netgen -batch lvs \ "inverter_layout.spice inverter" \ "inverter.spice inverter" \ $(PDK_ROOT)/sky130A/libs.tech/netgen/sky130A_setup.tcl \ comp.out @grep -q "Circuits match uniquely" comp.out \ && ! grep -q "Property errors were found" comp.out \ && echo "LVS OK" \ || (echo "LVS NG" ; exit 1)読み方
1つ目の
grep で一致を確認し、2つ目の grep で寸法の違反がないことを確認します。両方を満たしたときだけ LVS OK を表示します。実行の最後に出る
Logging to file "comp.out" disabled はログを閉じた旨で、ファイルは正しく書かれています。
| コマンド | 検証内容 | 作成した章 |
|---|---|---|
make check | 特性が基準を満たすか(15条件) | 第5章 |
make drc | 製造可能な形状か | 第6章 |
make lvs | 回路図と一致しているか | 本章 |
8.4 【判断点 D07】不一致の原因
初回のLVSでは不一致が発生する場合があります。本講座では、バックゲートがVDDに接続されていない状態を作って確認しました。次の出力になります。
Circuit 1 contains 2 devices, Circuit 2 contains 2 devices. Circuit 1 contains 5 nets, Circuit 2 contains 4 nets. *** MISMATCH *** Final result: Netlists do not match. Port matching may fail to disambiguate symmetries.
デバイス数は一致していますが、ネット数がレイアウト側で1つ多くなっています。バックゲートがどこにもつながっていないため、独立したネットとして数えられたためです。
決めること
不一致の原因が回路図側とレイアウト側のどちらにあるか。どちらを先に調べるか。
材料
・
comp.out の全文・
inverter.spice(回路図側)の全文・
inverter_layout.spice(レイアウト側)の全文・PDK名、netgen のバージョン
相談
質問:
「netgenのLVSが不一致になりました。2つのネットリストを比較し、差異を具体的に指摘してください。そのうえで、原因が回路図側とレイアウト側のどちらにある可能性が高いかを、根拠とともに3つ挙げてください。それぞれの確認方法も記載してください。」
返答
| 不一致の種類 | 確認する側 | 主な原因 |
|---|---|---|
| ネット数がレイアウト側で多い | レイアウト | タップの未配置、配線の断線、バックゲート未接続 |
| ネット数がレイアウト側で少ない | レイアウト | 他の配線との短絡 |
| デバイス数が異なる | レイアウト | 拡散層とpolyの意図しない交差 |
| 端子名が対応しない | 両方 | ラベルの表記違い、port make の漏れ |
| property error が出る | 両方 | 回路図のWと図形の幅の不一致 |
レイアウト側を先に確認する。
理由:回路図は xschem が接続を管理するのに対し、レイアウトは手作業で作成しているため。
検証
本講座の作成過程で実際に発生した不一致は、すべてレイアウト側が原因でした。詳細は7.5節に記載します。
判定:◯
8.5 本講座で実際に発生した不一致
第6章のレイアウト作成中に、次の3つの不一致が発生しました。いずれもレイアウト側の問題です。
| 症状 | 原因 | 対処 |
|---|---|---|
| ネット数が 6 対 4 | タップの層名が誤っており、図形が作られていなかった | psc / nsc に修正(第7章7.3節) |
.subckt inverter に端子が並ばない | port make を実行していなかった | ラベルの後に port make を追加 |
| OUT だけが端子にならない | ラベルが配線のない場所に置かれていた | 配線の実座標にラベルを移動 |
タップの図形がなくても、DRCは0件で通ります。図形として問題がないためです。
不一致が出るのはLVSです。回路図ではバックゲートがVDD/VSSに接続されているのに、レイアウトに対応する接点がないため、ネットの数が合いません。
本講座の作成過程でも、この症状が最初に発生しました。DRCが0件になった時点で完成したと判断せず、LVSまで通して確認します。
2つのネットリストは、ノード名が自動生成された記号を含み、記述順も一致しません。この比較はテキスト処理として行うほうが確実です。
両方の全文を渡して差異を指摘させ、修正後に
make lvs で判定します。回答の正誤が短時間で機械的に確認できる形になっています(第1章1.5節)。
8.6 寄生成分を含めた再測定
配線が持つ容量を含めて、特性がどれだけ変わるかを測定する。
前提
LVSに合格している。
入力
抽出の設定を変更します。
pex.tcl を作成します。
load inverter select top cell extract do local extract all ext2spice cthresh 0 rthresh 0 ext2spice -o inverter_pex.spice quit -noprompt読み方
cthresh 0 rthresh 0 は、すべての容量と抵抗を抽出する指定です。しきい値を0にすることで、小さな値も切り捨てずに出力します。
cat inverter_pex.spice画面
* SPICE3 file created from inverter.ext - technology: sky130A X0 OUT IN VSS VSS sky130_fd_pr__nfet_01v8 ad=0.725 pd=3.45 as=0.725 ps=3.45 w=1 l=0.15 X1 OUT IN VDD VDD sky130_fd_pr__pfet_01v8 ad=2.5375 pd=8.45 as=2.5375 ps=8.45 w=3.5 l=0.15 C0 VDD IN 0.12766f C1 OUT VDD 0.20201f C2 OUT IN 0.0967f C3 OUT VSS 0.33574f C4 IN VSS 0.29392f C5 VDD VSS 2.07525f読み方
トランジスタ2個に加えて、容量が6個追加されています。これが配線の持つ寄生容量です。
C5 VDD VSS 2.07525f が最大で 2.08fF です。VDDとVSSの配線が近接しているためです。出力ノードに付く容量は
C1、C2、C3 の合計で約 0.63fF です。第3章で置いた負荷容量 10fF に対して6%程度です。確定したこと
寄生容量が抽出できた。次に特性への影響を測定する。
配線が持つ意図しない容量と抵抗です。回路図には記述されませんが、実際の回路には存在します。
配線が長いほど、また近接する配線が多いほど大きくなります。特性は低下する方向に働きます。
テストベンチの回路部分を、抽出したネットリストに差し替えます。
.lib /foss/pdks/sky130A/libs.tech/combined/sky130.lib.spice tt .temp 27 .include inverter_pex.spice VDD VDD 0 1.8 VIN IN 0 PULSE(0 1.8 1n 50p 50p 5n 10n) CL OUT 0 10f VSSSRC VSS 0 0 .control dc VIN 0 1.8 0.002 meas dc vsp when v(OUT)=v(IN) reset tran 1p 20n meas tran t_rise TRIG v(OUT) VAL=0.18 RISE=1 TARG v(OUT) VAL=1.62 RISE=1 meas tran t_fall TRIG v(OUT) VAL=1.62 FALL=1 TARG v(OUT) VAL=0.18 FALL=1 quit .endc .end
| 項目 | 回路図のみ | 寄生成分あり | 変化 |
|---|---|---|---|
| スイッチング閾値 | 0.9002V | 0.9000V | −0.0002V |
| 立ち上がり時間 | 49.1ps | 51.5ps | +4.9% |
| 立ち下がり時間 | 50.0ps | 53.7ps | +7.3% |
| 差 | 2.0% | 4.2% | +2.2ポイント |
スイッチング閾値はほとんど変わりません。DC特性であり、容量の影響を受けないためです。遷移時間は5〜7%長くなります。
第5章の仕組みをそのまま使えます。
{CORNER} と {TEMP} の目印を入れて make check を実行します。
| コーナー | 温度 | Vsp(V) | tf(ps) | tr(ps) | 差(%) | 判定 |
|---|---|---|---|---|---|---|
| tt | −40 | 0.8530 | 47.4 | 51.6 | 8.1 | OK |
| tt | 27 | 0.9000 | 53.7 | 51.5 | 4.2 | OK |
| tt | 125 | 0.9707 | 63.6 | 51.9 | 18.4 | OK |
| ss | −40 | 0.8426 | 54.5 | 58.5 | 6.8 | OK |
| ss | 27 | 0.8883 | 62.7 | 57.6 | 8.1 | OK |
| ss | 125 | 0.9579 | 75.4 | 57.1 | 24.3 | OK |
| ff | −40 | 0.8686 | 41.6 | 46.8 | 11.0 | OK |
| ff | 27 | 0.9154 | 46.3 | 47.2 | 1.9 | OK |
| ff | 125 | 0.9845 | 53.9 | 48.5 | 10.0 | OK |
| sf | −40 | 0.7860 | 44.4 | 58.4 | 23.9 | OK |
| sf | 27 | 0.8345 | 50.1 | 56.7 | 11.6 | OK |
| sf | 125 | 0.9070 | 59.1 | 55.6 | 6.0 | OK |
| fs | −40 | 0.9194 | 51.0 | 46.6 | 8.5 | OK |
| fs | 27 | 0.9650 | 58.0 | 47.5 | 18.1 | OK |
| fs | 125 | 1.0337 | 69.0 | 49.0 | 29.0 | OK |
15条件すべて合格しました。最も余裕が小さいのは fs の125℃で、差が29.0%です。基準の30%に対して1.0ポイントしか余裕がありません。第5章の回路図のみの測定では25.3%だったため、寄生成分によって3.7ポイント悪化しています。
レイアウトの描き方によって寄生容量は変わります。配線を長くしたり、近接させたりすると増加します。
不合格が出た場合の対処は2つです。レイアウトを修正して寄生成分を減らすか、基準を見直すか。いずれを選択したかを記録します。
8.7 工程7:GDSの出力
製造工場に渡す形式でデータを書き出す。本講座の到達点。
入力
magic のコマンド欄、または tcl ファイルで実行します。
load inverter gds write inverter.gdsターミナルで確認します。
ls -l inverter.gds file inverter.gds画面
-rw-r--r-- 1 user user 3824 ... inverter.gds inverter.gds: GDSII Stream file version 3.0読み方
GDS は、本講座で扱うファイルのうち唯一のバイナリ形式です(第0章)。
cat で開いても読めません。file コマンドで形式を確認します。大きさは 3,824バイトです。トランジスタ2個分の図形データはこの程度です。
確定したこと
工程7が終わった。DRCとLVSに合格したGDSファイルができた。
magic のコマンド欄で確認します。
load inverter select top cell box values画面
microns: 3.30 x 8.02読み方
本講座で作成したインバータは 3.30µm × 8.02µm です。
参考として、標準セルライブラリのインバータ
sky130_fd_sc_hd__inv_1 は 1.76µm × 3.20µm です。面積で約4.7倍の差があります。標準セルは面積を最適化して設計されており、また NMOS の W が 0.65µm、PMOS が 1.0µm(比 1.54)と、本講座とは目標が異なります。目標が違えば設計も違うという例として使えます。
書き出した内容は、magic とは別のソフトで開いて確認します。
klayout inverter.gds &読み方
同じソフトで書いて同じソフトで読むと、書き出しの誤りに気づけません。klayout が工程に含まれないのは、この確認のためです(第0章)。
klayout で図形が表示され、寸法が magic と一致していれば、書き出しは正常です。
Tiny Tapeout のアナログ枠に収める場合
| 項目 | 内容 |
|---|---|
| タイル数 | アナログ設計は2タイル以上(1x2 または 2x2) |
| アナログピン | ua[0] 〜 ua[5] |
| 金属層 | metal5 は使用不可 |
| 電源 | met4のストライプで供給。主電源 VDPWR は1.8V |
| 提出物 | GDSとLEF(lef write inverter -pinonly) |
| 設定ファイル | info.yaml にタイル数とアナログピンを記述 |
価格と締切はシャトルごとに変わります。実際に検討する際は Tiny Tapeout の公式サイトで最新の条件を確認します。
本講座の作成時点では、アナログ設計の最小構成でおよそ200ユーロ台からとされていました。この金額は参考値です。
8.8 判断点の集計
| 番号 | 決めたこと | 決定内容 | 検証 | 判定 |
|---|---|---|---|---|
| D01 | トランジスタの種類 | 標準 01v8、電源1.8V | 計算が収束した | ◯ |
| D02 | PMOSの幅の倍率 | 3.5倍 | Vsp = 0.9002V、差 2.0% | △ |
| D03 | チャネル長 | 最小 0.15µm | DRC 0件に到達 | ◯ |
| D04 | 合格の基準 | 0.9V±0.15V、差30%以内 | 15条件すべて合格 | ◯ |
| D05 | レイアウトの配置 | 縦積み | DRC 0件、LVS一致 | ◯ |
| D06 | DRCの修正順 | 層→囲み→間隔→寸法 | 囲みの修正で32→15件 | ◯ |
| D07 | LVS不一致の原因 | レイアウト側から確認 | 3件すべてレイアウト側 | ◯ |
判断が想定どおりにならなかった箇所
7箇所のうち、当初の想定が実測で覆ったものが1件あります。
| 番号 | 想定 | 実測 | 対処 |
|---|---|---|---|
| D02 | PMOSの幅は2〜3倍で0.9Vに近づく | 2倍で0.8733V、3倍で0.8936V。0.9Vには3.5倍を要した | 候補の範囲の外の値を採用した |
AIの返答が誤っていたのではなく、返答が示した一般的な範囲と、この設計での実測値が一致しなかったものです。第1章1.5節の基準に従い、短時間で機械的に確認できたため、実測値を採用しました。
確認手段がなければ、「2倍が一般的」という回答をそのまま採用していたことになります。その場合、遷移時間の差は34.5%となり、D04で定めた30%の基準を満たしませんでした。
AIが回答できた項目とできなかった項目
| 項目 | AIの回答 | 確認手段 |
|---|---|---|
| W/L比の候補 | 提示できる。範囲は実測とずれた | シミュレーション |
| DRCエラーの意味 | 提示できる | 修正して再実行 |
| LVS不一致の箇所 | 提示できる | 修正して再照合 |
| 合格の基準 | 案は提示できるが決定できない | なし |
| 速度と面積のどちらを優先するか | 決定できない | なし |
| 製造に出すかどうか | 決定できない | なし |
この区分は、第1章1.5節で示した基準と一致します。回答の正誤を短時間で機械的に確認できる項目についてはAIに相談でき、確認手段のない項目は人が決定します。確認手段のない項目は、いずれも目的と優先順位に関する判断です。
8.9 まとめと次の課題
作成したのはトランジスタ2個のCMOSインバータ1個です。工程は7つ、判断点は7箇所でした。出力物は、DRCとLVSに合格した 3.30µm × 8.02µm のGDSファイルです。
規模が大きくなっても、工程の数、判断の記述形式、検証の方法は変わりません。
| 目的 | 参照先 |
|---|---|
| より大きな回路を設計する | 応用編「コードで回すアナログ設計」(オペアンプ) |
| デジタル側の物理設計を学ぶ | 基礎03「LibreLane入門」 |
| 製造に出す | Tiny Tapeout、ISHI会のハンズオン |
| 別のPDKを使用する | IHP sg13g2(コンテナに同梱) |
| チップを実装する基板を作る | 基礎01「KiCad入門」 |
オペアンプではトランジスタが十数個になり、本講座の手順(1候補あたり9操作)では実行できません。第4章では6つの倍率を測るのに54操作を要しました。素子が十数個になれば、組み合わせは桁が変わります。
応用編では、事前にトランジスタの特性を表として作成し、仕様からその表を参照して寸法を決定する方法を扱います。
・LVSは意図した回路になっているかを検査する。DRCとは検査対象が異なる
・
Circuits match uniquely だけでは合格ではない。Property errors were found がないことも確認する・netgen の終了コードは常に 0。判定は
comp.out の文字列で行う・抽出結果に端子が出ない場合は
port make の漏れ、またはラベルの位置を確認する・【D07】レイアウト側から確認する。本講座で発生した3件はすべてレイアウト側だった
・タップの未配置はDRCでは見つからない。LVSまで通して確認する
・寄生容量は6個抽出された。遷移時間は5〜7%長くなった
・寄生成分を含めても15条件すべて合格。最小の余裕は
fs 125℃ の1.0ポイント・作成したセルは 3.30µm × 8.02µm。標準セルの約4.7倍の面積
・GDSは唯一のバイナリ形式。書き出した結果は klayout で確認する
・7箇所のうち1箇所(D02)で、想定と実測が食い違った