アナログIC設計入門

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

← 講義ポータルへ戻る 第3章:工程1・回路図

第3章 回路図の作成 ― xschem でインバータを描く

この章のねらい。 xschem を使って、CMOSインバータの回路図を1枚描きます。設計の7工程のうち、最初の工程1です。描いた図は、最後にSPICEネットリストという文字の形へ変換します。この変換が通ること自体が、回路図の検査になっています。判断点は D01「デバイスと寸法」。進め方は、決める(3.2節)→ 環境を戻す(3.3節)→ 描く(3.4〜3.6節)→ 検査する(3.7節)→ 動かす準備をする(3.8節)の順です。
設計の7工程と、本章の位置 回路図、シミュレーション、レイアウト、DRC、抽出、LVS照合、GDS出力の7工程と、各工程で使うツールを示した流れ図。本章は工程1の回路図。 設計の7工程 / 本章は [1]回路図 [1]回路図 xschem [2]計算 ngspice [3]レイアウト magic [4]DRC magic [5]抽出 magic [6]LVS照合 netgen [7]GDS出力 magic 準備(第2章) 5本 + sky130A
図1-1 設計の工程 本章が扱うのは、いちばん左の[1]回路図です。この図は第2章以降の各章の冒頭に置き、その章の担当箇所を色で示します。

3.1 この章で作るもの

作るものは2つです。CMOSインバータの回路図が1枚と、そこから生成したSPICEネットリスト。まず、その回路がどんな形をしているかを見ておきます。

CMOSインバータの回路 VDDとVSSの間にPMOSとNMOSを縦に積み、両方のゲートを入力INにつなぎ、両者の接続点を出力OUTにした回路。PMOSのバックゲートはVDDへ、NMOSのバックゲートはVSSへ接続する。 CMOSインバータ ― トランジスタ2個、端子は4本ずつ VDD(1.8V) PMOS S D G B NMOS D S G B VSS(0V) IN OUT バックゲート バックゲート
図3-1 CMOSインバータの回路 端子は1個あたり4本あります。ゲート(G)、ドレイン(D)、ソース(S)に加えて、バックゲート(B)。破線で描いた2本がそれで、PMOSは VDD へ、NMOSは VSS へつなぎます。3.6節で配線します。
表3-1 入力と出力の関係
入力PMOSNMOS出力
L(0V)ONOFFH(VDDに接続)
H(1.8V)OFFONL(VSSに接続)

PMOSとNMOSは、同時にONになりません。このため止まっている間はVDDからVSSへ電流が流れず、電力を使うのは切り替わる瞬間だけになります。これがCMOSという方式の要点です。

この章の道順

  1. 決める(3.2節) どのトランジスタを使い、チャネル長と幅をいくつにするか。手を動かす前に決めます。
  2. 環境を戻す(3.3節) 第2章で作った環境を呼び戻し、設定ファイルを2つ置きます。ツールを動かす準備です。
  3. 描く(3.4〜3.6節) 部品を6個置き、寸法を設定し、線でつなぎ、4つのピンに名前を付けます。
  4. 検査する(3.7節) ネットリストに変換します。変換が通ることが、回路図が正しいことの確認になります。
  5. 動かす準備をする(3.8節) 電源と入力信号を加えたテストベンチを作ります。実行は第4章です。
なぜ、ネットリストを手で書かずに図から作るのか。
SPICEネットリストはただのテキストなので、エディタで直接書くこともできます。それでも図から生成するのには、理由が2つあります。
ひとつは、xschem が W と L から拡散領域の面積と周囲長(adaspdps)を自動で計算して付けることです。これらが無いネットリストで測ると、遷移時間が約20%短く出ます。手で書くと、この値が正しくなりません。
もうひとつは、第7章のLVS照合が「回路図とレイアウトを突き合わせる」作業だからです。回路図が基準、レイアウトが検証対象という関係になります。基準の側が手書きでは、照合の意味が薄れます。
なぜ、ネットリストが最後なのか。
ネットリストは回路図から生成される出力だからです。そして、生成が通ること自体が、回路図の検査になっています。
xschem の画面では、線が接して見えても1グリッドずれていれば、つながっていません。目で見て判別することはできません。ネットリストを出力してはじめて、undriven node や、自動でつけられた名前として現れます。3.7節の表題が「変換」ではなく「検査」なのは、このためです。

3.2 【判断点 D01】デバイスと寸法を決める

sky130 には、性格の違うトランジスタが何種類も入っています。まず、そのどれを使うかを決めます。

表3-2 sky130 の主なMOSトランジスタ
デバイス名耐圧特徴
sky130_fd_pr__nfet_01v8
sky130_fd_pr__pfet_01v8
1.8V標準。使用例と資料が最も多い
..._nfet_01v8_lvt
..._pfet_01v8_lvt
1.8V低しきい値。高速だが漏れ電流が増える
..._nfet_g5v0d10v5
..._pfet_g5v0d10v5
5V高耐圧。外部接続用。面積が大きい
デバイスを選ぶと、電源電圧も決まります。
名前の 01v8 は、耐えられる電圧が1.8Vであることを示しています。g5v0d10v5 なら5Vです。電源電圧は設計者が自由に決める値ではなく、選んだデバイスの耐圧が決めます。1.8V用のトランジスタに3Vを掛ければ壊れます。
この章で1.8Vを使うのは、そう決めたからではなく、01v8 を選んだ結果です。
【判断点 D01】使用するトランジスタ

決めること
標準(01v8)、低しきい値(lvt)、高耐圧(g5v0d10v5)のいずれを使うか。

材料
・対象:CMOSインバータ1個、学習目的
・到達点:DRCとLVSに合格したGDSの出力
・表3-2のデバイス一覧

相談
渡したもの:表3-2の一覧、上記の対象と到達点。
質問:
「この目的で使用するトランジスタの候補を3つ、それぞれ何を犠牲にするかとともに挙げてください。あわせて、その選択に対応する電源電圧も記載してください。」

返答
1. nfet_01v8 / pfet_01v8、電源1.8V。資料が最も多い。速度と漏れ電流は中程度
2. lvt、電源1.8V。しきい値が低く高速。待機時の漏れ電流が増える
3. g5v0d10v5、電源5V。外部信号を直接扱える。面積が大きく低速。レイアウトの設計規則が厳しい

決定
1(nfet_01v8 / pfet_01v8、電源1.8V)。
理由:参照できる資料が最も多いこと。Tiny Tapeout のアナログ枠の主電源が1.8Vであり、製造に進む場合も整合すること。

検証
第4章でシミュレーションが正常終了し、伝達特性が得られるかで判定します。
読者の作業:第4章4.1節で vsp の値が返れば ◯、返らなければ × として記録します。

チャネル長と幅を決める

デバイスが決まったので、残るのは寸法です。ここで大事なのは、sky130 が決めているのは下限だけだということです。その枠の中で、どの値にするかは設計者が選びます。

表3-3 この章で使う値(単位はµm)
記号内容NMOSPMOS決め方
Lチャネル長0.150.15sky130 の最小値そのもの
Wチャネル幅11最小は0.42。その範囲で選んだ値
nfフィンガー数11分割しない
m並列個数11並列にしない

