アナログIC設計入門

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

← 講義ポータルへ戻る
この章の学習のねらい
第4章で54操作を要した手順を、コマンド1つで実行できるようにします。コーナー5種と温度3種の計15条件を一括実行し、合否を出力します。判断点は D04「合格の基準」。

本章は工程の実行方法を変更するもので、図1-1の7工程には含まれません。

本章に掲載する数値は、第0章に記載した環境(ngspice 46、open_pdks f6eeac7d、2026年8月8日確認)で、Wp/Wn = 3.5、CL = 10fF の条件で実行して得たものです。

6.1 自動化の対象

表5-1 第4章の作業の分類
作業担当本章での扱い
寸法の決定変更しない
ネットリストの出力機械自動化
シミュレータの起動機械自動化
コーナーと温度の変更機械自動化
結果と基準の比較機械自動化
基準を満たさない場合の対処の決定変更しない

自動化するのは、答えが一意に決まる処理のみです。

Makefile を使用する理由
コンテナに導入済みで、追加インストールが不要です。
外部サービスやAPIキーへの依存がありません。
人が実行しても、スクリプトが実行しても、AIのエージェントが実行しても、同じ結果が返ります。

6.2 コーナーと温度を差し替え可能にする

目的
1つのネットリストから、条件を変えた15本のネットリストを作れるようにする。

入力
code_shown の先頭2行を、置き換え用の目印に変更します。
.lib /foss/pdks/sky130A/libs.tech/combined/sky130.lib.spice {CORNER}
.temp {TEMP}
xschem でネットリストを出力します。
xschem -n -q -x tb_inverter.sch
grep -n "{CORNER}\|{TEMP}" tb_inverter.spice
画面
13:.lib /foss/pdks/sky130A/libs.tech/combined/sky130.lib.spice {CORNER}
14:.temp {TEMP}
読み方
2行が目印として残っていれば正しく出力できています。この2箇所を sed で置き換えることで、条件を変えたネットリストを作ります。

確定したこと
条件を外部から差し替えられるようになった。

6.3 実行するコーナーの選択

表5-2 コーナーの内容
コーナーNMOSPMOSインバータへの影響
tt標準標準中央
ss遅い遅い両方遅い。釣り合いは崩れない
ff速い速い両方速い。釣り合いは崩れない
sf遅い速いPMOS側が強くなる。閾値が下がる
fs速い遅いNMOS側が強くなる。閾値が上がる
tt / ss / ff の3種では釣り合いの崩れを測定できない
インバータの特性は、NMOSとPMOSの釣り合いで決まります。ssff は両方が同じ方向にずれるため、釣り合いはあまり崩れません。
釣り合いが最も崩れるのは sffs です。本講座の実測では、スイッチング閾値の最小値(0.786V)は sf の −40℃ で、最大値(1.034V)は fs の 125℃ で得られました。どちらも tt / ss / ff には現れません。
本章では5コーナーすべてを実行します。5コーナー×3温度で15条件です。

6.4 Makefile の作成

目的
ネットリストの出力からシミュレーションまでを1コマンドにする。

入力
作業ディレクトリに Makefile を作成します。
PDK_ROOT ?= /foss/pdks
TOP       = tb_inverter
CORNERS   = tt ss ff sf fs
TEMPS     = -40 27 125

.PHONY: all sim corners check clean

all: sim

$(TOP).spice: $(TOP).sch
	xschem -n -q -x $(TOP).sch

sim: $(TOP).spice
	sed -e "s/{CORNER}/tt/" -e "s/{TEMP}/27/" $(TOP).spice > run.spice
	ngspice -b run.spice

clean:
	rm -f $(TOP).spice run.spice results.txt *.raw *.log
コマンド行の行頭はタブ文字
スペースでは動作しません。コピー時にスペースへ変換される場合があります。
Makefile:8: *** missing separator. Stop. というエラーはこれが原因です。
確認は cat -A Makefile で行います。タブは ^I と表示されます。
xschem のオプション
-n はネットリストを出力する指定、-q は処理後に終了する指定、-x は X を使わない指定です。
-r というオプションもありますが、これは --no_readline(入力補完を使わない)であり、画面を開かない指定ではありません。Makefile から呼ぶ場合は -x を使います。
本講座では xschem 3.4.8 で、この4つのオプションが定義されていることを確認しています。
入力
make
画面
xschem -n -q -x tb_inverter.sch
sed -e "s/{CORNER}/tt/" -e "s/{TEMP}/27/" tb_inverter.spice > run.spice
ngspice -b run.spice
vsp                 =  9.00227e-01
t_rise              =  4.90678e-11
t_fall              =  5.00484e-11
読み方
実行されたコマンドが表示され、続いて結果が出ます。
2回目以降、回路図を変更していない場合は xschem の行が表示されません。make はファイルの更新時刻を比較し、必要な処理のみを実行します。

