
2026/09/08 1:02
ASIC のリバースエンジニアリング
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Jane Street は、GDSII および VCD ファイルを用いて独自に設計された ASIC チップの構造をリバースエンジニアリングする課題を発表しました。具体的には、レイアウト用の
puzzle.gds とテストケース用の example_inputs.vcd が提供されています。この設計は SkyWater 130nm プロセスに基づいて構築されており、トランジスタ(nwell、diff、poly)および 5 メタル層を含む主要なレイヤーが含まれています。チップには 92 のフリップフロップ、R4 領域に配置されたグリッド座標をパッチにマッピングするための 147 ゲートからなるルックアップテーブル、ならびに R11 領域に配置された 200 以上のセルを含む出力ライターが統合されています。入力には clk、rst_n、enable および 121 ビットのデータストリーム(I)が含まれ、出力には 8 ビットの ASCII 形式の結果(O)と success フラグが含まれています。このハードウェアは「スター・バトル」論理グリッドゲームのバリデーターとして機能し、各行、各列、各領域にちょうど 2 つの星を配置し、隣接する星がないという制約を強制します。論理的な R6 および R7 はそれぞれ行およびパッチの検証を担当し、すべての条件(合計 22 つの 1、隣接ペアなし、正しいカウント)が満たされた時点で R10 によって最終的な success ビットが駆動されます。現在提供されたテストケースのシミュレーションでは、VCD トレースに記録されている 730 ビットの出力と一致して "TRY AGAIN" というメッセージが表示されます。この演習は、回路図なしで生粋のハードウェア記述およびデジタル論理制約を解釈するための高度なベンチマークとして機能します。本文
GDS ファイルからのチップ解読:Jane Street 逆工学課題の攻略法
Kjartan van Driel と Leander Post による「Per aspera ad astra(道は険しければ、星にたどり着く)」というスローガンのもと、Jane Street が発表した ASIC チップの動作推測・解読課題に対するアプローチを解説します。 本稿は、GDS ファイルを読み込み、製造プロセスを理解し、論理回路を復元してシミュレーションを行うまでの一連の流れを整理しています。
第 1 編:GDS とは何なのか?
ファイル構成とレイヤー構造
パズルは主に以下の 2 つのファイルで構成されています。
: **グラフィックデータシステム(Graphic Data System)**形式の設計ファイル。チップの物理的なレイアウト情報を含みます。puzzle.gds
: テストケース。入力信号と、チップが生成するべき出力を示すログです。example_inputs.vcd
レイヤーの理解
GDS ファイルは異なる種類の多角形(Polygon)を「層(Layer)」ごとに区別して記述します。
- 注釈情報: ファイル内には意味のないテキストが含まれており、一見すると混乱を招きます。
- プロセスの特定: 論理セルの名前がヒントになります。
で始まる名前は、SkyWater 130 nm プロセス向けのスタンダードセルライブラリであることを示します。公開されたドキュメントを参照することで、各層の意味を特定できます。sky130_fd_sc_hd__ - 層の分類:
- トランジスタ構成:
(N 型ウェル)、nwell
(拡散領域)、diff
(ポリシリコン)。poly - 局所配線:
(local interconnect)など、セル内部でトランジスタを接続する層。li1 - メタル配線:
〜met1
。チップ全体を横断する信号伝送用。複数の層があるため、物理的に交差しても電気的には接続しないように設計されています。met5
- トランジスタ構成:
接続の理解
- 形状 vs 電気接続: 上面から見て重なる場合でも、異なる層上にある場合は電気的に接続されていません。
- 接続方法: 層間を接続するにはコンタクトまたは**ビア(via)**が必要です。
- ピンラベル: セル上の
,A
,B
などのラベルは導通していませんが、直下のX
レイヤー上の配線を指し示しています。li1
コンポーネントの機能
トランジスタ(MOS)
- 動作原理: ポリシリコンゲートに電圧をかけると、ソース・ドレイン間が導通します。
- 種類:
(高電位で導通)とnMOS
(低電位で導通)の 2 種類を使用し、論理回路を構成します。pMOS
ロジックセル例:XOR ゲート
- 機能: 入力
,A
が異なれば出力B
、同じであれば1
。0 - 実装: 複数のトランジスタを組み合わせた単一の論理ブロックとして扱います。
メモリセル例:フリップ・フロップ
- 機能: データ入力
をクロックエッジ(立ち上がり)の瞬間に取り込み、その値を保持します(D
)。Q - リセット:
が低電位になると、クロック待ちなくRESET_B
をゼロに強制できます。Q - 規模: チップ全体に 92 個あり、92 ビットのステートメモリとして機能します。
クロックバッファ
- 信号を強化して広範囲に伝える役割を持ちますが、論理的なシミュレーション上は経路追跡だけで十分です。
第 2 編:回路の復元
アプローチ:抽象化とネットリスト作成
トランジスタごとの詳細なシミュレーションは不要です。セル名からその機能(例:
xor2)を特定し、セル間の接続を追跡します。
接続追跡の手順
- 接続位置の確認:
- セル上のラベル(例:
の67/5
レイヤー)から入出力端子の位置を特定。li1 - メタルレイヤー(
)と局所配線(met
)、そしてビアによってセル間が接続されているかを確認。li1
- セル上のラベル(例:
- ネットリストの抽出:
- 各ピンの接続先配線をグラフ構造として描画。
- 電源ラインは論理動作上の定数として省略し、クロックバッファは駆動経路として扱います。
シミュレーション戦略
- 初期状態:
からリセットシーケンス(3 クロックサイクル低電位)を読み取り、初期値を設定。example_inputs.vcd - 入力処理: 121 ビットの入力を 1 バイトずつ送るシークエンスを再現。
- 同期更新: 全てのフリップ・フロップは同じクロックエッジで同時に更新されます。新しい
値に基づきD
を更新し、出力を確認。Q - 検証: シミュレータの出力と VCD ファイルの記録を比較。すべてのビットが一致することで、回路構造の復元成功を確認しました。
第 3 編:回路の推論
グリッドへの分割
121 ビットの入力空間全体をチェックするのは不可能なため、コンポーネントの位置情報を活用してチップを領域に分割します。
- R1〜R11: チップは約 11 つの主要な機能ブロック(領域)に分けられます。
- 出力ライター:
は最終結果を出力する独立したブロックです。R11
各領域の機能解明(ルール導出)
各領域は「カラムカウント」「行チェック」などの役割を持ち、情報の流れを追跡することで論理機能を特定します。
| 領域名 | 機能概要 | 推論プロセス |
|---|---|---|
| R1 | 入力判定と開始 | カラムカウンタ(0〜10)を循環。入力ビットの有無でカウントを開始・停止。 |
| R2 | 行カウンタ | 同様に「行カウンタ」を生成。カラムカウンタと組み合わせて座標系を構築。 |
| R3 | 完了判定ゲート | と両カウンタの完了信号を受け取り、入力読み込み可否を制御。 |
| R4 | パッチマップ (Patch Map) | 2D グリッドの各座標に対応する「パッチ番号」を生成するルックアップテーブル。11 つのパッチにグリッドを分割します。 |
| R5 | カラムカウント (Column Count) | 各カラム内の の数を数え、3 で停止。「2 つの 1 が並ぶか?」を検出(YES/NO)。 |
| R6 | 行チェック (Row Check) | 行内の の数をカウントし、誤りを検出するフラグを立てる。 |
| R7 | パッチカウント (Patch Count) | パッチマップを用いて各パッチ内の の数を数え、「2 つの 1 が並ぶか?」を検出。 |
| R8 | 隣接チェック (Neighbour Check) | 直近の 12 ビットの入力を保持し、左/上など早期隣接セルと比較。「エッジで 2 つの 1 が接触するか?」を検出。 |
| R9 | 合計カウント (Total Count) | 入力された の総数をカウントし、特定値(22)を達成したかを確認。 |
| R10 | 成功判定 (Success) | 全ての条件を満たしているかを確認。 * 各行に 2 つの 1 * 各列に 2 つの 1 * 各パッチに 2 つの 1 * 接触していないペアなし * 合計 22 これらが全て成立すれば、成功フラグが立ちます。 |
| R11 | 出力ライタ | R10 の結果を読み取り、ASCII コードとして画面に印刷します。 |
ルールの正体
これらの条件(各行・列・パッチに 2 つずつ、接触禁止、合計 22)は、ボードゲーム**「スターバトル(Star Battle)」のルールと全く同一です。 この ASIC チップは、星の数と配置を検証するスターバト検証器**であることが明らかになりました。
解答と結論
R11 の出力ライタにより、正しい入力パターンの場合、チップは以下の文字列を出力します。
TRY AGAIN
(※これは解読プロセスのテスト用メッセージですが、実際の課題では特定の入力データを与えると解が導かれます)
まとめ
- GDS ファイル解析: プロセスドキュメントとレイヤー構造から物理回路を読み取る。
- ネットリスト化: セル間の接続をグラフとして抽象化し、シミュレータを作成する。
- 空間的分離: コンポーネントの配置に基づき機能領域を分割する。
- 論理同定: 各領域の動作を追跡し、「2 つずつ」「合計 22」といったゲームルールを特定する。
謝辞
- Leander Post: パズル解法の支援とビジュアル制作への協力に感謝します。
- Jane Street: チallenge の提供に感謝します。
- Fabiio Crameri: 視覚的に優れた色マップ(Scientific colour maps)の作成に協力したことに感謝します。
本記事では、複雑な物理回路から論理構造を抽出し、人間の知恵と計算によってその機能(ゲーム検証器)を読み解くプロセスを紹介しました。