L = 0.15µm は sky130 の最小ゲート長です。「130nmプロセス」と呼びますが、描ける最小のゲート長は150nmです。最小にすると面積が最小、速度が最大になります。インバータはデジタル的な用途なので、最小で構いません。アナログ回路では、特性のばらつきを避けるためにあえて最小を使わないこともあります。

W = 1µm は最小値ではありません。sky130 の最小幅は 0.42µm です。1µm にしたのは、切りのよい値であること、第4章でPMOSの幅を変える実験がしやすいことによります。設計上の必然はありません。

この章では、PMOSとNMOSを同じ幅にします
同じ幅にすると、立ち上がりと立ち下がりの速度が一致しません。PMOSは同じ寸法でも電流を流しにくいためです。
その理由と対処は、第4章の判断点 D02 で扱います。幅の比を決めるのは第4章の作業です。この章では、同じ値のまま進めてください。

3.3 中断から戻る ― コンテナの再開と、いまいる場所の読み方

3.1節と3.2節は、読んで決める作業でした。ここから先は、実際にツールを動かします。

その前に、ひとつ用意しておきます。この講座は途中で何度でも中断できます。日を改めても、パソコンを再起動しても、作ったものは消えません。ただし戻ってきたとき、「いま自分がどこにいて、どこまで終わっているのか」が読めないと、先へ進めません。その読み方を2つ、先に身につけます。第4章以降でも、そのまま使います。

読み方1 いま、どこで打っているのか

コマンドを打ち込む先は、パソコン本体か、コンテナの中か、ツールの中かのいずれかです。どれも同じ黒い画面に見えますが、別の場所です。取り違えたまま打つと、通らなかったり、通ってはいけないところで通ったりします。

見分けるのは1箇所だけ。入力を待っている行の、先頭の文字です。

表示の先頭で、いる場所が分かる パソコン本体ではPS C:¥で始まり、コンテナの中ではスラッシュfossで始まる。ツールの中ではそのどちらでもない表示になる。 先頭の文字を見れば、いま打っている先が分かる PS C:\Users\user> パソコン本体 コンテナの外。Docker を操作するのはここ /foss/designs > コンテナの中 5本のツールが使える。この章の作業場所 ngspice 1 -> など ツールの中 quit で出る。戻るまで次へ進まない
図3-2 表示の先頭と、いる場所 覚えるのは1つだけです。先頭が /foss ならコンテナの中、それ以外なら外。コンテナの中では、いまいるフォルダがそのまま表示されるため、作業場所へ移動すると /foss/designs/inverter > に変わります。
なぜ、これで見分けられるのか。
コンテナの中の表示は、いまいるフォルダの場所をそのまま出す設定になっています。コンテナの中に C:\ という場所は存在しないので、/foss で始まる表示は、コンテナの中でしか出ません。
パソコン側の PS C:\Users\user> も同じ性質です。先頭の文字が、そのままどちらの世界にいるかを表しています。第2章2.4節⑦で見たのは、これが切り替わる瞬間でした。
コンテナの中にいるつもりで、外で打っている
いちばん起きやすい取り違えです。エラーの文面が Linux 風に返るため、中にいるように見えます。
/bin/bash: /foss/designs/check.sh: そのようなファイルやディレクトリはありません
これは Windows 側の WSL が返したもので、コンテナではありません。
迷ったら pwd を1行打ちます。/foss で始まる場所が返れば、コンテナの中です。
なお、何も表示されず入力もできない場合は、処理の最中です。ダウンロードやシミュレーションでは、数十秒から数分かかることがあります。終わるまで待ってください。

読み方2 どこまで、終わっているのか

作業の途中で中断した場合、どの節まで終わったかは作業場所にあるファイルで分かります。本講座で作るものは、すべてファイルとして残るためです(第0章0.4節)。次の2行で確認します。

入力
cd /foss/designs/inverter
ls -a
-a は、先頭にピリオドの付くファイルも表示する指定です。付けないと .spiceinit が見えません。
表3-4 見えるファイルと、再開する場所
見えるもの終わっている節再開する場所
... だけ本節⑥
xschemrc .spiceinit3.33.4節
inverter.sch3.43.5節(下記)
inverter.spice3.73.8節
tb_inverter.sch tb_inverter.spice3.8第4章
3.5節と3.6節の途中だけは、ファイルでは判別できません
この2つの節は、どちらも inverter.sch に描き足していく作業です。ファイルの名前は変わりません。空の状態も、部品を6個置いた状態も、配線が半分の状態も、同じ inverter.sch です。
この範囲で中断した場合は、開いて画面を見ます。
xschem inverter.sch &
部品が置かれているか、線が引かれているか、ピンに名前が付いているかを見て、3.5節と3.6節のどこから続けるかを決めます。
この2つの節に入る前に、切りのよいところまで進めて Ctrl+S で保存してから離れることをお勧めします。保存していない分は残りません。

コンテナを再開する

読み方1でコンテナの外にいると分かった方は、①から行います。/foss で始まる表示が出ている方は、④へ進んでください。

なぜ、第2章の起動スクリプトをもう一度実行しないのか。
第2章でダウンロードした約3.4GBはイメージと呼ばれます。ツール一式の設計図にあたるもので、パソコンに保存されたまま残っています。
第2章⑥で起動スクリプトを実行したとき、このイメージからコンテナが1つ作られました。こちらが実際の作業場所です。/foss/designs/inverter を作ったのも、設定ファイルに2行を書き足したのも、このコンテナの中でした。
起動スクリプトは、コンテナを作るためのものです。すでにあるものを作ることはできないため、2回目以降に実行すると、次を表示して終わります。
Container iic-osic-tools_shell exists. Restart with "docker start iic-osic-tools_shell"
or remove with "docker rm iic-osic-tools_shell" if required.
再開に使うのは docker start作るのではなく、止まっているコンテナを動かし直す指定です。
① Docker Desktop を立ち上げてください
WindowsとmacOSの場合です。Linuxでこの作業は要りません。
スタートメニュー(macOSはアプリケーション)から起動し、通知領域のクジラのアイコンの動きが止まるまで待ちます。待たずに次へ進むと、②が失敗します。
② コンテナを再開してください
第2章2.3節で選んだ方式によって、打つ1行が異なります。

Windows(シェル方式)の場合
PowerShell を開き、次の1行を実行します。どのフォルダにいても構いません。
docker start -ai iic-osic-tools_shell
-ai は、起動したうえでその中につなぎ直す指定です。これがないとコンテナは動き出すものの表示が戻らず、止まったように見えます。

