AIで半導体回路設計・第二弾(SPICE編)
夏休みの宿題「AIで回路設計・第二弾」として、Open-Source TR-1um を使った OpenSUSI-MPW サービスでも実装できそうなロジック回路として、非同期 I2C 回路を Claude に実装させてみました。
仕様書からVerilogシミュレーションまでは進めたが、配置配線でスタセルの改良が必要で敗退した白旗編、 TR-1um のスタセルを作り直すことで P&R を収束させたリベンジ編、チップレベルの配線を進めてDRC/LVS をクリーンにしたコンプリート編、チップレベルでの最終タイミングをIRSIMで検証してチップを完成させた検証編に続くシリーズ第5弾です。
今回は、追い検証としてSPICE(ngspice)を使ったチップレベルでの最終タイミング+動作検証を行い、設計確度を上げてみます。何処までできますか。。。
See https://github.com/jun1okamura/TR-1um_Async_I2C
すべての試行錯誤は、GitHub に記録されています。ご参考まで。
ngspice の導入
Local 環境に ngspice をインストールします。MACなので Homebrew を使って簡単にインストールできます。
% ngspice -v
******
** ngspice-46 : Circuit level simulation program
** Compiled with KLU Direct Linear Solver
** The U. C. Berkeley CAD Group
** Copyright 1985-1994, Regents of the University of California.
** Copyright 2001-2025, The ngspice team.
** Please get your ngspice manual from https://ngspice.sourceforge.io/docs.html
** Please file your bug-reports at http://ngspice.sourceforge.net/bugrep.html
******
SPICE ネットの準備
V9(前回の検証編で完成させたLayout)のLVS検証でクリーンになった spice ファイルをベースに、I2C_Slaveの動作検証では不必要なRING_OSCを除いた spice ファイルを Claude に作らせます。テストベンチとして、基本動作(WR/RD)信号をPWLで発生させ、SDA信号にはGIO外部で10KΩのプルアップ抵抗を接続します。
SPICEでの、追い検証で重要なことは、限りなくチップレベルに近いネットで検証をすることです。つまりGIOやBUFTH等のアナログ回路もASISで動作検証します。当然、時間がかかるので、基本動作だけの検証しか出来ません。つまり動作検証としてはカバレッジが低くなりますが、実チップ動作確認ができるのでTO前に「枕を高くして寝るために」挑戦したい検証作業です。
バグ発覚!
案の定バグ発覚。原因はSTOPパルス検出器(DEL1固定遅延エッジ検出)がSDAのプルアップ抵抗での立ち上がり(15〜20ns)に対して遅延が短すぎ、電圧比較が閾値を跨がないというアナログ現象。IRSIM(疑似アナログ)・Verilog(デジタル)では原理的に検出不可能な不具合で、SPICE検証で初めて見つかりました。
回路変更
Claude君からの提案で、STAR/STOP検出をbusyゲート付きNOR2のクロスカップルドSRラッチに回路変更、追加として全33個のDFFRB行バッファのクロック(SCL由来)割当を機能グループ単位で体系的に整理し直しなおして、AP&Rの拘束条件として設定しました。
V10 再AP&R の実行
回路変更となったため、Verilog>合成>NET検証>IRSIM検証>AP&R>チップレベル配線>DRC/LVS検証の一連の作業を再度実行します。
STDCELL の追加
合成結果からXOR2/XNOR2/AND4_X1と、配線数の緩和を念頭に RSLATCH と MUX付きのDFFRB の導入による効果を Claude に図ったところ「効果あり」とのことでSTDCELLに追加しました。
RSLATCH のレイアウト例では、V9ではNOR2を2個使っていたのに比べて、M2配線が6>4へ、セル幅が6>5トラックへ減少できています。
| セル | V9使用数 | V10使用数 | 差分 | 備考 |
|---|---|---|---|---|
| DFFRB | 33 | 14 | -19 | 19個がMUXDFFRBへ統合 |
| MUXDFFRB | 0 | 19 | +19 | V10で新規導入 |
| MUX2 | 24 | 6 | -18 | 19個がMUXDFFRBへ統合 |
| NAND2 | 22 | 23 | +1 | 論理合成結果の揺らぎ |
| NOR2 | 15 | 14 | -1 | 3組(6個)がRSLATCHへ統合 |
| RSLATCH | 0 | 3 | +3 | V10で新規導入 |
| NOR3 | 8 | 8 | 0 | |
| BUF_X1 | 8 | 8 | 0 | 行バッファ |
| INV_X1 | 6 | 7 | +1 | |
| OR2 | 5 | 6 | +1 | |
| AND2_X1 | 2 | 5 | +3 | |
| NAND3 | 3 | 3 | 0 | |
| OR4 | 2 | 2 | 0 | |
| NOR4 | 2 | 2 | 0 | |
| BUFTH | 2 | 2 | 0 | シュミットトリガ入力 |
| XOR2 | 1 | 1 | 0 | |
| XNOR2 | 1 | 1 | 0 | |
| OR3 | 1 | 1 | 0 | |
| DEL1 | 1 | 0 | -1 | V10でRTL変更により未使用 |
| AND4_X1 | 1 | 1 | 0 | |
| 合計 | 137 | 126 | -11 |
AP&R再実行
V9用のスクリプトを使って Verilog>合成>NET検証>IRSIM検証>AP&R まで一気に進めます。配置では、DFFRB/MUXDFFRB をグループ分けして配置する拘束条件を追加し、SCL信号の行ごとのサブ・クロックツリーの分配でタイミング問題が起こらないように工夫を追加しました。
BBOX比較
| 幅 (um) | 高さ (um) | 面積 (um²) | |
|---|---|---|---|
| V9 | 1632.6 | 936.1 | 1,528,276.9 |
| V10 | 1632.6 | 938.9 | 1,532,848.1 |
| 差分 | ±0 | +2.8 (+0.3%) | +4,571.2 (+0.3%) |
ネット数比較
| レイヤ | V9 | V10 | 差分 |
|---|---|---|---|
| M1 | 4476 | 4132 | -344 (-7.7%) |
| M2 | 2164 | 2115 | -49 (-2.3%) |
| V1 | 1390 | 1335 | -55 (-4.0%) |
DRC/LVS実行
コアのレベルで一旦DRC/LVSクリーンを確認
チップレベルの配線
V9用のスクリプトを使ってトップレベルの配線まで進めます。コアのピン位置が変更されているので、チップのPADとの配線可能性を先ずClaudeに検討させたところ、V9のピンアサインは配線しづらいとのことで、物理パッド番号とbit番号が単調増加・減少の二種類の構成を再検討させたところ、P3..P6=bit0-3、P11..P14=bit4-7)が配線しやすいとの結論を得たので、配線の拘束条件としてschematic/gio_connections.json を変更しました。
チップレベルのレイアウトは Claude に作らせているのですが、トップレベルにピンがないため、LVS前にPAD位置(POのセンター)にM2PINを自動配置するスクリプトをClaude君に書かせて、PINを生成してからLVSを通します。
再追いSPICE
LVS/DRC クリーンを確認したら、V9でのデバッグに使ったスクリプトを使って、V10でのSPICE検証環境を整えます。念のため、Verilog/IRSIMで検証に使ったテストベンチの14項目を判断するスクリプトと同様のSPICE用のテストベンチを再生成します。
cd ngspice/TB
ngspice -b tb_chip_i2c_batch14_v10.spice > spice_batch14_v10.log 2>&1
python3 check_batch14_v10.py spice_batch14_v10.log
[t=9500ns] OK: busy asserted after START (5.000V)
[t=99500ns] OK: slave ACKed matching address (write) (0.044V)
[t=101800ns] OK: addr_match asserted (5.000V)
[t=101800ns] OK: rw indicates WRITE (0.000V)
[t=189500ns] OK: slave ACKed data byte (0.044V)
[t=194000ns] OK: rx_data == 0xA5 (got 0xA5, expected 0xA5)
[t=209000ns] OK: busy cleared after STOP (0.000V)
[t=309500ns] OK: slave ACKed matching address (read) (0.044V)
[t=311800ns] OK: rw indicates READ (5.000V)
[t=319500ns] OK: read byte == 0x3C (got 0x3C, expected 0x3C)
[t=419000ns] OK: busy cleared after final STOP (0.000V)
[t=519500ns] OK: unmatched address -> NACK (no slave ack) (4.950V)
[t=521800ns] OK: addr_match not asserted for foreign address (0.000V)
[t=539000ns] OK: busy cleared after STOP following NACK (0.000V)
---- RESULT ----
All 14 checks PASSED
WRITE(0x50へアドレス一致・データ0xA5書込)→READ(同アドレスから0x3C読出)→誤アドレス(0x11)NACKの3トランザクション・14チェック全項目PASSを確認できました。
SUBMISSION
OpenSUSIのサブミッションURLから OpenSUSI-MPW の Aggregation repository へ再度TOを行いました。
まとめ
ngspice を使ったチップレベルでの追いSPICE検証をClaude君と進めました。V9のデバッグからV10のチップレベル検証まで、1日(基本はClaudeとのやり取りは内職)で完了させました。
今回、STDCELLの設計(回路+レイアウト)以外の作業は、基本的には Claude君にお願いして設計・検証を進めました。私は Claude君への指示と結果の確認、デバッグ時のバグ想定や検証方法の指示といったことで、Claudeの設計に対して、デザインレビューを行う上司の役割に徹しています。SPICEの波形確認もWaveViewerは極力使わずに、Claude君の提案と指示によりダンプした波形の時系列情報を直接解析してもらった(波形はAIには扱い難い)のが新たな発見でした。
チップ設計にAIが実用に使えるのか?という問いに答えると「十分使える」ですが、原状では、使う人間の能力がボトルネックになることが次の課題だと感じています。今後も進化は進むと思われますが、オープンソースのEDAツールとNDAフリーのPDKは必須であり、ライセンスなしに「サンドボックス内でツールやPDKが大活躍できる」こと、人間とAIの間で「どのように設計課題を正しく認識する」こと、また「正解への道のりを如何に正しく選んでいく」ことが重要だと感じました。何はともあれ、やはりオープンソース環境はAIの要諦だと再認識です。


