AIで半導体回路設計・第二弾(リベンジ編)
夏休みの宿題「AIで回路設計・第二弾」Open-Source TR-1um を使った OpenSUSI-MPW サービスでも実装できそうなロジック回路として非同期 I2C 回路を Claude に実装させてみました。既存の TR-1um のスタセルでは、P&Rが収束できず白旗をあげました。
今回は、改めてスタセルを作り直してリベンジできるか?を Claude君と試します。何処までできますか。。。
See https://github.com/jun1okamura/TR-1um_Async_I2C
チャネル設計
以下の様なチャネル設計に変更します。
Claude に説明してスタセルと配線チャネルの設計方針をまとめてもらいます。
スタセル設計方針
- セル高さ:5.4umの整数倍(N行)。M2の縦トラックピッチ(5.4um)と共通グリッドにすることで、行境界をまたいでもM2トラックが連続する。
- セル幅:5.4um×信号ピン数。各信号ピンに専用のXトラックを1本ずつ割り当て、同一Xに複数ピンを置かない。
- 電源(VDD/GND):信号ピン用の5.4グリッドには含めない。専用タップセルを配置時に指定し、M2縦ストラップで上下方向に接続する。
- ビア/パッド寸法:VIA=1.4um、パッド=3.4um(=VIA+エンクロージャ1.0um×2)。既存ルータで実証済みの値をそのまま踏襲。
- OBS(使用済みトラック宣言):セルごとに、内部配線が使用しているM2トラック番号を整数リストで宣言する(LEFのOBS相当)。素通り配線はこのリストに無いトラックのみ使用可。まずはセル全高ブロックの単純な集合で開始し、必要になればY範囲付きに拡張。
配線チャネル設計方針
- チャネル内グリッド:X=5.4um(M2ピッチ、セルと共通)、Y=4.0um(M1トラックピッチ)。
- 役割分担:M1はチャネル内の横方向配線専用(行ピッチ4.0um)。M2はセル上も含めた縦方向トランク配線用で、5.4umピッチの固定トラック上を走る。
- セル上のM2素通り:セルのOBSトラックリストで内部使用トラックを避ければ許可。これにより現行のM1チャネルスイッチ方式(§34.12/34.13)は不要になる見込み。
実装上の要点
- 全ての位置はum(浮動小数点)ではなく、5.4/4.0グリッドの整数トラック番号で内部管理し、GDS出力時にのみumへ変換する。これにより「ピン・パッドの位置が正しければ幾何的に衝突しようがない」設計となり、今回のセッションで繰り返し発生した未検証パッド描画・ジョグ経路探索バグのクラスが構造的に排除される。
スタセル改造
INV_X1
まず INV_X1 を方針に従って改造します。左がオリジナル、右が改造セルです。
改造セルは、上下ミラー配置をしないので、BBOXを修正し、横幅と縦幅は 5.4um の整数倍にしています。電源は上下で左右のセルとM1で接続、入出力はM2で上下方向に接続です。DRCをクリーンにして Claude 君にレビューしてもらい。P&R用の LEF を生成してもらいます。
INV_X1のLEFを作りました。GDSの座標をハードコードせず、幾何から自動抽出する生成スクリプト(gen_lef.py)も一緒に作ったので、今後セルが増えたりGDSを修正した際は再実行するだけで追従します。
抽出のロジック:
- SIZE:prBoundaryから PIN(A/Y=M2, VDD/GND=M1):先週分けたM1PIN(48/1)・M2PIN(49/1)マーカーの矩形をそのまま使用、TXM1/TXM2のテキスト位置とマーカー内包判定でピン名を対応付け
- OBS:実際のM1/M2形状からピン領域を差し引いた残り(内部配線)を自動計算し、多角形のまま出力
- SITE:幅5.4um(M2トラックピッチと同じグリッド)× 高さ64.8um
ピンの方向(INPUT/OUTPUT/POWER/GROUND)は幾何からは判定できないため、セルごとの手入力テーブル(PIN_META)で管理しています。セルが増えたらここに追記が必要です。
「方針の確認とLEFの生成に問題がないこと」が分かったので、残りのセルの改造を進めます。
NAND2
左がオリジナル、右が改造セルです。左はA/B入力のX座標が重なっていることがわかると思います。自動P&Rでは、M2は縦方向なので、先にAが配線されてしまうとBが配線できなくなります。改造セルでは同じX座標にPINを配置しません。
MUX2
左がオリジナル、右が改造セルです。セル内でM2を横配線に使わないようにレイアウトし直しています。
LEF
LEF(Library Exchange Format)とは、P&Rをするために必要な抽象化された、物理情報: スタセルの詳細な内部構造やトランジスタの不必要な情報を取り除き、「外形サイズ」「ピンの位置」「配線レイヤーの禁止領域」など、P&Rに最低限必要な情報だけを軽くしたデータです。P&Rではこの情報を使って配置配線を進ます。出来上がったスタセルのGDSIIを Claude に読み込ませて、その後に必要な LEF を生成してもらいます。
仮配置配線
合成に最低限必要な17種類のスタセルのLEFを準備して(一部のGDSIIには外形とピン情報だけ)、一列で配置配線が出来るか?試しました。
構成:
- 合成したネットを配置して配線します。
- 1行のスタセル列(上下にチャネルを持つ)
- 行の両端+中央にTAP2を配置(電源タップ)
- TAP2の間に信号セルを並べる
- 配線は、チェネルグリッド(M1=4 M2=5.4)です。
- チャネル高さは、必要本数を見積もってください。
1行構成でのP&R試行が完了しました。結果は良好です。
新方式(LEFピン表から座標を直接計算、探索も事後クリアランスチェックも無し)で、合成済みネットリスト152インスタンス+TAP2×9を1行(コア4719.6×432.8um、上下チャネル各184um)に配置配線しました。DRCは全違反ゼロ、配線対象165ネット全てが実際に電気的に接続されていることを確認しています(残り31ネットはtx_data入力や未使用QB出力などの正当なスタブ)。
素晴らしい!!! もともとのスタセルでは未配線が潰せなかったですが、改造スタセルでは165ネットすべて配線完了です!!!
多段積み
今度は2段積みにして様子を見てみます。2段積みだと上下で隙間ができるのでFILLセルを追加しました。
FILL
隙間を埋める FILLセルにはデカップ容量のMOS容量を追加しました。
TAP
同様に、スタセル間の電源配線用にTAPセルを追加しました。
結果
結果まとめ: 配置(TAP先置き、両行幅一致)は成功。DRCは完全クリーン(0違反)。ただし、レイヤー考慮の接続性検証で28件の真の短絡が見つかりました。原因は中央チャネルの深いトラック(最大86段)に届かせるための長距離M2スタブが、5.4umグリッド由来の偶然のX一致で他ネットのスタブと融合してしまうことです(136組の座標一致を確認)。
「衝突検出+ジョグ」を実際に実装しましたが、中央チャネルのピン同士のY方向重複が229/384(ほぼ全数)に達し、単純なジョグでは逃げ場がなく破綻することが分かりました。これは本格的な詳細配線(マルチレベルのドッグレッグ対応メイズルータ)が必要な規模の問題です。
今後の選択肢は3つです: (1) 本格的な詳細ルータへの投資、(2) FM法などlocality考慮の行分割でcross-row net数(現状76、ピーク56)を減らし問題規模を縮小、(3) 現状の記録で一旦区切る。どちらに進めますか。
FM法の導入
FM法(Fiduccia-Matheyses法)とは、大規模な集積回路(LSI/FPGA)のネットリストを、配線長やカット数が最小になるように2つの領域へ高速に分割するためのヒューリスティック最適化アルゴリズムです。
OpenSUSI-MPWのユーザー領域1800x1800 に入れるため、横幅をグリッドサイズの300倍=1620として、スタセルの段数を概算で試算させたところ4段となったので、4段で試しにP&Rさせた。左右と中心にはTAPセルを配置して電源のメッシュを作成して、残る領域はFILLセルで埋めた。
23件のcase 2ショートとOPEN:の24件があります。
23 のショートは、上下のスタセルからのM2配線が、偶然、同じX座標になることが原因なので、先ずは配置のアルゴリズムを改善してみる。
残念ながら、23件>22件の改良にとどまる。。。
FO大ネット優先戦略
非同期回路なのでCLKは無いのだが、FOが大きいネットを優先して配線することにして試したところ、22件>8件 に減った!
お見合いエラー対策
8件中の6件は、上下のスタセルからのM2配線のお見合い(同じX座標)なので、M1でのジョグ挿入で逃げることにする。8件>6件 に減った!
バグとり
半日戦った結果、残り1件!!!
利用済みのM1トラックを再利用するルーチンとバグ修正して、、、ついに!!!
配線ショート=0、配線処理収束しました!
まとめ
Claude 君と壁打ちしながら、非同期 I2C 回路を自動P&Rでレイアウトすること出来ました。リベンジの方針決めてから3日で完成!素晴らしい。
まだスタセルの中身を完成させないと成らないのと、最後の未使用配線トラックの圧縮とフレームのIOへの接続作業がありますが、Claude でP&R出来ることが分かったのは大きいです!