Linux・macOS(ブラウザ方式)の場合
ターミナルで次を実行し、そのあとブラウザで下のURLを開きます。
docker start iic-osic-tools_xvnc_uid_1000
http://localhost:80/?password=abc123
末尾の 1000 はご自身のユーザーIDです(id -u で確認できます)。デスクトップ画面が出たら、左下パネルの3番目のアイコンでターミナルを開きます(第2章2.5節③)。
コンテナの名前が分からないとき
名前は、方式とOSの組み合わせで4通りあります。手元のものは、コンテナの外で次の1行を打てば分かります。
docker ps -a
NAMES の列に iic-osic-tools で始まる名前が出ます。それを②の名前の部分に置き換えてください。
No such container と出る場合は、名前が違うか、コンテナを削除しています。削除している場合は第2章2.4節⑥(Linux・macOSは2.5節①)からやり直します。約3.4GBの再ダウンロードは発生しません。イメージのほうは残っているためです。
Docker Desktopアプリでも確認できます
コマンドラインでの確認に迷ったら、Docker Desktopアプリの Containers 画面を開き、対象のコンテナ名の横にある点の色を見る方法もあります。緑の点が「稼働中(Up)」を示します。
docker start -ai は、反応が返るまで間があることがあります
コマンドを実行した直後、画面が止まったように見えても、実際には数秒〜十数秒後に、正常にコンテナの中へ入れていることがあります。この講座の検証中、この待ち時間を「固まった」と誤認し、コンテナを不必要に再起動しかけたことがありました。
docker ps -a別のターミナル、コンテナの外で)を実行し、対象のコンテナが Up になっていれば、慌てず待ってください。
③ 表示が変わったことを確認してください
いちばん下の行が、次の形になっています。
/foss/designs >
図3-2のとおり、/foss で始まっていればコンテナの中です。ここから先に打つコマンドは、すべてコンテナの中で実行されます。
④ 設計データが sky130A になっているか確認してください
echo $PDKPATH
こう出れば成功です
/foss/pdks/sky130A
コンテナには5つの設計データが同梱されていて、初期値は sky130A ではありません(第2章2.4節⑨)。第2章⑩で設定ファイルに2行を書き足していれば、再開のたびに自動で切り替わります。この確認は、それが効いているかを見るものです。
/foss/pdks/ihp-sg13g2 のように別の名前が返った場合、書き足しができていません。次の2行をその場で実行してから⑤へ進み、あとで第2章2.4節⑩を行ってください。
export PDK=sky130A
export PDKPATH=$PDK_ROOT/$PDK
ここが sky130A でないまま先へ進まないでください。3.5節で、部品の一覧に sky130_fd_pr が出てきません。
⑤ 作業する場所へ移動してください
cd /foss/designs/inverter
pwd
こう出れば成功です
/foss/designs/inverter
第2章⑫で作ったフォルダです。この章から第7章までの作業は、すべてここで行います。表示も /foss/designs/inverter > に変わります。
No such file or directory と出た場合は、フォルダを作っていません。mkdir -p /foss/designs/inverter を実行してから、もう一度⑤を行います。

設定ファイルを2つ作る

作業場所は空です。ここに、これから使う設定ファイルを2つ置きます。xschem 用と、ngspice 用です。どちらも数行の短いファイルですが、これが無いと3.5節で部品が見つからず、第4章でシミュレーションが動きません。

⑥ 次の5行をまとめてコピーして、貼り付けて実行してください
cat > xschemrc << 'EOF'
source $env(PDK_ROOT)/sky130A/libs.tech/xschem/xschemrc
set netlist_dir [pwd]
set xschem_execute_scripts no
EOF
こう出れば成功です
何も表示されません。エラーが出ずに /foss/designs/inverter > に戻れば、作成できています。
cat > ファイル名 << 'EOF' は、「EOF と書いた行が来るまでの内容を、そのファイルに書き込む」という指定です。3行を打ち終えたら、最後に EOF の行で閉じます。
3行が、それぞれ何をしているのか。

1行目 source …/sky130A/libs.tech/xschem/xschemrc
sky130A に同梱されている xschem 用の設定を、まるごと読み込みます。この講座で sky130 のトランジスタが使えるのは、この1行のおかげです。部品ライブラリの置き場所、モデルの場所、メニューに追加される SKY130 の項目――これらは全部、読み込まれた側に書かれています。
$env(PDK_ROOT) は「環境変数 PDK_ROOT の中身」という意味です。$PDK_ROOT ではないことに注意してください。この書き方は xschem 側の言語(Tcl)のもので、シェルの書き方とは別です。

2行目 set netlist_dir [pwd]
ネットリストの出力先を、いまいるフォルダにする指定です。[pwd] は、⑤で使った pwd と同じもので、現在地を差し込んでいます。
この行が無いと、xschem はネットリストを ~/.xschem/simulations/ という別の場所へ書き出します。3.7節で「作ったはずのファイルが見つからない」という形で効いてきます。

3行目 set xschem_execute_scripts no
回路図の中に埋め込まれたスクリプトを、実行しない設定です。これが無いと、起動のたびに確認画面が出て、応答するまで他の操作ができません。本講座で作る回路図にスクリプトは入らないので、最初から切っておきます。
EOF を囲む引用符を外さないでください
<< 'EOF' の引用符には意味があります。外すと、1行目の $env(PDK_ROOT) がシェルに解釈され、空文字に置き換わって書き込まれます。
source /sky130A/libs.tech/xschem/xschemrc ← PDK_ROOT が消えている
$env(…) は xschem に渡してはじめて意味を持つ書き方なので、シェルには触らせず、そのままの文字で書き込む必要があります。引用符はそのための指定です。
作成後に cat xschemrc で中身を見て、$env(PDK_ROOT) の文字がそのまま残っているかを確認できます。
PDKの xschemrccp でコピーしてはいけません
同じファイルを読むのだから、source ではなく手元にコピーすればよさそうに見えます。資料によってはそう書かれています。この方法では動きません。
PDKの xschemrc は、その34行目で「この xschemrc が置かれているディレクトリ」を部品の検索先に加えます。作業フォルダにコピーすると、検索先が作業フォルダになってしまい、PDK側の部品が見つからなくなります。
症状は、3.7節のネットリスト出力でこう現れます。
l_s_d(): Symbol not found: sky130_fd_pr/nfet_01v8.sym
source で読めば、PDK側の場所が検索先に入ります。だから⑥は cp ではなく source なのです。
⑦ 次の1行をコピーして、貼り付けて実行してください
cp $PDK_ROOT/sky130A/libs.tech/ngspice/spinit ./.spiceinit
こう出れば成功です
こちらも何も表示されません。エラーが出なければ、コピーできています。
使うのは第4章ですが、置くのはいまです。環境を整える作業を1箇所にまとめておくと、あとで「どこかに置き忘れたファイルがある」という状態を避けられます。
なぜ ngspice にも設定ファイルが要るのか。
.spiceinit は、ngspice が起動時に読む設定ファイルです。中身は互換モードの指定で、sky130 のモデルが書かれている方言を ngspice に読ませるためのものです。
sky130 のモデルファイルは、もともと商用シミュレータ向けの書き方を含んでいます。この設定なしに読ませると、解釈が食い違い、計算結果が変わったりエラーで止まったりします。
効いているかどうかは、第4章4.1節の出力で分かります。次の2行が出れば読まれています。
Note: Compatibility modes selected: hs a
Using KLU as Direct Linear Solver
xschemrc と違い、こちらは cp でコピーして構いません。置かれた場所を検索先に加えるような記述が無く、中身がそのまま設定として働くためです。「設定ファイルは全部コピーでよい/全部 source すべき」という共通の決まりはなく、ファイルごとに事情が違います。
⑧ 2つできたことを確認してください
ls -a
こう出れば成功です
.  ..  .spiceinit  xschemrc
.spiceinit は先頭にピリオドが付くため、ls だけでは表示されません。-a を付けて確認します。
表3-4でいえば、2つ目の行に到達した状態です。次に中断したときは、この表示を見て3.4節から再開すればよいことになります。

