第3章 回路図の作成 ― xschem でインバータを描く
3.1 この章で作るもの
作るものは2つです。CMOSインバータの回路図が1枚と、そこから生成したSPICEネットリスト。まず、その回路がどんな形をしているかを見ておきます。
| 入力 | PMOS | NMOS | 出力 |
|---|---|---|---|
| L(0V) | ON | OFF | H(VDDに接続) |
| H(1.8V) | OFF | ON | L(VSSに接続) |
PMOSとNMOSは、同時にONになりません。このため止まっている間はVDDからVSSへ電流が流れず、電力を使うのは切り替わる瞬間だけになります。これがCMOSという方式の要点です。
この章の道順
- 決める(3.2節) どのトランジスタを使い、チャネル長と幅をいくつにするか。手を動かす前に決めます。
- 環境を戻す(3.3節) 第2章で作った環境を呼び戻し、設定ファイルを2つ置きます。ツールを動かす準備です。
- 描く(3.4〜3.6節) 部品を6個置き、寸法を設定し、線でつなぎ、4つのピンに名前を付けます。
- 検査する(3.7節) ネットリストに変換します。変換が通ることが、回路図が正しいことの確認になります。
- 動かす準備をする(3.8節) 電源と入力信号を加えたテストベンチを作ります。実行は第4章です。
SPICEネットリストはただのテキストなので、エディタで直接書くこともできます。それでも図から生成するのには、理由が2つあります。
ひとつは、xschem が W と L から拡散領域の面積と周囲長(
ad、as、pd、ps)を自動で計算して付けることです。これらが無いネットリストで測ると、遷移時間が約20%短く出ます。手で書くと、この値が正しくなりません。もうひとつは、第7章のLVS照合が「回路図とレイアウトを突き合わせる」作業だからです。回路図が基準、レイアウトが検証対象という関係になります。基準の側が手書きでは、照合の意味が薄れます。
ネットリストは回路図から生成される出力だからです。そして、生成が通ること自体が、回路図の検査になっています。
xschem の画面では、線が接して見えても1グリッドずれていれば、つながっていません。目で見て判別することはできません。ネットリストを出力してはじめて、
undriven node や、自動でつけられた名前として現れます。3.7節の表題が「変換」ではなく「検査」なのは、このためです。
3.2 【判断点 D01】デバイスと寸法を決める
sky130 には、性格の違うトランジスタが何種類も入っています。まず、そのどれを使うかを決めます。
| デバイス名 | 耐圧 | 特徴 |
|---|---|---|
sky130_fd_pr__nfet_01v8sky130_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 を選んだ結果です。
決めること
標準(
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 が決めているのは下限だけだということです。その枠の中で、どの値にするかは設計者が選びます。
| 記号 | 内容 | NMOS | PMOS | 決め方 |
|---|---|---|---|---|
| L | チャネル長 | 0.15 | 0.15 | sky130 の最小値そのもの |
| W | チャネル幅 | 1 | 1 | 最小は0.42。その範囲で選んだ値 |
| nf | フィンガー数 | 1 | 1 | 分割しない |
| m | 並列個数 | 1 | 1 | 並列にしない |
L = 0.15µm は sky130 の最小ゲート長です。「130nmプロセス」と呼びますが、描ける最小のゲート長は150nmです。最小にすると面積が最小、速度が最大になります。インバータはデジタル的な用途なので、最小で構いません。アナログ回路では、特性のばらつきを避けるためにあえて最小を使わないこともあります。
W = 1µm は最小値ではありません。sky130 の最小幅は 0.42µm です。1µm にしたのは、切りのよい値であること、第4章でPMOSの幅を変える実験がしやすいことによります。設計上の必然はありません。
同じ幅にすると、立ち上がりと立ち下がりの速度が一致しません。PMOSは同じ寸法でも電流を流しにくいためです。
その理由と対処は、第4章の判断点 D02 で扱います。幅の比を決めるのは第4章の作業です。この章では、同じ値のまま進めてください。
3.3 中断から戻る ― コンテナの再開と、いまいる場所の読み方
3.1節と3.2節は、読んで決める作業でした。ここから先は、実際にツールを動かします。
その前に、ひとつ用意しておきます。この講座は途中で何度でも中断できます。日を改めても、パソコンを再起動しても、作ったものは消えません。ただし戻ってきたとき、「いま自分がどこにいて、どこまで終わっているのか」が読めないと、先へ進めません。その読み方を2つ、先に身につけます。第4章以降でも、そのまま使います。
読み方1 いま、どこで打っているのか
コマンドを打ち込む先は、パソコン本体か、コンテナの中か、ツールの中かのいずれかです。どれも同じ黒い画面に見えますが、別の場所です。取り違えたまま打つと、通らなかったり、通ってはいけないところで通ったりします。
見分けるのは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 が見えません。
| 見えるもの | 終わっている節 | 再開する場所 |
|---|---|---|
. と .. だけ | — | 本節⑥ |
+ xschemrc .spiceinit | 3.3 | 3.4節 |
+ inverter.sch | 3.4 | 3.5節(下記) |
+ inverter.spice | 3.7 | 3.8節 |
+ tb_inverter.sch tb_inverter.spice | 3.8 | 第4章 |
この2つの節は、どちらも
inverter.sch に描き足していく作業です。ファイルの名前は変わりません。空の状態も、部品を6個置いた状態も、配線が半分の状態も、同じ inverter.sch です。この範囲で中断した場合は、開いて画面を見ます。
xschem inverter.sch &部品が置かれているか、線が引かれているか、ピンに名前が付いているかを見て、3.5節と3.6節のどこから続けるかを決めます。
この2つの節に入る前に、切りのよいところまで進めて Ctrl+S で保存してから離れることをお勧めします。保存していない分は残りません。
コンテナを再開する
読み方1でコンテナの外にいると分かった方は、①から行います。/foss で始まる表示が出ている方は、④へ進んでください。
第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。作るのではなく、止まっているコンテナを動かし直す指定です。
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アプリの
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章でシミュレーションが動きません。
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 の行で閉じます。
1行目
source …/sky130A/libs.tech/xschem/xschemrcsky130A に同梱されている 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) の文字がそのまま残っているかを確認できます。
xschemrc を cp でコピーしてはいけません同じファイルを読むのだから、
source ではなく手元にコピーすればよさそうに見えます。資料によってはそう書かれています。この方法では動きません。PDKの
xschemrc は、その34行目で「この xschemrc が置かれているディレクトリ」を部品の検索先に加えます。作業フォルダにコピーすると、検索先が作業フォルダになってしまい、PDK側の部品が見つからなくなります。症状は、3.7節のネットリスト出力でこう現れます。
l_s_d(): Symbol not found: sky130_fd_pr/nfet_01v8.sym
source で読めば、PDK側の場所が検索先に入ります。だから⑥は cp ではなく source なのです。
cp $PDK_ROOT/sky130A/libs.tech/ngspice/spinit ./.spiceinitこう出れば成功です
こちらも何も表示されません。エラーが出なければ、コピーできています。
使うのは第4章ですが、置くのはいまです。環境を整える作業を1箇所にまとめておくと、あとで「どこかに置き忘れたファイルがある」という状態を避けられます。
.spiceinit は、ngspice が起動時に読む設定ファイルです。中身は互換モードの指定で、sky130 のモデルが書かれている方言を ngspice に読ませるためのものです。sky130 のモデルファイルは、もともと商用シミュレータ向けの書き方を含んでいます。この設定なしに読ませると、解釈が食い違い、計算結果が変わったりエラーで止まったりします。
効いているかどうかは、第4章4.1節の出力で分かります。次の2行が出れば読まれています。
Note: Compatibility modes selected: hs a Using KLU as Direct Linear Solver
xschemrc と違い、こちらは cp でコピーして構いません。置かれた場所を検索先に加えるような記述が無く、中身がそのまま設定として働くためです。「設定ファイルは全部コピーでよい/全部 source すべき」という共通の決まりはなく、ファイルごとに事情が違います。
ls -aこう出れば成功です
. .. .spiceinit xschemrc
.spiceinit は先頭にピリオドが付くため、ls だけでは表示されません。-a を付けて確認します。表3-4でいえば、2つ目の行に到達した状態です。次に中断したときは、この表示を見て3.4節から再開すればよいことになります。
確定したこと
xschem が sky130A の部品を扱えるようになり、ネットリストの出力先がこのフォルダに決まった。ngspice の設定も置いた。環境の準備はここで終わり。次から回路図を描く。
3.4 xschem を起動して、空の回路図を用意する
設定ファイルが揃いました。いよいよツールを開きます。①から⑤まで、順に実行します。終わったとき、手元には名前の付いた空の回路図が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 に渡す番号は、そこに出た番号に合わせます。
top.sch という見本の回路図です。自分の回路ではありません。ウィンドウの上端に
xschem - top.sch と表示され、部品がびっしり並んだ画面が出ます。写真3-1がそれです。これは
top.sch という見本の回路図で、sky130A に同梱されているものです。使える部品を一覧にしたページで、xschem をファイル名なしで起動すると最初に開きます。中身を読む必要はありません。ここに自分の回路を描くのでもありません。次の③へ進みます。
ウィンドウのいちばん上に、左から
File Edit Options View Properties Layers Tools Symbol Highlight Simulation Help と11項目が並びます。その右に少し間隔があき、続けて次の4項目が同じ行に並びます。
SKY130 Netlist Simulate Wavesこの4項目は、sky130A の設定によって追加されたものです。標準の xschem にはありません。出ていれば、⑥で作った
xschemrc が働いています。ただし、確実な確認点は①のターミナルの1行のほうです。この4項目は、設計データが
sky130A に切り替わっているだけでも表示される可能性があります。画面は補助、ターミナルが本命、と考えてください。
selected: は、いま選択している要素の数です。0 なら何も選んでいません。3.5節で Q を押す前に、ここが 1 になっているかを見ます。File メニューの Save(Ctrl+S)は、いま開いているファイルへの上書き保存です。名前を付ける操作ではありません。起動直後に開いているのは、見本の
top.sch です。この状態で Ctrl+S を押すと、sky130A に同梱されている見本ファイルを上書きします。コンテナは管理者権限で動いているため、書き込みは通ってしまいます。名前を付けて保存するのは
Save as(Ctrl+Shift+S)。⑤で使います。
File → Clear Schematic を選んでください描画領域が空になります。見本が消え、ここに自分の回路を描ける状態になりました。Ctrl+N でも同じ動作です。
File メニューに New Schematic という項目はありません。他のソフトの感覚で探すと見つからないので、注意してください。空の回路図を作るのは Clear Schematic です。メニューの中身は写真3-2のとおりで、上から3番目までが
Clear Schematic、Clear Symbol、Component browser です。
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節⑥の
xschemrc に set xschem_execute_scripts no を書いてあれば、この画面は出ません。出る場合は、その行が入っていないか、xschemrc が読まれていません。この画面が出ている間、他の操作は一切受け付けられません。ウィンドウが固まったように見えたら、背後にこの画面が隠れていないか確認してください。
File → Save 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節に入る前に
3.5節と3.6節は、ターミナルではなく xschem のウィンドウの中で行います。表に書かれたキーは、描画領域にマウスカーソルを置いた状態で押します。ターミナルに貼り付けるものではありません。
ターミナルに戻るのは3.7節です。それまで、ターミナルには何も打ちません。
多くのソフトは「対象を選んでから、ボタンを押す」順序です。xschem は逆で、「場所にカーソルを合わせて、そこでキーを押す」のが基本になります。押した瞬間のカーソルの位置が、操作の対象です。
基礎01「KiCad入門」を読まれた方は、操作の順序が反対になることに注意してください。ボタンを探しても、ほとんどの操作は見つかりません。
| 操作 | キー | 補足 |
|---|---|---|
| 部品の挿入 | Ctrl+I | 部品の一覧が開く。Shift+Insert でも同じ |
| 配線の描画 | W | 始点でキー、終点でクリック |
| 移動 | M | 対象にカーソルを合わせてから |
| コピー | C | 同上 |
| 削除 | Delete | 同上 |
| 属性の編集 | Q | 先に対象をクリックして選択する |
| 回転/反転 | R / F | — |
| 全体表示 | Shift+Z | 迷ったらこれ。行方不明の図形も画面に入る |
| 上書き保存 | Ctrl+S | 名前を付けるのは Save as |
| 取り消し | U | 直前の操作を戻す |
xschem と magic は、マウスの左・中・右を使い分けます。左が選択、中が貼り付けと画面の移動、右がメニューです。
ホイールを押し込むと中ボタンになるマウスが大半です。中ボタンの無いマウスでは、画面の移動ができません。第1章の表1-2で3ボタンマウスを挙げているのは、このためです。
何も選択していない状態(図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 部品を置いて、寸法を決める
置く部品は6個です。トランジスタが2個と、外との出入口になるピンが4個。まず何を置くのかを見てから、置きます。
| 部品 | ライブラリ内の位置 | 個数 | 役割 |
|---|---|---|---|
| NMOS | sky130_fd_pr/nfet_01v8.sym | 1 | 出力を0Vへ引き下げる |
| PMOS | sky130_fd_pr/pfet_01v8.sym | 1 | 出力を1.8Vへ引き上げる |
| 入力ピン | devices/ipin.sym | 1 | IN。信号が入ってくる口 |
| 出力ピン | devices/opin.sym | 1 | OUT。信号が出ていく口 |
| 電源ピン | devices/iopin.sym | 2 | VDD と VSS |
ipin(入力)、opin(出力)、iopin(入出力)の3種類は、信号がどちら向きに通るかを表しています。見た目の違いだけではありません。この向きは、3.7節でネットリストに次の形で書き出されます。
*.ipin IN *.opin OUT *.iopin VDD *.iopin VSS電源に
iopin を使うのは、電源が入力でも出力でもないからです。この回路にとって電源は「外とつながっている端子」であって、信号の向きがありません。そういう端子には iopin を使います。そして、ここで付けた4つの端子が、そのまま第7章のLVS照合で突き合わせる端子になります。レイアウト側にも同じ名前の端子を作り、両者が一致するかを見ます。いまの4個は、最後まで効いてきます。
描画領域にマウスカーソルを置き、Ctrl+I を押します。ボタンを押すのではなく、カーソルを置いた場所でキーを押します。メニューの
File → Component browser でも開きます(写真3-2)。
Search 欄に名前を打つと絞り込めます。sky130_fd_pr から探してください左側の
Recent の中に、sky130A/libs.tech/xschem/sky130_fd_pr という行があれば、それをクリックします。無ければ Up や Home で階層をたどります。数が多いフォルダなので、下部の
Search 欄に nfet_01v8 と打って絞り込みます。
nfet_01v8.sym のほかに、_esd・_lvt・_lvt_nf・_nf という接尾辞付きの部品が並びます。選ぶのは、接尾辞が付いていない nfet_01v8.sym だけです。nfet_01v8.sym と nfet3_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が無い)になっているかを、その場で見ます。
Symbol: の行だけが、確実な判断材料です。model= の行は両方とも同じ値になりうるため、判断に使えません。devices から探してください左側の
Recent に xschem_library/devices という行があります。検索欄に ipin・opin・iopin をそれぞれ打って、表3-6のとおりに配置します。iopin は2個必要です(VDD用・VSS用)。置く位置の目安は図3-1のとおりです。IN は左、OUT は右、VDD は上、VSS は下。位置が多少ずれていても構いません。M であとから動かせます。
確認:描画領域に部品が6個(PMOS・NMOS・ipin・opin・iopin×2)並んでいれば、この節の配置は終わりです。まだ1本も線はつながっていません。
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 で現在地を確認します。
トランジスタの寸法を設定する
クリックしたあと、画面下端の表示が
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読み方
W と L の単位はマイクロメートルです。1 と書けば1µmになります。nf はフィンガー数、m は並列個数です。どちらも1のままにします。
spiceprefix=X は、変更しないでください。これは、ネットリストに書き出すときの行の先頭文字を決める指定です。
SPICEでは、行の先頭1文字が部品の種類を表します。
R なら抵抗、C なら容量、M ならトランジスタ、X ならサブサーキット(小さな回路のかたまり)。sky130 のトランジスタは、単なるトランジスタ1個ではなく、モデルと補助的な素子をまとめたサブサーキットとして定義されています。だから
X が必要です。M に変えると、ネットリストは出力できても、第4章でモデルが見つからずエラーになります。3.7節で出てくる
XM1、XM2 の X が、この指定の結果です。
OK を押してくださいL を 0.15、W を 1 にします。nf と m は 1 のままです。NMOSとPMOSの両方に対して、④⑤を行います。この章では、値はどちらも同じです。
トランジスタの横に
1 x 1 / 0.15 のような表示が出ます。左から並列個数 m、チャネル幅 W、チャネル長 L です。第4章でPMOSを 3.5µm に変えると
1 x 3.5 / 0.15 になります。編集画面を開かなくても、図を見れば寸法を確認できます。端子の位置も
D、G、S、B の文字で表示されます。次の節で配線するバックゲートは、この B です。どこに付いているかを、いま目で確認しておいてください。確定したこと
部品が6個そろい、トランジスタの寸法が決まった。まだ1本もつながっていない。
3.6 配線して、ピンに名前を付ける
ここが、この章でいちばん手が止まるところです。引く線は7本。順序を決めて、1本ずつ進めます。
xschem の描画領域には、目に見えない格子(グリッド)があります。図3-3の下端に出ている
SNAP: 10 が、その間隔です。カーソルは、この格子の点に吸い付きます。なぜこれが大事かというと、線が接して見えても、端点が1グリッドずれていればつながっていないからです。画面上では判別できません。拡大しても、線が重なっているようにしか見えないことがあります。
つながっている箇所には、小さな点(ジャンクション)が表示されます。配線しながら、この点が出ているかを見てください。
そして、つながっていないことは3.7節のネットリストで必ず露見します。
undriven node や、net1 のような身に覚えのない名前として現れます。ここで丁寧に引いておくと、あとで戻ってくる手間が減ります。
線を引きたい始点にマウスカーソルを合わせて W を押し、終点でクリックします。これで1本です。
曲げたい場合は、途中でクリックすると、そこで折れます。まっすぐな線を2本に分けて引いても構いません。
失敗したら U で取り消せます。線を消す場合は、線にカーソルを合わせて Delete です。
電源から順に、7本を引く
図3-1でいちばん上の横線です。PMOSの
S は、部品の上側にあります。確認:PMOSの上端に、線がつながった点が出ましたか。
2つのトランジスタを縦に結ぶ線です。PMOSの下側と、NMOSの上側をつなぎます。
この線が、あとで OUT になります。いまは名前が付いていませんが、④で出力ピンをここにつなぎます。
図3-1でいちばん下の横線です。NMOSの
S は、部品の下側にあります。ここまでで、VDD から VSS まで縦に1本、幹が通りました。
②の線の中ほどにカーソルを置いて W を押し、出力ピンまで引きます。
確認:②の線と④の線が交わる位置に、小さな点が出ているかを見てください。点が出ていなければ、つながっていません。1グリッドずれています。
入力ピンから左側へ引き、そこから上下に分岐させて、PMOSとNMOSのゲートにそれぞれつなぎます。図3-1の左側の形です。
線を3本に分けて引くと確実です。ピンから縦線まで、縦線からPMOSのG、縦線からNMOSのG。
確認:分岐点に点が出ていますか。
図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つのピンに名前を付ける
selected: 1 を確認してから押します。開いた画面の lab の欄に、表3-7の名前を入力し、OK を押します。4つすべてに対して行います。
| ピン | 種類 | 名前(lab) |
|---|---|---|
| 入力 | ipin | IN |
| 出力 | opin | OUT |
| 電源 | iopin | VDD |
| 接地 | iopin | VSS |
第7章のLVS照合は、回路図のピン名と、レイアウトのラベル名を文字列として突き合わせます。大文字と小文字も区別されます。
vdd と VDD は別物として扱われます。第6章でレイアウトにラベルを付けるとき、ここで決めた名前をそのまま使います。あとから変えると、両方を直すことになります。
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読み方
XM1 と XM2 の行が、トランジスタです。デバイス名の前に並ぶ4つが接続先で、左からドレイン、ゲート、ソース、バックゲートの順です。XM1 OUT IN VSS VSS であれば、NMOSのドレインが OUT、ゲートが IN、ソースとバックゲートが VSS。表3-7で付けた名前が、そのまま出ています。4つ目が VSS になっていることが、バックゲートを配線した証拠です。ad、as、pd、ps は、ソースとドレインの拡散領域の面積と周囲長です。xschem が W と L から自動で計算して付けました。この値は第4章の測定結果に影響します。確定したこと
回路図が正しく接続されている。工程1が終わった。
net1 などが並んでいる場合XM1 net1 net3 net2 net2 ... のように自動生成された名前が出る場合、その端子に名前が届いていません。名前を付けたピンと、トランジスタの端子が配線でつながっているかを確認します。3.6節で述べたとおり、配線の端点が1グリッドずれていると、線が重なって見えても接続されません。
xschem の画面を拡大し、接続点を示す小さな点が出ているかで判別できます。
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 だけが例外です。
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 という名前を付けてくださいFile → Clear Schematic(Ctrl+N)で描画領域を空にし、File → Save as(Ctrl+Shift+S)で tb_inverter.sch として保存します。3.4節④⑤と同じ手順です。
New Schematic という項目は無いことを、ここでも思い出してください。確認:ウィンドウ上端が
xschem - tb_inverter.sch になりましたか。inverter.sch のままだと、上書きしてしまいます。
3.5節と3.6節と同じ手順です。部品を6個置き、寸法を設定し、配線し、4つのピンに名前を付けます。
そのうえで、表3-8の部品を追加します。
| 部品 | 用途 | 設定 |
|---|---|---|
devices/vsource.sym | 電源 | name=VDD、value=1.8 |
devices/vsource.sym | 入力信号 | name=VIN、値は第4章で設定 |
devices/vsource.sym | VSSの接地 | name=VSSSRC、value=0 |
devices/capa.sym | 負荷容量 | name=CL、value=10f |
devices/gnd.sym | 基準電位 | 各電源の下側に接続 |
devices/code_shown.sym | シミュレータへの指示 | 下記 |
インバータの
VSS は、名前が付いているだけでは 0V になりません。名前は「同じ名前どうしをつなぐ」という意味しか持たず、電位を決める働きはないからです。電位を決めるのは電圧源だけです。そこで
VSSSRC という 0Vの電圧源を、VSS とグランドの間に入れます。0Vの電源は無意味に見えますが、「ここを0Vに固定する」という宣言として働きます。これを入れない場合、シミュレーションはエラーなく終わります。そのうえで、スイッチング閾値が 1.8V という異常な値になります。回路が動いていない状態です。
症状は第4章4.1節で
vsp = 1.80000e+00 という形で現れます。電源電圧と同じ値が出たら、これを疑ってください。
シミュレータへの指示を書く
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 まで全部の行が反映されているかを確認してください。
| 行 | 内容 |
|---|---|
.lib … tt | sky130のモデルを読み込む。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(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であることを確認。初期値は別の設計データです。xschemrccpではなくsourceで作ります。コピーすると部品が見つかりません。set netlist_dir [pwd]を書かないと、ネットリストは別の場所へ出ます。- 空の回路図
File→Clear Schematic。New 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 から
ad、asを自動計算して付けます。これが第4章の遷移時間に効いてきます。