確定したこと
make の1操作で、tt・27℃の測定値が得られる。

6.5 15条件の一括実行

目的
15条件を自動で実行し、結果を1つのファイルにまとめる。

入力
Makefile に追加します。
corners: $(TOP).spice
	@echo "corner temp vsp t_fall t_rise" > results.txt
	@for c in $(CORNERS); do \
	  for t in $(TEMPS); do \
	    sed -e "s/{CORNER}/$$c/" -e "s/{TEMP}/$$t/" \
	        $(TOP).spice > run.spice ; \
	    echo -n "$$c $$t " >> results.txt ; \
	    ngspice -b run.spice 2>&1 \
	      | grep -E "^vsp|^t_fall|^t_rise" \
	      | awk '{printf "%s ", $$3}' >> results.txt ; \
	    echo "" >> results.txt ; \
	  done \
	done
	@cat results.txt
実行します。
make corners
表5-3 15条件の実測値(Wp/Wn = 3.5、CL = 10fF)
コーナー温度Vsp(V)tf(ps)tr(ps)差(%)
tt−400.853044.649.39.4
tt270.900250.049.12.0
tt1250.970958.549.515.4
ss−400.842650.554.98.1
ss270.888457.454.05.9
ss1250.958068.253.621.4
ff−400.868839.945.312.0
ff270.915844.045.73.8
ff1250.985050.546.97.1
sf−400.786142.155.223.7
sf270.834747.053.612.2
sf1250.907254.852.63.9
fs−400.919547.745.05.8
fs270.965253.745.714.9
fs1251.034063.147.125.3
読み方
スイッチング閾値の範囲は 0.786V から 1.034V です。最小は sf の −40℃、最大は fs の 125℃ で、いずれも釣り合いが崩れるコーナーです。
遷移時間の差の最大は fs の 125℃ で 25.3% です。
温度の影響も読み取れます。tt では −40℃ で 0.8530V、125℃ で 0.9709V と、0.118V 動きます。高温ほど閾値が上がります。

確定したこと
15条件の測定値が得られた。合否の基準はまだ決めていない。

6.6 【判断点 D04】合格の基準

測定値が得られるようになりましたが、どの値であれば合格とするかは決まっていません。これは人が決定します。

【判断点 D04】何をもって合格とするか

決めること
判定に使用する項目と、合格とする範囲。範囲を狭くすると設計の精度は上がるが、条件によっては合格しなくなる。

材料
・測定可能な値:スイッチング閾値、立ち上がり時間、立ち下がり時間
・対象:学習用のCMOSインバータ
・表5-3の15条件の実測値
・差の定義:|tr − tf| ÷ max(tr, tf) × 100(第5章5.4節)

相談
渡したもの:上記の材料と表5-3の全データ。
質問:
「学習用のCMOSインバータについて、合否判定に使用する項目と範囲の案を3通り、範囲の狭い順に挙げてください。それぞれについて、添付した15条件の実測値で何件が不合格になるかも記載してください。」

返答
スイッチング閾値立上・立下の差
狭い0.9V ± 0.05V10%以内
中間0.9V ± 0.15V30%以内
広い0.7〜1.1V50%以内
決定
中間の案。スイッチング閾値 0.9V ± 0.15V(0.75〜1.05V)、立ち上がりと立ち下がりの差 30%以内。
理由:狭い案では実測で9条件が不合格になり、設計の問題か基準の問題かを切り分けられない。広い案では全条件が大きな余裕をもって合格し、判定として機能しない。

検証
中間の案で15条件すべてが合格した。最も余裕が小さいのは sf の −40℃ で、Vsp が下限(0.75V)に対して 0.036V の余裕。次いで fs の 125℃ で、上限(1.05V)に対して 0.016V の余裕。
判定:◯ 基準として機能している。ただし余裕は小さい。
基準の広さを実測で確かめる
3つの案のうちどれを選ぶかは、実際に判定してみれば分かります。本講座では、狭い案(0.9V±0.05V、差10%以内)でも判定を実行しました。結果は15条件中9条件が不合格でした。
不合格の内訳は、tt の125℃、ss の−40℃と125℃、ff の−40℃と125℃、sf の−40℃と27℃、fs の27℃と125℃です。tt の27℃を含む6条件だけが合格します。
これは設計に問題があるのではなく、基準が狭すぎることを示します。基準を決める前に、両方の案で判定してみる方法が有効です。

6.7 合否判定の自動化

目的
D04で決定した基準をコードに書き、人が表を読まなくても合否が出るようにする。