確定したこと
xschem が sky130A の部品を扱えるようになり、ネットリストの出力先がこのフォルダに決まった。ngspice の設定も置いた。環境の準備はここで終わり。次から回路図を描く。

3.4 xschem を起動して、空の回路図を用意する

設定ファイルが揃いました。いよいよツールを開きます。①から⑤まで、順に実行します。終わったとき、手元には名前の付いた空の回路図が1枚ある――それがこの節の到達点です。

① 次の1行をコピーして、貼り付けて実行してください
xschem &
末尾の & は、バックグラウンドで動かす指定です。これを付けると、xschem を開いたまま同じターミナルで別の作業ができます。付けないと、xschem を閉じるまで次のコマンドが打てません。3.7節でターミナルに戻るので、付けておきます。

こう出れば成功です
ターミナル側に、設定ファイルの読み込み経過が10行以上流れます。その中に、次の行が含まれていることを確認してください。
Sourcing /foss/designs/inverter/xschemrc init file
これが、⑥で作った xschemrc が読まれた証拠です。この1行が無い場合、先へ進んでも3.5節で部品が見つかりません。3.3節⑤に戻り、xschemrc を置いたフォルダで起動しているかを pwd で確認してください。
続けて、次の2行も出ます。設計データが sky130A を指していることの確認になります。
open_pdks installation: using /foss/pdks
SKYWATER_MODELS: /foss/pdks/sky130A/libs.tech/combined
そのあと、ウィンドウが開きます。Windows でシェル方式を使っている場合、ブラウザの中ではなく、通常のウィンドウとして開きます。
[1] 28 は、成功の合図ではありません
& を付けて実行すると、ターミナルに [1] 28 のような表示が返ります。これは「バックグラウンドで起動を始めた」という意味しかありません。起動できたかどうかは示していません。
判断は、ウィンドウが開いたかどうかで行ってください。
また、この番号が [2] [3] と増えている場合は、xschem を複数起動しています。ウィンドウが重なって、どちらを操作しているか分からなくなります。次の2行で整理し、1つだけ起動し直してください。
jobs
kill %1 %2
jobs で現在の一覧が出ます。kill に渡す番号は、そこに出た番号に合わせます。
xschem の起動直後の画面。上端にメニューが並び、描画領域に見本の回路図 top.sch が表示されている
写真3-1 xschem の起動直後 開いているのは top.sch という見本の回路図です。自分の回路ではありません。
② 開いた画面が「見本」であることを確認してください
ウィンドウの上端に xschem - top.sch と表示され、部品がびっしり並んだ画面が出ます。写真3-1がそれです。
これは top.sch という見本の回路図で、sky130A に同梱されているものです。使える部品を一覧にしたページで、xschem をファイル名なしで起動すると最初に開きます。
中身を読む必要はありません。ここに自分の回路を描くのでもありません。次の③へ進みます。
③ メニューの右側に4項目が出ていることを確認してください
ウィンドウのいちばん上に、左から File Edit Options View Properties Layers Tools Symbol Highlight Simulation Help と11項目が並びます。その右に少し間隔があき、続けて次の4項目が同じ行に並びます。
SKY130   Netlist   Simulate   Waves
この4項目は、sky130A の設定によって追加されたものです。標準の xschem にはありません。出ていれば、⑥で作った xschemrc が働いています。
ただし、確実な確認点は①のターミナルの1行のほうです。この4項目は、設計データが sky130A に切り替わっているだけでも表示される可能性があります。画面は補助、ターミナルが本命、と考えてください。
xschem の画面構成 上からタイトルバー、メニュー、ツールバー、タブ、描画領域、状態表示の順に並ぶ。メニュー右の4項目と、状態表示の選択数に注記がついている。 xschem のウィンドウは、6つの帯でできている xschem - top.sch File Edit Options View Layers Tools … SKY130 Netlist Simulate Waves (アイコンが並ぶ) top.sch 描画領域(背景は黒) SNAP: 10 GRID: 20 MODE: spice mouse = -60 -2050 - selected: 0 開いているファイル名。 起動直後は top.sch sky130A の設定で 追加される4項目 タブ。回路図を 複数開いて切り替える ここに描く。カーソルを 置いた場所が操作の対象 SNAP はカーソルが 吸い付く間隔。selected は 選択中の要素の数
図3-3 xschem の画面構成(3.4.8RC) 下端の selected: は、いま選択している要素の数です。0 なら何も選んでいません。3.5節で Q を押す前に、ここが 1 になっているかを見ます。
ここで Ctrl+S を押さないでください
File メニューの SaveCtrl+S)は、いま開いているファイルへの上書き保存です。名前を付ける操作ではありません。
起動直後に開いているのは、見本の top.sch です。この状態で Ctrl+S を押すと、sky130A に同梱されている見本ファイルを上書きします。コンテナは管理者権限で動いているため、書き込みは通ってしまいます。
名前を付けて保存するのは Save asCtrl+Shift+S)。⑤で使います。
④ メニューの FileClear Schematic を選んでください
描画領域が空になります。見本が消え、ここに自分の回路を描ける状態になりました。Ctrl+N でも同じ動作です。
File メニューに New Schematic という項目はありません。他のソフトの感覚で探すと見つからないので、注意してください。空の回路図を作るのは Clear Schematic です。
メニューの中身は写真3-2のとおりで、上から3番目までが Clear SchematicClear SymbolComponent browser です。
xschem の File メニューを開いた状態。Clear Schematic、Save as、Quit Xschem などの項目とキー割り当てが並んでいる
写真3-2 File メニューの中身 右側の表示が、対応するキーです。New Schematic は存在せず、代わりに Clear Schematic があります。
スクリプト実行の確認画面が出た場合
回路図を開いたとき、次の確認画面(Alert)が表示されることがあります。
Allow xschem to execute scripts embedded in schematics?

WARNING:
  Allowing script execution is a potential security vulnerability,
  Do it only for schematics obtained from trusted sources.
本講座で作る回路図にスクリプトは含まれないため、No を選びます。
3.3節⑥の xschemrcset xschem_execute_scripts no を書いてあれば、この画面は出ません。出る場合は、その行が入っていないか、xschemrc が読まれていません。
この画面が出ている間、他の操作は一切受け付けられません。ウィンドウが固まったように見えたら、背後にこの画面が隠れていないか確認してください。
⑤ メニューの FileSave as で、inverter.sch という名前を付けてください
Ctrl+Shift+S でも同じです。
保存先が /foss/designs/inverter になっていることを確認し、ファイル名の欄に inverter.sch と入れます。
こう出れば成功です
ウィンドウ上端の表示が xschem - inverter.sch に変わります。ここが top.sch のままなら、保存できていません。タブの表示も同時に変わります。
名前が付いたあとは、Ctrl+S で上書き保存して構いません。危ないのは、名前を付ける前の Ctrl+S だけです。

確定したこと
名前の付いた空の回路図 inverter.sch ができた。ここから先は、xschem のウィンドウの中の作業になる。

3.5節・3.6節に入る前に

