この章の学習のねらい
magic でシリコン上の図形を作成し、設計規則検査(DRC)に合格させます。工程3と4です。判断点は D05「配置」と D06「エラーの修正順」。
回路図には現れないウェルタップ、基板タップ、コンタクトを扱います。
magic でシリコン上の図形を作成し、設計規則検査(DRC)に合格させます。工程3と4です。判断点は D05「配置」と D06「エラーの修正順」。
回路図には現れないウェルタップ、基板タップ、コンタクトを扱います。
本章に掲載する座標とDRC件数は、第0章に記載した環境(magic 8.3.678、open_pdks f6eeac7d、2026年8月8日確認)で、実際に図形を作成して得たものです。最終的にDRC 0件、第7章のLVS一致まで到達しています。
コンテナのバージョンが更新されると件数が変わる場合があります。掲載値と一致しない場合は、6.7節の手順で規則名を確認して修正します。
コンテナのバージョンが更新されると件数が変わる場合があります。掲載値と一致しない場合は、6.7節の手順で規則名を確認して修正します。
7.1 手作業で行う理由
CMOSインバータのレイアウトは、標準セルライブラリに完成品が含まれており、生成ツールも存在します。本講座で手作業を行うのは、生成されたレイアウトの妥当性を判定するには、自分で作成した経験が必要なためです。
基礎01「KiCad入門」で手作業による配線を行ってから応用「コードとAIでPCB自動化」に進む順序と同じです。
7.2 magic の起動
目的
magic を起動し、sky130A の設計規則が読み込まれた状態にする。
前提
第2章で
入力
上部のバーに
その左の
右端に現在の box の位置がµm単位で表示されます。
画面の右側はレイヤーのパレットです。
確定したこと
sky130A の設計規則が読み込まれた状態で magic が動作している。
magic を起動し、sky130A の設計規則が読み込まれた状態にする。
前提
第2章で
$PDK_ROOT が /foss/pdks になっていることを確認している。
入力
cd /foss/designs/inverter magic -rcfile $PDK_ROOT/sky130A/libs.tech/magic/sky130A.magicrc &画面
File Edit Cell Window Layers Drc Options Devices 1 Devices 2 [DRC]
Loaded: inverter Editing: inverter Tool: box Technology: sky130A
box (+0 +0) to (+0.01 +0.01) microns
読み方上部のバーに
Technology: sky130A が表示されていれば、設計規則が読み込まれています。tech name を打つ必要はありません。その左の
[DRC] は、設計規則の検査が有効かを示します。右端に現在の box の位置がµm単位で表示されます。
box コマンドを実行すると、この表示が変わります。画面の右側はレイヤーのパレットです。
nwell、ndiffusion、ndcontact、psubstratepcontact など、使用できる層の名前が一覧で並びます。6.3節で扱う層名は、ここで確認できます。確定したこと
sky130A の設計規則が読み込まれた状態で magic が動作している。
-T sky130A だけでは設計規則が読み込まれない場合がある
画面上部のバーが
コマンドで確認する場合は
magic -T sky130A と書いた資料が多数あります。この書き方は、テックファイルが検索パス上にある場合にのみ動作します。パス上にない場合、次の表示が出ます。
Could not find file 'sky130A.tech' in any of these directories:
. $CAD_ROOT/magic/sys $CAD_ROOT/magic/sys/current
Failed to load technology "sky130A"
このとき magic は停止せずに起動を続けます。設計規則が読み込まれていない状態で画面が出るため、気づかないまま作業を進めることになります。この状態でDRCを実行すると0件と表示されます。画面上部のバーが
Technology: minimum となっている場合は読み込めていません。上記の -rcfile 指定で起動し直します。コマンドで確認する場合は
tech name を実行します。sky130A と返れば正常です。
magic は「箱」で操作する
magic の操作の中心は、画面上の白い枠(box)です。まず box で範囲を指定し、次にその範囲に層を塗る、という順序です。
box は左ボタンで一方の角、右ボタンでもう一方の角を指定します。左右のボタンで1つの長方形を作る操作は、他のツールにあまりない方式です。
座標で正確に指定する場合は、コマンド欄で
magic の操作の中心は、画面上の白い枠(box)です。まず box で範囲を指定し、次にその範囲に層を塗る、という順序です。
box は左ボタンで一方の角、右ボタンでもう一方の角を指定します。左右のボタンで1つの長方形を作る操作は、他のツールにあまりない方式です。
座標で正確に指定する場合は、コマンド欄で
box -0.8um -0.5um 0.8um 0.5um のように入力します。本章ではこの方法を使います。手作業でマウスを動かすより確実で、掲載した座標をそのまま入力できるためです。
| 操作 | 方法 | 動作確認 |
|---|---|---|
| 座標で範囲を指定 | box -0.8um -0.5um 0.8um 0.5um | 確認済み |
| 層を塗る | paint <層名> | 確認済み |
| 層を消す | erase <層名> | 確認済み |
| 保存 | save inverter | 確認済み |
| 範囲の指定(マウス) | 左ボタンで一方の角、右ボタンでもう一方 | 確認済み |
| 図形の選択 | 図形上にカーソルを置いて S | 確認済み |
| 選択範囲の移動 | move e 1um(e/w/n/s で方向) | 確認済み |
| 画面のスクロール | 矢印キー | 確認済み |
| 層名の一覧を見る | 画面右のパレット | 確認済み |
| 技術ファイルの確認 | 上部バーの Technology: | 確認済み |
| box の範囲に拡大 | Z | 確認済み |
| 直前の操作を取り消す | undo | 確認済み |
| 縮小/全体表示 | Shift + Z / V | 未確認 |
「未確認」の1行は、本講座で動作を確認していません。magic の公式ドキュメントに基づく記述です。
矢印キーは図形を動かさない
矢印キーは画面のスクロールです。図形の位置は変わりません。
選択した図形を動かす場合は
矢印キーは画面のスクロールです。図形の位置は変わりません。
選択した図形を動かす場合は
move コマンドを使います。方向は e(東)、w(西)、n(北)、s(南)で指定します。
box -1.9um -1.52um -1.07um -0.88um select area psd move e 1um本講座の手順では、座標を
box で直接指定して描くため、移動の操作は使いません。描き直す場合は erase で消すか、undo で直前の操作を取り消します。
undo の効果を確認する方法
本講座で、レイアウトに
undo が効いたかどうかは、保存してファイルの中身を見れば確認できます。本講座で、レイアウトに
m1 を1枚塗ってから undo を実行したところ、次のようになりました。
塗る前 2,063バイト << m1 >> なし paint 後 2,143バイト << m1 >> あり undo 後 2,105バイト << m1 >> なし
undo で層が消えています。ファイルサイズが元と完全には一致しませんが、これは磁気ファイル内の配置が変わるためで、図形は元に戻っています。
7.3 トランジスタの図形構成
【図6-1】NMOSの平面構成
poly(ゲート)
│
┌─────────┼─────────┐
│ ┌──────┼──────┐ │
─────┼──┤ ndiff(拡散層)├──┼─────
│ └──────┼──────┘ │
└─────────┼─────────┘
│
ソース ← ゲート → ドレイン
ndiff と poly が交差した部分がトランジスタになる。
交差部分の縦の長さが W、poly の横幅が L。
ゲートの左右の ndiff がソースとドレイン。
トランジスタという部品を置くのではありません。2つの層を交差させると、その交差部分がトランジスタになります。第3章で W=1、L=0.15 と入力した数値は、この交差部分の寸法です。
| magic での名前 | 用途 | 使用箇所 |
|---|---|---|
nwell | Nウェル | PMOSを配置する領域 |
ndiff / pdiff | 拡散層(ソース・ドレイン) | NMOS / PMOS |
poly | ゲート | 両方 |
psd / nsd | タップの拡散層 | NMOS側 / PMOS側 |
psc / nsc | タップのコンタクト | NMOS側 / PMOS側 |
ndc / pdc | 拡散層のコンタクト | NMOS / PMOS |
pc | polyのコンタクト | ゲート |
li1 | ローカル配線層 | 最下層の配線 |
層の名前を間違えると、エラーが出ずに無視される
magic の
本講座の作成過程では、次の誤りが実際に発生しました。
タップの2つは特に発見が遅れます。図形がないためDRCは合格し、第7章のLVSで初めてネット数の不一致として現れます。
塗ったあとに
magic の
paint は、存在しない層名を指定してもエラーを表示しません。図形が作られないまま処理が進みます。本講座の作成過程では、次の誤りが実際に発生しました。
| 誤った名前 | 正しい名前 | 症状 |
|---|---|---|
licon1 | ndc / pdc | コンタクトが作られず、配線が拡散層につながらない |
psubstratecontact | psd + psc | タップが作られない。DRCは0件で通る |
nsubstratecontact | nsd + nsc | 同上 |
塗ったあとに
save して cat inverter.mag を実行し、指定した層名が << ... >> の行に現れているかを確認する方法が確実です。
7.4 【判断点 D05】レイアウトの配置
【図6-2】配置の2案 (A) 縦積み (B) 横並び ┌──────────────┐ ┌───────────┬───────────┐ │ nwell │ │ nwell │ │ │ ┌──────────┐ │ │ ┌───────┐ │ ┌───────┐ │ │ │ PMOS │ │ │ │ PMOS │ │ │ NMOS │ │ │ └──────────┘ │ │ └───────┘ │ └───────┘ │ ├──────────────┤ └───────────┴───────────┘ │ ┌──────────┐ │ │ │ NMOS │ │ ゲートを1本の poly で │ └──────────┘ │ 接続できない └──────────────┘ ゲートを1本の poly で 縦に貫通できる
【判断点 D05】レイアウトをどう配置するか
決めること
縦積み(A)、横並び(B)、またはフィンガー分割のいずれにするか。
材料
・NMOS: W=1µm、PMOS: W=3.5µm(D02で決定)、L=0.15µm
・目的:学習用。面積の最適化は目的としない
・後続工程:DRC、抽出、LVS、GDS出力
相談
質問:
「sky130でCMOSインバータのレイアウトを手作業で作成します。配置の候補を3つ、それぞれ何を犠牲にするかとともに挙げてください。手作業での作成しやすさも評価してください。」
返答
1. 縦積み。ゲートを1本のpolyで接続できるため配線が単純。標準セルと同じ構成で参考資料が多い。縦方向に長くなる
2. 横並び。ウェルの形状が単純。ゲート間の接続に配線が1本必要
3. フィンガー分割。PMOSを2本に分割して幅を確保する。面積効率が高いが、手作業では複雑
決定
1(縦積み)。
理由:描画する図形が最も少ないこと。構造が単純なほうが第7章でLVS不一致の原因を特定しやすいこと。
検証
本講座の手順で作成したところ、DRC 0件、第7章のLVSも一致しました(6.6節、6.7節)。
判定:◯
決めること
縦積み(A)、横並び(B)、またはフィンガー分割のいずれにするか。
材料
・NMOS: W=1µm、PMOS: W=3.5µm(D02で決定)、L=0.15µm
・目的:学習用。面積の最適化は目的としない
・後続工程:DRC、抽出、LVS、GDS出力
相談
質問:
「sky130でCMOSインバータのレイアウトを手作業で作成します。配置の候補を3つ、それぞれ何を犠牲にするかとともに挙げてください。手作業での作成しやすさも評価してください。」
返答
1. 縦積み。ゲートを1本のpolyで接続できるため配線が単純。標準セルと同じ構成で参考資料が多い。縦方向に長くなる
2. 横並び。ウェルの形状が単純。ゲート間の接続に配線が1本必要
3. フィンガー分割。PMOSを2本に分割して幅を確保する。面積効率が高いが、手作業では複雑
決定
1(縦積み)。
理由:描画する図形が最も少ないこと。構造が単純なほうが第7章でLVS不一致の原因を特定しやすいこと。
検証
本講座の手順で作成したところ、DRC 0件、第7章のLVSも一致しました(6.6節、6.7節)。
判定:◯
7.5 レイアウトの作成
作業は7段階に分かれます。各段階で box と paint を実行します。座標は本講座で実際に通したものです。
座標の指定方法
本章では原点をNMOSの中心付近に置いています。負の座標が現れますが、magic では問題ありません。
box の4つの数字は、左下のX、左下のY、右上のX、右上のYです。um を付けるとマイクロメートル単位になります。付けない場合は magic の内部単位(sky130Aでは0.005µm)です。本章では原点をNMOSの中心付近に置いています。負の座標が現れますが、magic では問題ありません。
段階1 nwell を置く
目的
PMOSとウェルタップを配置する領域を確保する。
入力
magic のコマンド欄で実行します。
3.3µm × 4.9µm の領域です。nwell の最小幅は 0.84µm(規則
左側を大きく取っているのは、段階5でウェルタップを nwell の中に置くためです。
確定したこと
PMOS を置く領域ができた。この時点のDRC件数:0
PMOSとウェルタップを配置する領域を確保する。
入力
magic のコマンド欄で実行します。
load inverter box -2.1um 1.6um 1.2um 6.5um paint nwell読み方
3.3µm × 4.9µm の領域です。nwell の最小幅は 0.84µm(規則
nwell.1)なので余裕があります。左側を大きく取っているのは、段階5でウェルタップを nwell の中に置くためです。
確定したこと
PMOS を置く領域ができた。この時点のDRC件数:0
段階2 NMOS を作る
| 項目 | NMOS | PMOS | 由来 |
|---|---|---|---|
| W(チャネル幅) | 1.00µm | 3.50µm | D02(第4章) |
| L(チャネル長) | 0.15µm | 0.15µm | D03(第4章) |
| 拡散層 | ndiff | pdiff | — |
| 配置 | nwell の外 | nwell の中 | D05 |
入力
poly の縦は −0.7µm から 0.7µm で、拡散層(−0.5〜0.5µm)より上下に 0.2µm ずつ長く伸ばしています。拡散層の端でちょうど終わると、ポリシリコンの張り出しに関する規則に違反します。
横幅を 1.6µm と広めに取っているのは、段階6でコンタクトを置く余地を確保するためです。
確定したこと
NMOS ができた。ソースとドレインは poly の左右の
box -0.8um -0.5um 0.8um 0.5um paint ndiff box -0.075um -0.7um 0.075um 0.7um paint poly読み方
ndiff は縦が 0.5−(−0.5) = 1.0µm です。これがチャネル幅 W になります。第4章の表4-2で決めた 1.0µm がここに現れます。poly は横幅が 0.075−(−0.075) = 0.15µm です。これがチャネル長 L です。poly の縦は −0.7µm から 0.7µm で、拡散層(−0.5〜0.5µm)より上下に 0.2µm ずつ長く伸ばしています。拡散層の端でちょうど終わると、ポリシリコンの張り出しに関する規則に違反します。
横幅を 1.6µm と広めに取っているのは、段階6でコンタクトを置く余地を確保するためです。
確定したこと
NMOS ができた。ソースとドレインは poly の左右の
ndiff である。この時点のDRC件数:0
段階3 PMOS を作る
入力
NMOS が 1.0µm、PMOS が 3.5µm なので、PMOS のほうが3.5倍長い長方形になります。
2つ目の
確定したこと
トランジスタ2個ができ、ゲートがつながった。この時点のDRC件数:0
box -0.8um 2.15um 0.8um 5.65um paint pdiff box -0.075um -0.7um 0.075um 5.85um paint poly読み方
pdiff の縦は 5.65−2.15 = 3.5µm です。これが PMOS の W です。D02 で決めた 3.5倍が、ここで図形の寸法になります。NMOS が 1.0µm、PMOS が 3.5µm なので、PMOS のほうが3.5倍長い長方形になります。
2つ目の
box は、NMOS の poly の下端(−0.7µm)から PMOS の poly の上端(5.85µm)までを1本で塗る指定です。これで両方のゲートが1本の poly でつながります。縦積み配置(D05)を選んだ理由がここに現れます。確定したこと
トランジスタ2個ができ、ゲートがつながった。この時点のDRC件数:0
段階4 ゲートのコンタクト用に poly を広げる
入力
ゲートの poly は幅 0.15µm ですが、この幅ではコンタクトを置けません。コンタクトを置く箇所だけ幅を 0.5µm に広げます。
位置は NMOS と PMOS の間(y = 0.82〜1.38µm)で、どちらのトランジスタにもかからない高さです。
確定したこと
ゲートにコンタクトを置ける形になった。この時点のDRC件数:0
box -0.25um 0.82um 0.25um 1.38um paint poly読み方
ゲートの poly は幅 0.15µm ですが、この幅ではコンタクトを置けません。コンタクトを置く箇所だけ幅を 0.5µm に広げます。
位置は NMOS と PMOS の間(y = 0.82〜1.38µm)で、どちらのトランジスタにもかからない高さです。
確定したこと
ゲートにコンタクトを置ける形になった。この時点のDRC件数:0
段階5 タップを置く
ウェルタップ・基板タップ
第3章でNMOSのバックゲートをVSSに、PMOSのバックゲートをVDDに接続しました。レイアウトでは、この接続を接点として作成する必要があります。
NMOSが配置されるp型基板をVSSに固定するのが基板タップ、PMOSが配置されるNウェルをVDDに固定するのがウェルタップです。
タップは、拡散層(
第3章でNMOSのバックゲートをVSSに、PMOSのバックゲートをVDDに接続しました。レイアウトでは、この接続を接点として作成する必要があります。
NMOSが配置されるp型基板をVSSに固定するのが基板タップ、PMOSが配置されるNウェルをVDDに固定するのがウェルタップです。
タップは、拡散層(
psd / nsd)とコンタクト(psc / nsc)の2層で作ります。
入力
どちらも左側(x = −1.9〜−1.07µm)に寄せています。トランジスタの拡散層から 0.27µm 以上離す必要があるためです(規則
確定したこと
タップができた。この時点のDRC件数:16
box -1.9um -1.52um -1.07um -0.88um paint psd box -1.78um -1.4um -1.19um -1.0um paint psc box -1.9um 5.78um -1.07um 6.22um paint nsd box -1.78um 5.9um -1.19um 6.1um paint nsc読み方
psd は基板タップの拡散層、psc はそのコンタクトです。コンタクトは拡散層より 0.12µm 内側に置きます。囲みが足りないと licon.7 の違反になります。nsd / nsc はウェルタップで、nwell の中(y = 5.78〜6.22µm)に置きます。どちらも左側(x = −1.9〜−1.07µm)に寄せています。トランジスタの拡散層から 0.27µm 以上離す必要があるためです(規則
diff/tap.3)。確定したこと
タップができた。この時点のDRC件数:16
この段階でDRC違反が出るのは正常です
本講座の実測では、段階5の時点で16件の違反が出ました。内容はすべて
コンタクトは、その上に
段階の途中で件数が増えることは、誤りを意味しません。規則名が何かを確認します。
本講座の実測では、段階5の時点で16件の違反が出ました。内容はすべて
li.5(ローカル配線がコンタクトを囲む量の不足)です。コンタクトは、その上に
li1 の配線が乗ることを前提とした規則になっています。配線を描く段階7で解消します。段階の途中で件数が増えることは、誤りを意味しません。規則名が何かを確認します。
段階6 拡散層とゲートのコンタクト
入力
コンタクトは拡散層より 0.06µm 内側に置きます。
確定したこと
コンタクトができた。この時点のDRC件数:56
box -0.7um -0.44um -0.5um 0.44um paint ndc box 0.5um -0.44um 0.7um 0.44um paint ndc box -0.7um 2.21um -0.5um 5.59um paint pdc box 0.5um 2.21um 0.7um 5.59um paint pdc box -0.17um 0.9um 0.17um 1.3um paint pc読み方
ndc と pdc は拡散層のコンタクトです。ゲートの左右に1本ずつ、計4本置きます。左がソース、右がドレインです。コンタクトは拡散層より 0.06µm 内側に置きます。
ndiff が −0.5〜0.5µm なので、コンタクトは −0.44〜0.44µm です。囲みが足りないと licon.5c の違反になります。pc は poly のコンタクトです。段階4で広げた箇所(−0.25〜0.25µm)より 0.08µm 内側の −0.17〜0.17µm に置きます。確定したこと
コンタクトができた。この時点のDRC件数:56
段階7 配線とラベル
目的
コンタクトの上に
入力
1本目と2本目が VSS の配線です。NMOSのソース(左側のコンタクト)と基板タップをつなぎます。
3本目と4本目が VDD の配線で、PMOSのソースとウェルタップをつなぎます。
5本目が OUT で、NMOSとPMOSのドレイン(右側のコンタクト)を縦につなぎます。
6本目がゲートの poly コンタクトの上に乗る配線で、IN になります。
いずれも、下にあるコンタクトより 0.08µm 外側まで広げています。囲みが足りないと
確定したこと
配線ができた。この時点のDRC件数:0 段階5と段階6で出た違反がすべて解消した。
コンタクトの上に
li1 を敷き、4つの端子を作る。
入力
box -1.9um -1.52um -0.42um -0.42um paint li1 box -0.78um -0.58um -0.42um 0.58um paint li1 box -1.9um 5.57um -0.42um 6.22um paint li1 box -0.78um 2.07um -0.42um 5.73um paint li1 box 0.42um -0.58um 0.78um 5.73um paint li1 box -0.25um 0.82um 0.25um 1.38um paint li1読み方
1本目と2本目が VSS の配線です。NMOSのソース(左側のコンタクト)と基板タップをつなぎます。
3本目と4本目が VDD の配線で、PMOSのソースとウェルタップをつなぎます。
5本目が OUT で、NMOSとPMOSのドレイン(右側のコンタクト)を縦につなぎます。
6本目がゲートの poly コンタクトの上に乗る配線で、IN になります。
いずれも、下にあるコンタクトより 0.08µm 外側まで広げています。囲みが足りないと
li.5 の違反になります。確定したこと
配線ができた。この時点のDRC件数:0 段階5と段階6で出た違反がすべて解消した。
ラベルとポートの設定
LVSはこの名前で照合します。名前を付けるだけでなく、端子として登録する必要があります。
確定したこと
レイアウトが完成した。DRC 0件。
LVSはこの名前で照合します。名前を付けるだけでなく、端子として登録する必要があります。
box -1.7um -1.3um -1.6um -1.2um label VSS 0 li1 port make 1 box -1.7um 5.9um -1.6um 6.0um label VDD 0 li1 port make 2 box 0.5um 1.0um 0.6um 1.1um label OUT 0 li1 port make 3 box -0.1um 1.0um 0.0um 1.1um label IN 0 li1 port make 4 save inverter読み方
label <名前> 0 li1 は、指定した box の位置に li1 層のラベルを置く指定です。末尾の層名を省略すると、配線のない場所にラベルが置かれる場合があります。port make <番号> は、そのラベルを端子として登録する指定です。この行がないと、抽出したネットリストに端子が出ません。確定したこと
レイアウトが完成した。DRC 0件。
ラベルの名前は回路図と完全に一致させる
第7章のLVSは、回路図のピン名とレイアウトのラベル名を照合します。名前は第3章の表3-6と完全に一致させます(
ラベルが配線の上に載っていない場合、第7章の抽出結果で
第7章のLVSは、回路図のピン名とレイアウトのラベル名を照合します。名前は第3章の表3-6と完全に一致させます(
VDD / VSS / IN / OUT)。大文字小文字も区別されます。ラベルが配線の上に載っていない場合、第7章の抽出結果で
.subckt inverter の行に端子が並びません。cat inverter.mag で << labels >> の行を確認すると、どの層に載っているかが分かります。flabel space ... となっていれば、配線のない場所に置かれています。
7.6 DRCの実行
DRC(Design Rule Check)
製造工場が定めた寸法と間隔の規則に違反していないかの検査です。規則は、露光の解像度、エッチングの精度、位置合わせ精度といった製造上の制約から決まります。
基礎01「KiCad入門」で行ったプリント基板のDRCと同じ考え方で、対象の寸法が異なります。
製造工場が定めた寸法と間隔の規則に違反していないかの検査です。規則は、露光の解像度、エッチングの精度、位置合わせ精度といった製造上の制約から決まります。
基礎01「KiCad入門」で行ったプリント基板のDRCと同じ考え方で、対象の寸法が異なります。
目的
描いた図形が製造できる形状かを検査する。件数と、違反した規則の名前を得る。
入力
件数を記録するため、コマンドから実行します。
括弧の中(
続く波括弧は違反箇所の座標で、単位は magic の内部単位(0.005µm)です。
件数と箇所の数は一致しません。上の例は2件ですが、同じ場所を2つの規則が指しています。1箇所を直せば2件とも消えます。
確定したこと
図形が規則に違反しているかどうか。違反の直し方はまだ決まっていない(D06、6.7節)。
描いた図形が製造できる形状かを検査する。件数と、違反した規則の名前を得る。
入力
件数を記録するため、コマンドから実行します。
drc.tcl を作成します。
drc euclidean on
load inverter
select top cell
drc check
drc catchup
puts "TOTAL=[drc list count total]"
foreach e [drc listall why] { puts $e }
quit -noprompt
実行します。
magic -dnull -noconsole \ -rcfile $PDK_ROOT/sky130A/libs.tech/magic/sky130A.magicrc drc.tcl画面(違反がある場合の例)
TOTAL=2
Metal1 spacing < 0.14um (met1.2)
{2020 0 2028 2000} {1992 0 2000 2000}
Metal1 > 3um spacing to unrelated m1 < 0.28um (met1.3b)
{2020 0 2056 2000} {1964 0 2000 2000}
読み方TOTAL= の数字が違反の総数です。0 なら合格です。括弧の中(
met1.2)が規則の名前です。これが直し方を決めます。公式の設計規則書で該当項目を確認できます。続く波括弧は違反箇所の座標で、単位は magic の内部単位(0.005µm)です。
件数と箇所の数は一致しません。上の例は2件ですが、同じ場所を2つの規則が指しています。1箇所を直せば2件とも消えます。
確定したこと
図形が規則に違反しているかどうか。違反の直し方はまだ決まっていない(D06、6.7節)。
drc list count why では規則の名前が出ない
似た名前のコマンドに
似た名前のコマンドに
drc list count why があります。こちらは「セル名 件数」の対を返すだけで、規則の名前を含みません。
inverter 2規則の名前が必要なので、
drc listall why を使います。
Makefileへの追加
drc: magic -dnull -noconsole \ -rcfile $(PDK_ROOT)/sky130A/libs.tech/magic/sky130A.magicrc drc.tcl第5章の
make check に加え、make drc が使用できるようになります。
7.7 【判断点 D06】DRCエラーの修正順
【判断点 D06】どのエラーから修正するか
決めること
発生したエラーのうち、設計上の問題によるものと、他のエラーに付随して発生しているものを区別し、修正の順序を決める。
材料
・
・
・PDK名と magic のバージョン
相談
質問:
「magicのDRCで発生したエラーです。設計上の問題によるものと、他のエラーに付随して発生しているものに分類してください。そのうえで修正の順序を提案し、それぞれ何を修正すればよいか記載してください。」
返答
1. レイヤーの過不足(例:nwellがPMOSを覆っていない)
2. 囲み量(enclosure)の不足(例:拡散層がコンタクトを覆っていない)
3. 間隔(spacing)の不足(例:拡散層同士が近すぎる)
4. 最小寸法(width)の不足(例:li1が細すぎる)
理由:上位の項目を修正すると、下位の項目のエラーが同時に解消される場合が多いため。
決定
上記の順序で修正する。
検証
本講座の作成過程で実際に発生した違反と、その解消の推移を6.8節に記載します。
判定:◯ 囲み量の修正が最も多くの違反を解消しました(32件→15件)。
決めること
発生したエラーのうち、設計上の問題によるものと、他のエラーに付随して発生しているものを区別し、修正の順序を決める。
材料
・
drc listall why の出力(規則の名前、件数、座標)・
cat inverter.mag の内容・PDK名と magic のバージョン
相談
質問:
「magicのDRCで発生したエラーです。設計上の問題によるものと、他のエラーに付随して発生しているものに分類してください。そのうえで修正の順序を提案し、それぞれ何を修正すればよいか記載してください。」
返答
1. レイヤーの過不足(例:nwellがPMOSを覆っていない)
2. 囲み量(enclosure)の不足(例:拡散層がコンタクトを覆っていない)
3. 間隔(spacing)の不足(例:拡散層同士が近すぎる)
4. 最小寸法(width)の不足(例:li1が細すぎる)
理由:上位の項目を修正すると、下位の項目のエラーが同時に解消される場合が多いため。
決定
上記の順序で修正する。
検証
本講座の作成過程で実際に発生した違反と、その解消の推移を6.8節に記載します。
判定:◯ 囲み量の修正が最も多くの違反を解消しました(32件→15件)。
7.8 DRC件数の推移
本講座で実際に作成したときの推移です。
| 段階 | 描いた層 | TOTAL | 主な規則 |
|---|---|---|---|
| 1 | nwell | 0 | — |
| 2 | ndiff + poly(NMOS) | 0 | — |
| 3 | pdiff + poly(PMOS、ゲート接続) | 0 | — |
| 4 | poly(コンタクト部の拡張) | 0 | — |
| 5 | psd/psc、nsd/nsc(タップ) | 16 | li.5 |
| 6 | ndc/pdc/pc(コンタクト) | 56 | li.5 |
| 7 | li1(配線) | 0 | — |
段階5と段階6で件数が増え、段階7ですべて解消しています。増えた違反はいずれも li.5(ローカル配線がコンタクトを囲む量の不足)で、配線を描くことで解消します。
作業の途中で件数が増えることは、誤りを意味しません。規則名を確認し、後の段階で描く層に関するものかどうかを判断します。
座標を自分で決める場合に発生した違反
本講座の座標に至るまでに、実際に次の違反が発生しました。読者が座標を変更する場合の参考になります。
| 修正した内容 | 件数の変化 | 規則 |
|---|---|---|
| (初回) | 32 | — |
| 拡散層がコンタクトを囲む量を確保 | 32 → 15 | licon.5c、li.5 |
| li1 同士の間隔を確保 | 15 → 14 | li.3、li.c2 |
| poly コンタクトを li1 で囲む | 14 → 6 | li.5 |
| poly コンタクトを poly で 0.08µm 囲む | 6 → 0 | licon.8a |
| (タップ追加後) | 18 | licon.7 |
| タップの拡散層を追加 | 18 → 7 | licon.7 |
| nwell の囲みと拡散層の間隔を確保 | 7 → 0 | diff/tap.10、diff/tap.3 |
| 規則 | 意味 | 対処 |
|---|---|---|
nwell.1 | N-wellの幅が0.84µm未満 | nwellを広げる |
diff/tap.1 | 拡散層の幅が不足 | 拡散層を広げる |
diff/tap.3 | 拡散層同士の間隔が0.27µm未満 | 離す |
diff/tap.10 | N-wellがN-tapを0.18µm囲んでいない | nwellを広げる |
licon.5c | 拡散層がコンタクトを0.06µm囲んでいない | 拡散層を広げるかコンタクトを内側へ |
licon.7 | タップの拡散層がコンタクトを0.12µm囲んでいない | 同上 |
licon.8a | polyがpolyコンタクトを0.08µm囲んでいない | polyを広げる |
li.1 | li1の幅が0.17µm未満 | 配線を太くする |
li.3 | li1同士の間隔が0.17µm未満 | 配線を離す |
li.5 | li1がコンタクトを0.08µm囲んでいない | 配線を広げる |
li.6 | li1の面積が不足 | 幅が足りていても面積で落ちる。長さを伸ばす |
幅を満たしても面積で落ちる規則がある
このため、幅の違反を直した直後に件数が増える場合があります。件数が減らないことは、必ずしも修正が誤っていることを意味しません。規則の名前が変わったかどうかを見ます。
li.6 と met1.6 は最小面積の規則です。幅が最小値ちょうどの細い配線を短く描くと、幅の規則には合格して面積の規則で違反します。このため、幅の違反を直した直後に件数が増える場合があります。件数が減らないことは、必ずしも修正が誤っていることを意味しません。規則の名前が変わったかどうかを見ます。
7.9 判断点 D03 の判定
第4章で保留していたチャネル長の判断(D03)を判定します。
| 結果 | 判定 |
|---|---|
| 最小寸法(L=0.15µm)のままDRCに合格した | ◯ |
| Lを大きくして再作成した | ×(変更後の値を記録する) |
本講座で確認した範囲では、L=0.15µm のままDRC 0件に到達しました。判定は ◯ です。
| 番号 | 決定内容 | 検証結果 | 判定 |
|---|---|---|---|
| D01 | 標準トランジスタ、電源1.8V | 計算が収束した | ◯ |
| D02 | Wp/Wn = 3.5 | Vsp = 0.9002V、差 2.0% | △ |
| D03 | チャネル長 最小 0.15µm | DRC 0件に到達 | ◯ |
| D04 | 0.9V±0.15V、差30%以内 | 15条件すべて合格 | ◯ |
| D05 | 縦積み配置 | DRC 0件に到達 | ◯ |
| D06 | 層→囲み→間隔→寸法の順 | 囲みの修正で32→15件 | ◯ |
| D07 | 第7章で記入 | — | — |
この章のまとめ
・magic の起動は
・トランジスタは、拡散層とポリシリコンの交差として作成する
・層の名前を間違えると、エラーが出ずに無視される。
・拡散層のコンタクトは
・タップは
・ラベルには
・【D05】縦積み配置を選択した。DRC 0件、LVS一致に到達した
・DRCの件数は
・件数と違反箇所の数は一致しない。1箇所が複数の規則に触れる
・【D06】層 → 囲み → 間隔 → 寸法 の順に修正する。囲みの修正が最も効いた
・作業の途中で件数が増えることは誤りを意味しない。後の段階で描く層に関する違反が含まれる
・【D03検証】◯ 最小チャネル長のままDRCに合格した
・magic の起動は
-rcfile で magicrc を指定する。読み込めたかは tech name で確認する・トランジスタは、拡散層とポリシリコンの交差として作成する
・層の名前を間違えると、エラーが出ずに無視される。
cat inverter.mag で確認する・拡散層のコンタクトは
ndc / pdc。licon1 ではない・タップは
psd+psc / nsd+nsc の2層で作る・ラベルには
port make が必要。これがないと抽出結果に端子が出ない・【D05】縦積み配置を選択した。DRC 0件、LVS一致に到達した
・DRCの件数は
drc list count total、規則の名前は drc listall why で得る・件数と違反箇所の数は一致しない。1箇所が複数の規則に触れる
・【D06】層 → 囲み → 間隔 → 寸法 の順に修正する。囲みの修正が最も効いた
・作業の途中で件数が増えることは誤りを意味しない。後の段階で描く層に関する違反が含まれる
・【D03検証】◯ 最小チャネル長のままDRCに合格した