入力
check.py を作成します。
import sys

VSP_MIN, VSP_MAX = 0.75, 1.05   # 0.9V +- 0.15V
DIFF_MAX = 0.30                 # rise/fall difference

ng = 0
total = 0
for line in open('results.txt').readlines()[1:]:
    f = line.split()
    if len(f) < 5:
        continue
    total += 1
    corner, temp = f[0], f[1]
    vsp, tf, tr = float(f[2]), float(f[3]), float(f[4])
    msg = []
    if not (VSP_MIN <= vsp <= VSP_MAX):
        msg.append('vsp=%.4f' % vsp)
    if max(tr, tf) > 0 and abs(tr - tf) / max(tr, tf) > DIFF_MAX:
        msg.append('diff=%.1f%%' % (abs(tr - tf) / max(tr, tf) * 100))
    if msg:
        print('NG  %-3s %5s  %s' % (corner, temp, ', '.join(msg)))
        ng += 1
    else:
        print('OK  %-3s %5s' % (corner, temp))

print('---')
print('NG: %d / %d' % (ng, total))
sys.exit(1 if ng else 0)
Makefile に追加します。
check: corners
	python3 check.py
入力
make check
画面
OK  tt    -40
OK  tt     27
OK  tt    125
OK  ss    -40
OK  ss     27
OK  ss    125
OK  ff    -40
OK  ff     27
OK  ff    125
OK  sf    -40
OK  sf     27
OK  sf    125
OK  fs    -40
OK  fs     27
OK  fs    125
---
NG: 0 / 15
読み方
NG: 0 / 15 であれば全条件が合格です。
不合格がある場合、その行に、どの値が基準を外れたかが表示されます。表示の形式は次のとおりです。
NG  fs    125  vsp=1.0340, diff=25.3%
また、不合格があると check.py は終了コード1を返し、make は Error 1 を表示して停止します。これは異常ではなく、不合格を make に伝えるための動作です。

確定したこと
合否を機械が判定できるようになった。第1章1.5節の「短時間で機械的に確認できるか」に対する手段が make check である。
表5-4 本章で作成したターゲット
コマンド内容
make / make simtt・27℃で1回実行する
make corners15条件を実行し results.txt を作成する
make check15条件を実行し合否を出力する
make clean生成ファイルを削除する
回帰(レグレッション)
定めた条件をすべて自動で実行し、合否を判定する仕組みです。デジタル設計では標準的な手法で、基礎02「FPGA入門」のテストベンチも同じ考え方です。
第7章では、レイアウトから抽出した寄生成分を含むネットリストに対して、同じ make check を実行します。

6.8 不合格が出た場合の対処

本講座の条件では15条件すべてが合格しました。読者の環境で不合格が出た場合の手順を示します。

AIに渡す情報
1. 合否判定の基準(D04で決定した内容と差の定義)
2. results.txt の全文(合格した行を含む)
3. make check の出力
4. 現在のトランジスタ寸法(NMOS/PMOSそれぞれの W, L, nf, m)
5. PDK名とバージョン、ngspiceのバージョン

質問:
「この結果で不合格となっている条件について、原因の候補を3つ、可能性の高い順に挙げてください。それぞれについて、どのパラメータをどちらの方向に変更すればよいかと、変更により悪化する可能性のある項目を記載してください。」
合格した行も渡す
15条件のうちどれが合格しどれが不合格かの分布に、原因が現れます。
fs 側だけが不合格であれば、NMOSが強すぎる方向です。PMOSの幅を増やす対処が考えられます。
sffs の両方で不合格であれば、片方が強すぎるのではなく、両方向のばらつきに対して余裕が足りない状態です。幅の比を動かしても片方が改善して片方が悪化します。この場合はチャネル長を大きくする(D03の変更)か、基準を見直すことになります。
この章のまとめ
・【D04】スイッチング閾値 0.9V ± 0.15V、立上と立下の差30%以内を合格基準とした
・【D04判定】◯ 15条件すべてが合格。基準として機能している
・狭い案(0.9V±0.05V、差10%以内)では9条件が不合格になることを実測で確認した
・コーナーは5種を実行する。閾値の最小・最大は sffs に現れ、tt/ss/ff には現れない
・実測の閾値の範囲は 0.786V(sf、−40℃)から 1.034V(fs、125℃)
・最も余裕が小さいのは sf の −40℃ で 0.036V
・条件は {CORNER}{TEMP} の目印を sed で置き換える
・Makefile から xschem を呼ぶ場合は -x を付ける。-r は画面を開かない指定ではない
make check で15条件の合否が得られる
・自動化の対象は答えが一意に決まる処理のみ。判断は人が行う