ここから2つの節は、キーボードとマウスの操作です。
3.5節と3.6節は、ターミナルではなく xschem のウィンドウの中で行います。表に書かれたキーは、描画領域にマウスカーソルを置いた状態で押します。ターミナルに貼り付けるものではありません。
ターミナルに戻るのは3.7節です。それまで、ターミナルには何も打ちません。
xschem は「カーソルの位置にキーを押す」ツールです。
多くのソフトは「対象を選んでから、ボタンを押す」順序です。xschem は逆で、「場所にカーソルを合わせて、そこでキーを押す」のが基本になります。押した瞬間のカーソルの位置が、操作の対象です。
基礎01「KiCad入門」を読まれた方は、操作の順序が反対になることに注意してください。ボタンを探しても、ほとんどの操作は見つかりません。
表3-5 xschem の基本操作
操作キー補足
部品の挿入Ctrl+I部品の一覧が開く。Shift+Insert でも同じ
配線の描画W始点でキー、終点でクリック
移動M対象にカーソルを合わせてから
コピーC同上
削除Delete同上
属性の編集Q先に対象をクリックして選択する
回転/反転R / F
全体表示Shift+Z迷ったらこれ。行方不明の図形も画面に入る
上書き保存Ctrl+S名前を付けるのは Save as
取り消しU直前の操作を戻す
3ボタンマウスが要ります。
xschem と magic は、マウスの左・中・右を使い分けます。左が選択、中が貼り付けと画面の移動、右がメニューです。
ホイールを押し込むと中ボタンになるマウスが大半です。中ボタンの無いマウスでは、画面の移動ができません。第1章の表1-2で3ボタンマウスを挙げているのは、このためです。
Q は、選択してから押します
何も選択していない状態(図3-3の selected: 0)で Q を押すと、部品ではなく回路図全体の設定画面(Text Input/Global schematic property)が開きます。見た目が似ているので、気づかずに書き換えてしまうことがあります。
部品の属性を編集するときは、先に対象をクリックし、下端が selected: 1 になったことを確認してから Q を押してください。正しく選べていれば、次の画面が開きます。
Edit Properties
Path:   /foss/designs/inverter
Symbol: sky130_fd_pr/nfet_01v8.sym

name=M1
L=0.15
W=1
上端に Symbol: の行があるのが、部品の編集画面です。これが無ければ、選択できていません。Esc で閉じて、選び直します。

3.5 部品を置いて、寸法を決める

本節の操作は、すべて xschem のウィンドウの中で行います。ターミナルには何も打ちません。

置く部品は6個です。トランジスタが2個と、外との出入口になるピンが4個。まず何を置くのかを見てから、置きます。

表3-6 配置する部品
部品ライブラリ内の位置個数役割
NMOSsky130_fd_pr/nfet_01v8.sym1出力を0Vへ引き下げる
PMOSsky130_fd_pr/pfet_01v8.sym1出力を1.8Vへ引き上げる
入力ピンdevices/ipin.sym1IN。信号が入ってくる口
出力ピンdevices/opin.sym1OUT。信号が出ていく口
電源ピンdevices/iopin.sym2VDD と VSS
なぜ、ピンが3種類に分かれているのか。
ipin(入力)、opin(出力)、iopin(入出力)の3種類は、信号がどちら向きに通るかを表しています。見た目の違いだけではありません。
この向きは、3.7節でネットリストに次の形で書き出されます。
*.ipin IN
*.opin OUT
*.iopin VDD
*.iopin VSS
電源に iopin を使うのは、電源が入力でも出力でもないからです。この回路にとって電源は「外とつながっている端子」であって、信号の向きがありません。そういう端子には iopin を使います。
そして、ここで付けた4つの端子が、そのまま第7章のLVS照合で突き合わせる端子になります。レイアウト側にも同じ名前の端子を作り、両者が一致するかを見ます。いまの4個は、最後まで効いてきます。
完成図は図3-1です。3.1節に戻って見比べながら進めてください。この節が終わった時点で、図3-1からバックゲートの破線2本を除いた形(部品6個・配線5本)ができています。バックゲートは次の3.6節で追加します。
① 部品の一覧(Component browser)を開いてください
描画領域にマウスカーソルを置き、Ctrl+I を押します。ボタンを押すのではなく、カーソルを置いた場所でキーを押します。メニューの FileComponent browser でも開きます(写真3-2)。
Insert symbol画面。左にRecent一覧、右に現在地の中身、下部にSearch欄
写真3-3 Insert symbol の実際の画面 左側はRecent(よく使う場所)の一覧で、フォルダの階層ではありません。右側が、選んでいる場所の中身です。下部の Search 欄に名前を打つと絞り込めます。
② NMOSとPMOSを、sky130_fd_pr から探してください
左側の Recent の中に、sky130A/libs.tech/xschem/sky130_fd_pr という行があれば、それをクリックします。無ければ UpHome で階層をたどります。
数が多いフォルダなので、下部の Search 欄に nfet_01v8 と打って絞り込みます。
Search欄にnfet_01v8と入力し絞り込んだ結果。nfet_01v8.symのほか_esd/_lvt/_lvt_nf/_nfの派生品が並ぶ
写真3-4 絞り込んだ結果に出る5つの候補 nfet_01v8.sym のほかに、_esd_lvt_lvt_nf_nf という接尾辞付きの部品が並びます。選ぶのは、接尾辞が付いていない nfet_01v8.sym だけです。
nfet_01v8.symnfet3_01v8.sym は別物です
検索結果には出てきませんが、Recent の履歴などから、うっかり nfet3_01v8.sym(数字の3が入った、別のシンボル)を選んでしまうことがあります。見た目も動作もよく似ていて、ネットリストの出力もエラーなく通るため、気づかないまま先へ進めてしまいます。
nfet3_01v8.sym は、バックゲート端子(B)を持たず、代わりに body= というプロパティで基板の接続先を指定する、3端子タイプのシンボルです。この章で使うのは、B端子を実際に配線する4端子タイプの nfet_01v8.sym です。
置いたあとは、必ず選択して Q を押し、Edit Properties の一番上「Symbol:」の行を確認してください。sky130_fd_pr/nfet_01v8.sym(数字の3が無い)になっているかを、その場で見ます。
Edit Properties画面。Symbol: sky130_fd_pr/nfet_01v8.symと表示され、正しい部品であることが確認できる
写真3-5 Symbol行での確認 いちばん上の Symbol: の行だけが、確実な判断材料です。model= の行は両方とも同じ値になりうるため、判断に使えません。
③ 4つのピンを、devices から探してください
左側の Recentxschem_library/devices という行があります。検索欄に ipinopiniopin をそれぞれ打って、表3-6のとおりに配置します。iopin は2個必要です(VDD用・VSS用)。
置く位置の目安は図3-1のとおりです。IN は左、OUT は右、VDD は上、VSS は下。位置が多少ずれていても構いません。M であとから動かせます。

確認:描画領域に部品が6個(PMOS・NMOS・ipin・opin・iopin×2)並んでいれば、この節の配置は終わりです。まだ1本も線はつながっていません。
NMOS(M1)を配置した直後の画面。D/G/Sの端子、nf=1、1x1/0.15の表示
写真3-6 NMOS配置直後 名前は自動で M1 になります。1 x 1 / 0.15 という表示は、3.2節で決めた寸法がすでに反映されていることを示します。
一覧に sky130_fd_pr が出てこない場合
原因は3つあります。上から順に確認してください。
1つ目は $PDKPATHターミナルで echo $PDKPATH を実行し、/foss/pdks/sky130A 以外が返る場合は、3.3節④の手順で切り替えます。
2つ目は xschemrc の作り方。cp でコピーした場合にこの症状が出ます。3.3節⑥の cat > xschemrc を実行し直してください。
3つ目は起動した場所。xschemrc を置いたフォルダで xschem を起動する必要があります。pwd で現在地を確認します。

