アナログIC設計入門

CMOSインバータを1個、回路図からGDSまで自分の手で描く

← 講義ポータルへ戻る
この章の学習のねらい
レイアウトから回路を抽出し、第3章の回路図と照合します。寄生成分を含めて特性を再測定し、GDSファイルを出力します。工程5、6、7です。判断点は D07「不一致の原因」。最後に判断点7箇所を集計します。
設計の工程 回路図、シミュレーション、レイアウト、DRC、抽出、LVS照合、GDS出力の7工程と、各工程で使用するツールを示した流れ図。 【図1-1】設計の工程 / 本章は [5][6][7] [1] 回路図 xschem [2] シミュレーション ngspice [3] レイアウト magic [4] DRC magic [5] 抽出 magic [6] LVS照合 netgen [7] GDS出力 magic 準備 5本 + sky130A
本章に掲載する数値と出力は、第0章に記載した環境(magic 8.3.678、netgen 1.5.323、ngspice 46、open_pdks f6eeac7d、2026年8月8日確認)で、第6章の手順で作成したレイアウトに対して実行して得たものです。

8.1 照合が必要な理由

ここまでに、回路図(第3章)とレイアウト(第6章)の2つを作成しました。レイアウトは手作業で作成しているため、回路図と一致している保証がありません。この一致を機械的に確認するのがLVSです。

LVS(Layout Versus Schematic)
レイアウトの図形から回路を抽出し、回路図と部品・接続・寸法を照合する処理です。
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.
表7-1 抽出コマンド
コマンド内容
extract do local抽出結果を現在のディレクトリに出力する設定
extract all図形から回路情報(.ext)を生成する
ext2spice lvsLVS用の設定。寄生成分を含めない
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=1w=3.5 は、第6章で描いた拡散層の縦方向の寸法です。図形の寸法がそのまま数値になっています。D02 で決めた3.5倍が、ここに現れます。
l=0.15 は poly の幅です。
adpdasps はソースとドレインの面積と周囲長で、図形から計算された値です。第3章で xschem が自動計算した値(ad=0.29ad=1.015)とは異なります。xschem は標準的な仮定で計算し、magic は実際に描いた図形から計算するためです。
.subckt の行に VSS VDD OUT IN が並んでいれば、第6章で付けたラベルとポートが認識されています。