トランジスタの寸法を設定する

④ トランジスタをクリックして選択し、Q を押してください
クリックしたあと、画面下端の表示が selected: 1 になったことを確認してから Q を押します。selected: 0 のまま押すと、別の画面が開きます。

こう出れば成功です
Edit Properties
Path:   /foss/designs/inverter
Symbol: sky130_fd_pr/nfet_01v8.sym

name=M1
L=0.15
W=1
nf=1
m=1
model=nfet_01v8
spiceprefix=X
読み方
WL の単位はマイクロメートルです。1 と書けば1µmになります。
nf はフィンガー数、m は並列個数です。どちらも1のままにします。
spiceprefix=X は、変更しないでください。
これは、ネットリストに書き出すときの行の先頭文字を決める指定です。
SPICEでは、行の先頭1文字が部品の種類を表します。R なら抵抗、C なら容量、M ならトランジスタ、X ならサブサーキット(小さな回路のかたまり)
sky130 のトランジスタは、単なるトランジスタ1個ではなく、モデルと補助的な素子をまとめたサブサーキットとして定義されています。だから X が必要です。M に変えると、ネットリストは出力できても、第4章でモデルが見つからずエラーになります。
3.7節で出てくる XM1XM2X が、この指定の結果です。
⑤ 表3-3 の値に書き換えて、画面下部の OK を押してください
L0.15W1 にします。nfm1 のままです。
NMOSとPMOSの両方に対して、④⑤を行います。この章では、値はどちらも同じです。
⑥ 設定した値が図の上に出ていることを確認してください
トランジスタの横に 1 x 1 / 0.15 のような表示が出ます。左から並列個数 m、チャネル幅 W、チャネル長 L です。
第4章でPMOSを 3.5µm に変えると 1 x 3.5 / 0.15 になります。編集画面を開かなくても、図を見れば寸法を確認できます。
端子の位置も DGSB の文字で表示されます。次の節で配線するバックゲートは、この B です。どこに付いているかを、いま目で確認しておいてください。

確定したこと
部品が6個そろい、トランジスタの寸法が決まった。まだ1本もつながっていない。

3.6 配線して、ピンに名前を付ける

本節の操作も、すべて xschem のウィンドウの中で行います。

ここが、この章でいちばん手が止まるところです。引く線は7本。順序を決めて、1本ずつ進めます。

その前に ― グリッドの話をしておきます。
xschem の描画領域には、目に見えない格子(グリッド)があります。図3-3の下端に出ている SNAP: 10 が、その間隔です。カーソルは、この格子の点に吸い付きます。
なぜこれが大事かというと、線が接して見えても、端点が1グリッドずれていればつながっていないからです。画面上では判別できません。拡大しても、線が重なっているようにしか見えないことがあります。
つながっている箇所には、小さな点(ジャンクション)が表示されます。配線しながら、この点が出ているかを見てください。
そして、つながっていないことは3.7節のネットリストで必ず露見します。undriven node や、net1 のような身に覚えのない名前として現れます。ここで丁寧に引いておくと、あとで戻ってくる手間が減ります。
配線の引き方(共通の操作)
線を引きたい始点にマウスカーソルを合わせて W を押し終点でクリックします。これで1本です。
曲げたい場合は、途中でクリックすると、そこで折れます。まっすぐな線を2本に分けて引いても構いません。
失敗したら U で取り消せます。線を消す場合は、線にカーソルを合わせて Delete です。

電源から順に、7本を引く

① VDD ピンから、PMOS のソース(S)へ
図3-1でいちばん上の横線です。PMOSの S は、部品の上側にあります。
確認:PMOSの上端に、線がつながった点が出ましたか。
② PMOS のドレイン(D)から、NMOS のドレイン(D)へ
2つのトランジスタを縦に結ぶ線です。PMOSの下側と、NMOSの上側をつなぎます。
この線が、あとで OUT になります。いまは名前が付いていませんが、④で出力ピンをここにつなぎます。
③ NMOS のソース(S)から、VSS ピンへ
図3-1でいちばん下の横線です。NMOSの S は、部品の下側にあります。
ここまでで、VDD から VSS まで縦に1本、幹が通りました。
④ ②で引いた線の途中から、OUT ピンへ
②の線の中ほどにカーソルを置いて W を押し、出力ピンまで引きます。
確認:②の線と④の線が交わる位置に、小さな点が出ているかを見てください。点が出ていなければ、つながっていません。1グリッドずれています。
⑤ IN ピンから、両方のゲート(G)へ
入力ピンから左側へ引き、そこから上下に分岐させて、PMOSとNMOSのゲートにそれぞれつなぎます。図3-1の左側の形です。
線を3本に分けて引くと確実です。ピンから縦線まで縦線からPMOSのG縦線からNMOSのG
確認:分岐点に点が出ていますか。
PMOS配置直後。B端子が三角形の記号として表示され、D/S/Gの四角い端子と見た目が違う
写真3-7 バックゲート(B)端子の実際の見た目 D・G・Sは大きな四角ですが、B端子だけ、極端に小さい三角形の記号として表示されます。座標上は幅0.15ほどの、ほぼ点に近い領域として定義されているためです。見落としやすいので、探すときはトランジスタのすぐ右、ゲートと反対側を見てください。
⑥ PMOS のバックゲート(B)を VDD へ、NMOS のバックゲート(B)を VSS へ
図3-1で破線にしてある2本です。B は、部品の右側、ゲートの反対側にあります。
PMOSの B から右へ引き、上に折れて VDD の横線につなぎます。NMOSの B は右へ引き、下に折れて VSS の横線へ。
この2本を忘れる人が、いちばん多いところです。
バックゲートは、何のためにあるのか。
トランジスタは、シリコンの板(基板)の上に作られています。バックゲートは、その板そのものにつながる端子です。ゲート・ドレイン・ソースが回路の部品どうしをつなぐ端子であるのに対し、これだけは「トランジスタが載っている土台」への端子になります。
土台の電位が決まっていないと、しきい値電圧が定まりません。電位が浮いたトランジスタは、いつどこでONになるかが決まらないということです。だから固定します。
固定先は、NMOS は VSS(いちばん低い電位)、PMOS は VDD(いちばん高い電位)。そうすると、どんな信号が来ても土台との間の向きが逆転せず、意図しない電流の通り道ができません。
第7章でレイアウトを描くとき、この接続はタップという図形として現れます。回路図の破線2本が、あちらでは実体を持ちます。
バックゲートをつながないと、どうなるか
3.7節のネットリスト出力で、次の表示が出ます。
Error: undriven node: #net1
「どこにも接続されていないノードがある」という意味です。この表示が出たら、まずバックゲートを疑ってください。
また、つないだつもりでも1グリッドずれていると、同じ表示になります。⑥の線の端点が、VDD/VSS の横線の上に乗っているかを確認します。
図で「つながっている」ように見えても、信用しないでください
配線の接続点には、小さな水色の点(ジャンクション)が表示されます。しかし、実際にこの点を頼りに判断すると、繰り返し誤ります。拡大すると点が線のように伸びて見えたり、逆に極端に拡大すると1つの点が巨大な丸になり、隣接する別の点と見分けがつかなくなったりします。
確実なのは、3.7節のネットリスト出力だけです。配線を1本引くごとに xschem -n -q -x で検査する習慣をつけてください。「図では正しく見えたのに、ネットリストでは自動生成名(net1 など)のままだった」ということが、この講座の検証中に何度も起きました。

4つのピンに名前を付ける

⑦ ピンをクリックして選択し、Q を押してください
selected: 1 を確認してから押します。開いた画面の lab の欄に、表3-7の名前を入力し、OK を押します。
4つすべてに対して行います。
表3-7 ピンの名前
ピン種類名前(lab)
入力ipinIN
出力opinOUT
電源iopinVDD
接地iopinVSS
この4つの名前は、大文字で、この綴りのまま使ってください
第7章のLVS照合は、回路図のピン名と、レイアウトのラベル名を文字列として突き合わせます。大文字と小文字も区別されます。vddVDD は別物として扱われます。
第6章でレイアウトにラベルを付けるとき、ここで決めた名前をそのまま使います。あとから変えると、両方を直すことになります。
Ctrl+S で保存してください
3.4節⑤で inverter.sch という名前を付けているため、そのファイルに上書き保存されます。ウィンドウ上端が xschem - inverter.sch になっていることを確認してから押してください。

確定したこと
回路図ができた。ただし、正しくつながっているかはまだ分かっていない。次の節で確認する。

3.7 ネットリストを出して、回路図を検査する

ここからターミナルに戻ります。3.5節と3.6節は xschem のウィンドウの中の操作でしたが、本節以降はコンテナのターミナルに貼り付けて実行します。xschem のウィンドウは開いたままで構いません。

目的
回路図を、シミュレータが読める形式に変換する。同時に、回路図に誤りがないかを確認する。

前提
inverter.sch を保存している(3.6節⑧)。

入力
cd /foss/designs/inverter
xschem -n -q -x inverter.sch
こう出れば成功です
Sourcing /foss/designs/inverter/xschemrc init file
open_pdks installation: using /foss/pdks
SKYWATER_MODELS: /foss/pdks/sky130A/libs.tech/combined
SKYWATER_STDCELLS: /foss/pdks/sky130A/libs.ref/sky130_fd_sc_hd/spice
読み方
エラーの表示がなければ成功です。-n はネットリストを出力する指定、-q は処理後に終了する指定、-x は画面を開かない指定です。

確定したこと
ネットリストが作成された。次に中身を確認する。
-r ではなく -x を使います
資料によっては xschem -n -q -r と書かれています。-r--no_readline で、入力補完を使わない指定です。画面を開かない指定ではありません。
画面を開かずに実行するのは -x--no_x)です。第5章で Makefile から呼ぶときも -x を使います。
入力
cat inverter.spice
こう出れば成功です
** sch_path: /foss/designs/inverter/inverter.sch
**.subckt inverter IN OUT VDD VSS
*.ipin IN
*.opin OUT
*.iopin VDD
*.iopin VSS
XM2 OUT IN VDD VDD sky130_fd_pr__pfet_01v8 L=0.15 W=1 nf=1 ad=0.29 as=0.29 pd=2.58 ps=2.58
+ nrd=0.29 nrs=0.29 sa=0 sb=0 sd=0 mult=1
XM1 OUT IN VSS VSS sky130_fd_pr__nfet_01v8 L=0.15 W=1 nf=1 ad=0.29 as=0.29 pd=2.58 ps=2.58
+ nrd=0.29 nrs=0.29 sa=0 sb=0 sd=0 mult=1
**.ends
.end
読み方
XM1XM2 の行が、トランジスタです。デバイス名の前に並ぶ4つが接続先で、左からドレインゲートソースバックゲートの順です。
XM1 OUT IN VSS VSS であれば、NMOSのドレインが OUT、ゲートが IN、ソースとバックゲートが VSS。表3-7で付けた名前が、そのまま出ています。4つ目が VSS になっていることが、バックゲートを配線した証拠です。
adaspdps は、ソースとドレインの拡散領域の面積と周囲長です。xschem が W と L から自動で計算して付けました。この値は第4章の測定結果に影響します。

確定したこと
回路図が正しく接続されている。工程1が終わった。
名前ではなく net1 などが並んでいる場合
XM1 net1 net3 net2 net2 ... のように自動生成された名前が出る場合、その端子に名前が届いていません。
名前を付けたピンと、トランジスタの端子が配線でつながっているかを確認します。3.6節で述べたとおり、配線の端点が1グリッドずれていると、線が重なって見えても接続されません。
xschem の画面を拡大し、接続点を示す小さな点が出ているかで判別できます。
「Symbol not found」が出る場合
l_s_d(): Symbol not found: sky130_fd_pr/nfet_01v8.sym
xschemrc の作り方が誤っています。3.3節⑥の cat > xschemrc を実行し直してください。cp でコピーした場合に、この症状が出ます。
テキストであることの帰結。
回路図(.sch)もネットリスト(.spice)も、中身はテキストです。だから――
差分が取れます。git を使えば、変更箇所を行単位で確認できます。
AIにそのまま渡せます。画面の写真を撮る必要がありません。
第0章で示したとおり、この後に扱う .mag も同じくテキストです。.gds だけが例外です。
回路図の確認(AIへの相談)
cat inverter.spice の出力を貼り付け、次のように質問します。
「これはCMOSインバータのSPICEネットリストです。接続を説明してください。誤りがあれば指摘してください。」
バックゲートの未接続や、ドレインとソースの取り違えは、この方法で検出できます。回答の正誤は、xschem で該当箇所を見れば判定できます(第1章1.5節の基準)。

3.8 テストベンチの作成

回路図はできましたが、これだけでは動きません。電源も、入力信号も、まだどこにもないからです。動かすために必要なものを加えた回路を、もう1枚作ります。

テストベンチ
測定対象そのものではなく、測定に必要な電源、信号源、負荷、および測定の指示をまとめた回路です。実験台にあたります。
なぜ、inverter.sch に電源を描き足さないのか。
inverter.sch は、第7章のLVS照合で「回路図側の正解」として使います。レイアウトから取り出した回路と突き合わせる基準です。
レイアウトに描くのはトランジスタ2個だけで、電源や信号源は描きません。基準の側に電源が混ざっていると、素子の数が合わず、照合が通りません。
だから inverter.schインバータだけの状態で保っておき、測定用の回路は別ファイル tb_inverter.sch として作ります。この2枚を最後まで使い分けます。
① 新しい回路図を作り、tb_inverter.sch という名前を付けてください
FileClear SchematicCtrl+N)で描画領域を空にし、FileSave asCtrl+Shift+S)で tb_inverter.sch として保存します。
3.4節④⑤と同じ手順です。New Schematic という項目は無いことを、ここでも思い出してください。
確認:ウィンドウ上端が xschem - tb_inverter.sch になりましたか。inverter.sch のままだと、上書きしてしまいます。
② インバータを、もう一度描いてください
3.5節と3.6節と同じ手順です。部品を6個置き、寸法を設定し、配線し、4つのピンに名前を付けます。
そのうえで、表3-8の部品を追加します。
表3-8 テストベンチに追加する部品
部品用途設定
devices/vsource.sym電源name=VDDvalue=1.8
devices/vsource.sym入力信号name=VIN、値は第4章で設定
devices/vsource.symVSSの接地name=VSSSRCvalue=0
devices/capa.sym負荷容量name=CLvalue=10f
devices/gnd.sym基準電位各電源の下側に接続
devices/code_shown.symシミュレータへの指示下記
VSS を接地する電源が、別に必要です
インバータの VSS は、名前が付いているだけでは 0V になりません。名前は「同じ名前どうしをつなぐ」という意味しか持たず、電位を決める働きはないからです。電位を決めるのは電圧源だけです。
そこで VSSSRC という 0Vの電圧源を、VSS とグランドの間に入れます。0Vの電源は無意味に見えますが、「ここを0Vに固定する」という宣言として働きます。
これを入れない場合、シミュレーションはエラーなく終わります。そのうえで、スイッチング閾値が 1.8V という異常な値になります。回路が動いていない状態です。
症状は第4章4.1節で vsp = 1.80000e+00 という形で現れます。電源電圧と同じ値が出たら、これを疑ってください。