確定したこと
レイアウトから回路が取り出せた。次はこれを回路図と照合する。
.subckt の行に端子が並んでいない場合
.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
表7-2 netgen の引数
引数内容
"inverter_layout.spice inverter"レイアウト側のファイルとセル名
"inverter.spice inverter"回路図側のファイルとセル名
sky130A_setup.tclsky130用の照合設定(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 が出れば、接続としては一致しています。
ただし、この表示だけでは合格と判定できません。次項を参照します。

確定したこと
接続は一致した。寸法の一致は別に確認する。
「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.outCircuits match uniquely が含まれる
comp.outProperty errors were found含まれない
netgen の終了コードは常に 0
本講座で3通り確認しました。一致した場合、幅が違う場合、素子数が違う場合のいずれも終了コードは 0 です。
Makefile の判定に終了コードは使えません。comp.out の中身を文字列で調べる必要があります。
Makefileへの追加
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 はログを閉じた旨で、ファイルは正しく書かれています。
表7-3 本講座で作成した検証コマンド
コマンド検証内容作成した章
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つ多くなっています。バックゲートがどこにもつながっていないため、独立したネットとして数えられたためです。

【判断点 D07】回路図とレイアウトのどちらを疑うか

決めること
不一致の原因が回路図側とレイアウト側のどちらにあるか。どちらを先に調べるか。

材料
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つの不一致が発生しました。いずれもレイアウト側の問題です。

表7-4 発生した不一致とその原因
症状原因対処
ネット数が 6 対 4タップの層名が誤っており、図形が作られていなかったpsc / nsc に修正(第7章7.3節)
.subckt inverter に端子が並ばないport make を実行していなかったラベルの後に port make を追加
OUT だけが端子にならないラベルが配線のない場所に置かれていた配線の実座標にラベルを移動
タップの未配置はDRCでは見つからない
タップの図形がなくても、DRCは0件で通ります。図形として問題がないためです。
不一致が出るのはLVSです。回路図ではバックゲートがVDD/VSSに接続されているのに、レイアウトに対応する接点がないため、ネットの数が合いません。
本講座の作成過程でも、この症状が最初に発生しました。DRCが0件になった時点で完成したと判断せず、LVSまで通して確認します。
ネットリストの比較(AIへの相談)
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の配線が近接しているためです。
出力ノードに付く容量は C1C2C3 の合計で約 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
表7-5 レイアウト前後の比較(tt、27℃)
項目回路図のみ寄生成分あり変化
スイッチング閾値0.9002V0.9000V−0.0002V
立ち上がり時間49.1ps51.5ps+4.9%
立ち下がり時間50.0ps53.7ps+7.3%
2.0%4.2%+2.2ポイント

スイッチング閾値はほとんど変わりません。DC特性であり、容量の影響を受けないためです。遷移時間は5〜7%長くなります。

15条件での再測定
第5章の仕組みをそのまま使えます。{CORNER}{TEMP} の目印を入れて make check を実行します。
表7-6 寄生成分を含めた15条件(Wp/Wn = 3.5、CL = 10fF)
コーナー温度Vsp(V)tf(ps)tr(ps)差(%)判定
tt−400.853047.451.68.1OK
tt270.900053.751.54.2OK
tt1250.970763.651.918.4OK
ss−400.842654.558.56.8OK
ss270.888362.757.68.1OK
ss1250.957975.457.124.3OK
ff−400.868641.646.811.0OK
ff270.915446.347.21.9OK
ff1250.984553.948.510.0OK
sf−400.786044.458.423.9OK
sf270.834550.156.711.6OK
sf1250.907059.155.66.0OK
fs−400.919451.046.68.5OK
fs270.965058.047.518.1OK
fs1251.033769.049.029.0OK

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 のアナログ枠に収める場合

表7-7 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 判断点の集計

表7-8 判断点の記録(全7箇所)
番号決めたこと決定内容検証判定
D01トランジスタの種類標準 01v8、電源1.8V計算が収束した
D02PMOSの幅の倍率3.5倍Vsp = 0.9002V、差 2.0%
D03チャネル長最小 0.15µmDRC 0件に到達
D04合格の基準0.9V±0.15V、差30%以内15条件すべて合格
D05レイアウトの配置縦積みDRC 0件、LVS一致
D06DRCの修正順層→囲み→間隔→寸法囲みの修正で32→15件
D07LVS不一致の原因レイアウト側から確認3件すべてレイアウト側

判断が想定どおりにならなかった箇所

7箇所のうち、当初の想定が実測で覆ったものが1件あります。

表7-9 想定と実測の差
番号想定実測対処
D02PMOSの幅は2〜3倍で0.9Vに近づく2倍で0.8733V、3倍で0.8936V。0.9Vには3.5倍を要した候補の範囲の外の値を採用した

AIの返答が誤っていたのではなく、返答が示した一般的な範囲と、この設計での実測値が一致しなかったものです。第1章1.5節の基準に従い、短時間で機械的に確認できたため、実測値を採用しました。

確認手段がなければ、「2倍が一般的」という回答をそのまま採用していたことになります。その場合、遷移時間の差は34.5%となり、D04で定めた30%の基準を満たしませんでした。

AIが回答できた項目とできなかった項目

表7-10 項目ごとの分類
項目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ファイルです。

規模が大きくなっても、工程の数、判断の記述形式、検証の方法は変わりません。

表7-11 次の選択肢
目的参照先
より大きな回路を設計する応用編「コードで回すアナログ設計」(オペアンプ)
デジタル側の物理設計を学ぶ基礎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)で、想定と実測が食い違った