シミュレータへの指示を書く

code_shownのEdit Properties画面。value=の欄が見える
写真3-8 code_shown の Edit Properties value= の1行だけが見えている状態です。ここに複数行のSPICE記述を入れます。
code_shown を配置し、選択して Q を押し、value に次を記述してください
value="
.lib /foss/pdks/sky130A/libs.tech/combined/sky130.lib.spice tt
.temp 27

.control
  dc VIN 0 1.8 0.002
  meas dc vsp when v(OUT)=v(IN)
  quit
.endc

.end"
code_shown は、ここに書いた内容をそのままネットリストに書き出すための部品です。回路の一部ではなく、シミュレータへの伝言板だと考えてください。
value= の中身は、必ずダブルクォートで囲んでください
クォート無しで複数行をそのまま貼り付けると、最初の1行(またはさらに短い範囲)しか反映されません。この講座の検証中、クォート無しで貼り付けたところ、ネットリストには .lib の1行だけが出力され、.control 以降がすべて失われる、という事態が繰り返し起きました。
正しい書き方は、sky130Aに同梱されている公式のテスト回路(sky130_tests/test_pmos.sch など)で確認できます。
value="* this option enables mos model bin
...
.control
...
.endc"
全体をダブルクォートで囲むことで、複数行がそのまま1つの値として扱われます。
入力後は、必ず Ctrl+Sで保存し、xschem -n -q -x でネットリストを出力して、.end まで全部の行が反映されているかを確認してください。
表3-9 記述の内容
内容
.lib … ttsky130のモデルを読み込む。tt は製造ばらつきの条件
.temp 27温度27℃で計算する
.control.endc起動時に自動実行する内容
dc VIN 0 1.8 0.002入力を0Vから1.8Vまで0.002V刻みで変化させる
meas dc vsp when v(OUT)=v(IN)出力と入力が等しくなる電圧を測る
quit実行後に終了する
モデルのパスは、絶対パスで書いてください
資料によっては .lib $::SKYWATER_MODELS/sky130.lib.spice tt と書かれています。$::SKYWATER_MODELS は xschem 内部の変数であり、ngspice には引き渡されません。
この記述のまま実行すると、次のエラーで異常終了します。
Error: Cannot read environmental variable ::SKYWATER_MODELS
ERROR: fatal error in ngspice, exit(1)
コンテナ内では /foss/pdks/sky130A/libs.tech/combined/sky130.lib.spice が実際のパスです。
xschem に効く書き方と、ngspice に効く書き方は別だということを、ここで押さえておいてください。3.3節⑥の $env(PDK_ROOT) と同じ種類の話です。
コーナー(tt / ss / ff / sf / fs)
製造のばらつきによる特性の変動範囲を、代表的な条件で表したものです。tt(typical-typical)が中央、ss(slow-slow)が遅い側、ff(fast-fast)が速い側。
このほかに sf(NMOSが遅くPMOSが速い)と fs(その逆)があります。本章では tt のみを使います。全コーナーの実行は第5章で扱います。
④ 保存して、ネットリストを出力してください
Ctrl+S で保存してから、ターミナルで次を実行します。
xschem -n -q -x tb_inverter.sch
cat tb_inverter.spice
こう出れば成功です
**.subckt tb_inverter
XM2 OUT IN VDD VDD sky130_fd_pr__pfet_01v8 L=0.15 W=1 nf=1 ...
XM1 OUT IN VSS VSS sky130_fd_pr__nfet_01v8 L=0.15 W=1 nf=1 ...
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
**** begin user architecture code

.lib /foss/pdks/sky130A/libs.tech/combined/sky130.lib.spice tt
.temp 27
...
読み方
トランジスタ2個に加えて、電源(VDD)、入力信号(VIN)、負荷容量(CL)、VSSの接地(VSSSRC)の4つが並んでいれば、正しく構成できています。
code_shown に書いた内容が、begin user architecture code の下にそのまま出ています。

確定したこと
シミュレータへの入力ができた。実行は第4章で行う。
この章のまとめ。
  • 道順 決める → 環境を戻す → 描く → 検査する → 動かす準備をする、の順で進めました。
  • 【D01】 標準トランジスタ 01v8、電源1.8V を選択。電源電圧はデバイス名 01v8 が示す耐圧で決まります。設計者が自由に決める値ではありません。
  • 寸法 sky130 が決めるのは下限だけ。L=0.15 は最小値そのもの、W=1 は最小 0.42 の範囲内で選んだ値です。PMOSとNMOSは同じ寸法(変更は第4章)。
  • 中断からの復帰 表示の先頭が /foss ならコンテナの中。どこまで終わったかは ls -a で分かります(表3-4)。
  • 再開のコマンド 起動スクリプトではなく docker start -ai。作るのではなく動かし直す指定です。
  • $PDKPATH 作業前に /foss/pdks/sky130A であることを確認。初期値は別の設計データです。
  • xschemrc cp ではなく source で作ります。コピーすると部品が見つかりません。set netlist_dir [pwd] を書かないと、ネットリストは別の場所へ出ます。
  • 空の回路図 FileClear SchematicNew Schematic という項目はありません。名前を付けるのは Save as起動直後の Ctrl+S は見本の top.sch を上書きします。
  • バックゲート NMOS→VSS、PMOS→VDD。土台の電位を固定するための端子で、未接続だと undriven node が出ます。第6章ではタップという図形になります。
  • グリッド 線が接して見えても1グリッドずれていればつながっていません。判別は接続点の小さな点で行います。
  • ピンの種類 ipin / opin / iopin は信号の向きを表します。ここで付けた4つの名前が、第7章のLVSで突き合わせる端子になります。大文字小文字も区別されます。
  • ネットリスト出力 xschem -n -q -x-r は画面を閉じる指定ではありません。
  • .lib のパス 絶対パスで書きます。$::SKYWATER_MODELS は ngspice に渡りません。
  • テストベンチ inverter.sch とは別ファイルにします。LVSの基準に電源を混ぜないためです。VSSを0Vに固定する電圧源が要ります。
  • 拡散容量 xschem は W と L から adas を自動計算して付けます。これが第4章の遷移時間に効いてきます。