
2026/10/02 23:42
ASIC パズルの結果
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
8 月、世界的なパズルが開催され、参加者たちは内部のネットリストや信号名がない物理的な GDS レイアウトのみを使用して、11x11 の「スターバトル」(「2 つは接触しない」)パズルを検証する専用チップの逆解析を求められました。30 以上の国から高校生の学生、研究者、エンジニア、定年退職者を含む 400 件以上の応募が寄せられました。解読者は KLayout、Yosys、Z3 などのツールを活用し、Python、Rust、C++、OCaml、Haskell、Odin による独自の実装を併用し、しばしば AI の支援も行いました。このチップは、星の配置を表す 121 サイクルの入力を受け付け、行・列・領域ごとに 2 ビットのカウンターを用いて並列チェックを実行するハードウェアチェッカーとして機能します。また、マス目を領域にマッピングする 121 ビット ROM、接触禁止制約を強制するための遅延ラインが採用されています。全星カウンタはイースターエッグ出力をトリガーし、すべてのパズルチェックを AND で結合することで成功を判定します。出力ジェネレーターでは、ゲームボードで駆動される小さな LFSR を使用して ROM 内の解答文字列を難読化し、成功后に復号化する仕組みを採用しています。誤った解答には「TRY AGAIN」が表示され、「THE NIGHT SKY AWAITS」、「EMPTY SKY」、「BIG BANG」といったメッセージは特定の入力でトリガーされます。このチップは、オープンソースの標準セルライブラリである SKY130 と、LibreLane ツールチェーンを用いて設計されました。逆解析のアプローチには、SKY130 セル名を保持したゲートレベルのネットリストのシミュレーション、C++ によるカスタム抽出パイプラインの作成、フロアプランの「島」を分析して RTL モジュールを特定する手法、インパルス応答差分を用いた動的探索、SAT ソルバーを用いて直接勝利入力を発見する手法など多岐にわたります。注目すべき貢献としては、Alexander Smallwood による FPGA 合成、Nikhil Kaniyeri による Minecraft コマンドブロック版、Marcin Wójcik による Groth16 ゼロ知識証明などが挙げられます。このイベントは、アクセシブルなオープンソース技術と協力的な精神が、多様なグループに複雑なハードウェア検証技術を習得させることを示しています。
本文
Jane Street の小型 IC チップパズル:リバースエンジニアリングと素晴らしい挑戦事例のまとめ
8 月、当社は小型集積回路(IC)チップのGDS レイアウトを公開し、機能を解明するためのパズルを開催しました。物理レイアウトのみを提供し、ネットリストや内部信号名は一切開示せず、参加者は独自のリバースエンジニアリングを行って内部機構を解析してくださいました。
この記事では、当該チップの実際の機能と、皆様께서どのように解決に至られたかをご紹介し、特に印象に残った素晴らしい提出事例へのオマージュを捧げます。
提出状況について
当社は 30 カ国以上から約400 の応募を受け取りました。
- 参加者の背景: 半数近くが米国、インド、イギリス、オーストラリアからのものだったほか、高校生や研究者、現役エンジニア、退職者まで幅広い層が含まれていました。
- 使用ツールと言語: KLayout や Yosys、Z3 などのオープンソースツールを活用し、Python、Rust、C++、OCaml、Haskell、Odin などに至る多様な言語で実装された自前のカスタムツール(多くのコードが AI で生成)を併用して解きました。
解決の概要
このチップは11×11 のスターバトルパズル(「Two Not Touch」とも呼ばれる)をハードウェアで検証するためのものです。
- 目標: 各行・各列・各色域に正確に2 つの星を配置することです。
- ルール: 互いに隣接する星が存在してはいけず、斜めでも接触してはいけないことです!
チップの動作フロー
チップは 121 サイクル分の入力を受け付けます(各入力:対応するマス目に対し、そこに星を配置するか否かを指定)。その後、以下の並列チェック処理を実行します:
- 行列検証: 各行・各列に対して 2 ビットカウンターを設け、正確に 2 つの星があることを検証。
- 領域検証: マス目と色域をマッピングするための 121 ビットの ROM および各色域に対する 2 ビットカウンターを用いて、各領域に正確に 2 つの星があることを検証。
- 接触防止検証: 隣接するマス目を追跡し、斜めを含むあらゆる方向において 2 つの星が接触しないよう確保するためのデレイライン(遅延線)。
- 集計と Easter Egg: 合計で配置された星の数を集計するカウンターを用いて、特定のイースターエッグ出力を生成。
これらのパズル検証条件はすべて論理 AND 処理され、その結果が成功シグナルとして出力されます。
出力ロジック
- 解答の保存: 解答文字列を ROM に格納しています。
- 暗号化: 解答がプレーンテキストとしてそのまま露出するのを防ぐため、ゲーム盤面に基づいて動作する小型の線性フィードバックシフトレジスタ(LFSR)によって暗号化されています。
- ※一部の参加者がこの LFSR を攻撃してしまいました!
- 解除条件: 成功条件を満たすと、出力ロジックが暗号化を解除し、解答文字列を発信します。
多くの不正解解法では "TRY AGAIN" という文字列が表示されますが、少数の解法は以下のイースターエッグをトリガーしました。
- 設計技術: SKY130 オープンソース標準セルライブラリを用いて設計され、LibreLane ツールチェーンで実装されました。
皆様께서どのように解決されたか
以下では、パズルを解くために実施したステップと、印象に残ったいくつかの優れたアプローチ事例を紹介します。
1. GDS からネットリストの抽出
最初のステップは、GDS レイアウトからゲートレベルのネットリストを抽出することです。
- 配慮事項: 「sky130_fd_sc_hd__nand2_2」のようなセル名を GDS ファイル内に残しておくことで、Magic や KLayout などのツールで LVS パスを走査し、生粋のゲートレベルネットリストを抽出できるように配慮しました。
- 独自ツール: 一部の参加者は、自前のネットリスト抽出ツールを作成しました。
- 事例(Vladislav Shapovalov) C++ で自前の抽出パイプラインを作成し、GDS から各セルの形状を抽出してセル名と結合し、完全な論理的ネットリストを生成しました。暖房設計(ウォームアップ・デザイン)を使ってパイプラインのデバッグを試行錯誤した後、正式なパズル GDS の抽出に活用しています。
2. ネットリストのシミュレーション
回路グラフを得ただけでなく、各セルの動作挙動を知る必要があります。
- Verilog 生成: Stephen Ebert 氏などは Verilog を生成し、既存のシミュレータと SKY130 セルモデルを利用しました。
- 独自評価器:独自の評価器を構築し、レジスタ間の論理演算を実装してクロックエッジごとにレジスタを更新する方式を採用した参加者もいました。
シミュレーションにおける落とし穴(Alejandro Soto Franco の事例)
供給された波形データは、再生すべき入力シーケンスと期待出力を示しています。同一のシミュレータを用いれば候補盤面を検証し、出力生成ロジックを走らせて解答を読み出すことも可能です。しかし、その波形に一致しても必ずしもシミュレータが正しいとは限りません。
- 問題点: Alejandro Soto Franco 氏は、すべての Tie-High セルを正しく処理せずにとも提供されたトレースを再現する Python モデルを作成しました。これらのセルは一定値「1」を出力すべきところ、そのモデルでは評価を実行せず出力をゼロに保っていました。
- 結果: このミスの結果、隣接チェック機能が実質的に無効化されてしまいました。このモデルを利用した参加者は、星が接触しているにもかかわらず有効な盤面を発見できてしまいました(「偽の正解」)。
- 発見プロセス: Alejandro 氏は、この Python モデルと追加の入力に対する独立した Icarus Verilog シミュレーションを比較することで問題を発見しました。
3. 論理の追跡による解析
一般的で当社も最も期待したアプローチの一つです。「成功」出力から始めてネットリストを遡り、有効な入力の条件を特定します。
- ヒント: レイアウト内の「島(アイランド)」ごとに、元の RTL デザインの各モジュールに対応しているため、当社は意図的にそのヒントを残しておきました。
- 事例(Sanjay Ravishankar) この特徴を活かし、各領域の上に境界ボックスを描画し、その後回路図をそれらのボックスに基づいて分割しました。モジュール間の接続性を確認して境界を検証した後、各モジュールをシミュレートしてその動作や全体像における役割を特定しました。
4. 動的探索によるアプローチ
回路自体の論理関数に過度にこだわりすぎることなく、異なる入力を与えてチップをシミュレーションし、中間信号の変化を観察する方法です。
- 事例(Aaron Shi) 「ネットリストを一つのシステムとして扱い、様々な位置からインパルスを加え、その後全ゼロの基準状態との差分を各フリップフロップに対して計算した」と述べています。変化するフリップフロップが各行・各列・各領域に対応していることを観察し、これらがいずれも正確に 2 つまで集約される必要があることに気づき、成功条件を満たす解答グリッドを構築しました。
5. SAT ソルバーを利用した手法
回路の動作内容を知らずに SAT ソルバーを用いて正解を見つけるという方法です。
- 長所: 固定されたサイクル数でエンコードされた回路に対し、特定の条件(本例では成功出力)が真になるようにする入力セットを計算できます。
- 短所: チップの内側仕組みの詳細についてはあまり明らかにせず、目的の出力状態に至るための必要十分な入力のみを示します。
- 事例(Lokesh Aravapalli) 両方の利点を兼ね備えた画期的なアプローチを提案しました。まず SAT ソルバーを用いて有効な入力セットを取得し、その後それを元に回路自体の目的を分析・理解するとともに、回路の美しい可視化も作成しました。
6. 出力生成器の解読
想定外の解決法として、出力モジュールから直接解答文字列を抽出しようとした参加者がいました。
- 仕組み: チップには盤面の「チェックサム」を計算するLFSR2を備え、解答文字列と XOR 処理後に ROM に格納していました(単純な回路書き換えでは出力がごちゃごちゃしてしまいます)。
- 事例(Gabriel Taboada) 出力回路をリバースエンジニアリングして、解答がどのようにエンコードされているか、そして正しい出力を得るために必要なシード値を探りました。
7. 素敵な可視化作品
リバースエンジニアリングの最も魅力的な点は、同じ課題に対していくつものユニークで異なるアプローチが存在することにあります。
- 事例(Joshua Stapleton) 階層的モジュールを超えてセル同士がどう接続されているかを両方同時に表示する「ネットリスト・レイアウトビューア」を開発しました。
- 事例(José Vargas) PMOS と NMOS トランジスタからチップがどのように構成されるかを示す、そしてそれらをレイアウトから抽出して各セルの論理関数を特定する方法を可視化した素晴らしい作品を作成しました。
- 事例(Amruth Gulawani) 手動でスターバトルパズルを楽しむ方々のために、チップにエンコードされたパズルのオンラインプレイ可能版を作成し、誤った解答時に表示されるいくつかのイースターエッグ出力も実装しています。
- ベストアンサー: Kjartan van Driel 氏が設計した、チップがどのように構成され、パズルチップ内の全ての機能が一体どのように連携しているかを美しくインタラクティブにアニメーション化した解説動画です。
8. その他にも魅力的な事例
- FPGA 実装(Alexander Smallwood)抽出したネットリストを FPGA に合成し、スイッチや LED でチップの I/O を表現することで、パズルのさらなる楽しみ方を考案しました。
- マイクラフト連携(Nikhil Kaniyeri) ネットリストをマイクラフトのコマンドブロックに変換し、ゲーム内で実際に遊べるパズルバージョンを再現する挑戦を行いました。
- アナログ検証(David Garner) 全体チップをアナログ SPICE シミュレーションにコンバートし、最終解答のアナログ領域での検証を試みました。
- ゼロ知識証明(Marcin Wójcik)自身の解答を秘匿しつつも正解を持っていることを証明できる Groth16 ゼロ知識証明を構築しました。
イースターエッグについて!
パズルには複数のイースターエッグを追加しておりました。全ての応募の中で、二人の方が意図した全部の 6 つのイースターエッグを発見し、最後の浮遊線バグを含めた場合7 つ中 6 つを見つける方が六名いました。
- 「THE NIGHT SKY AWAITS」: 「example_inputs.vcd」に含まれる 2 つのエラー試行を 7 ビット ASCII としてデコードすると、「THE NIGHT SKY AWAITS(夜空が待っている)」となります。
- リープセコンド: VCD ヘッダーの日付は「Sat Dec 31 23:59:60 2016」であり、これは実際のリープセコンドです。「$version」文字列は、波形ビューアでこのファイルを開くよう促す仕掛けになっています。
- モールス符号: ディー(チップ)の下にある未使用層に書かれた点滅パターンには、モールス符号で**「PER ARENAM AD ASTRA**(砂漠を通り越して、星へ)というフレーズが含まれています。
- 失敗メッセージ:
- 全ゼロ入力:「EMPTY SKY」
- 全一入力:「BIG BANG」
- 個数チェックはパスするが星が隣接している盤面:「TWO NOT TOUCH」(ヒント)
- その他の却下された入力:「TRY AGAIN」
- ロゴ発見: メタデータ層「met2」上の約 1,400 箇所の孤立した正方形が、57×57 ピクセルのジェーンストリートロゴを形成しています。
- 「JSC」文字: 11 の領域を描画すると、それらの形状が「JSC」という文字をなしています。
- 浮遊線バグ: 「TWO NOT TOUCH」出力経路には接続されていない配線が含まれており、これが一部の参加者がシミュレーション中に「TWO"NOT TOUCH」を見た理由です。これは当初のレイアウト上のバグでしたが、誰が発見するかを見極めるためのイースターエッグとして意図的に残しておきました!多くの参加者が浮遊する a31oi 入力まで追跡でき、いくつかのグループからは親切にバグ報告をいただきました。
まとめと教訓
AI は此类の課題にも必ず関わってくるでしょう。設計分析、ネットリスト表示、デバッグツールの構築において、AI は画期的な変化をもたらします。一部の応募者は小さなスクリプトに AI を活用し、他の参加者はエージェント全体のパズルに委ねました。パズルを着想した当初、最新モデルに対して単一のプロンプトを与えるだけで 30 分以内に最終解答が得られることも確認しました。しかし、これはパズルを解き進める過程から多くの面白さと学習機会を奪ってしまうものです!
また、多くの参加者は解答を得た後もさらに調査を継続しました。SAT ソルバーで勝敗を決する入力を見つけられただけでなく、「チップは何をカウントしているのか」「配線がパズルのルールをどのようにエンコードしているのか」を理解したいという好奇心から、回路の動作を説明したレポートが作成され、それが私たちにとって最も気に入った成果物の一つとなりました。
右に出るものはいないほど優れたデバッグ事例は、参加者が自らのツールを意図的に破壊しようとして生まれたものでした。提供された波形データに対して完璧に再現されるモデルであっても、内部には欠陥が存在することがあります。別の実装と比較し、失敗すべき入力を用意することで、単なる例の再生では捉えられなかったエラーを発見できました。これはパズルを超えた有益な習慣であり、特に AI がツール構築を人間が検査する速度より迅速にできるようになるこの時代においては尤も重要です。
チップをバラば取りました皆様、そして次の人々が続いて追随できるように十分な詳細でプロセスをレポートしていただいた方々へ心から感謝申し上げます。
チップの解体を楽しんでいただけましたら、是非当社の「プロトコルエミュレータ ASIC コンペティション」に参加してみてください。
- 課題: UART や SPI、I2Cなどのプロトコルを処理でき、ファブ後でも新しいプロトカルに対応できる柔軟性を備えたオープンソース・プログラム可能なチップを設計することです。
- 支援: 当社では気に入られた設計のファブ費用を支援し、優勝者には実際のシリコン上でテストを行うためのチップと開発ボードを提供いたします。
- 応募締切: 2027 年 1 月 18 日
Jane Street のハードウェアチームについて
Jane Street のハードウェアチームでは、世界中で最も高速なトレーディングシステムのいくつかを実行する FPGA と ASIC を設計しています。日常業務もまさにこのようなパズルに満ちており、ゲートの海やタイミングレポート、波形図に目をつむり、じっくりと本当の仕組みを解き明かしていく作業は非常に魅力的です。こうした問題は解決することに深い満足感を与え、正直申し上げて、当社の従業員がここで働きたいと思う大きな理由の一つでもあります。
もしこのような仕事に興味を持たれた場合は、以下を通じてさらに詳しくご学願ください:
- 採用情報: ハードウェア(FPGA および ASIC)インターンシップや正社員ポジションのご紹介ページをご覧ください。
- Open Source: オープンソース OCaml ハードウェア設計ライブラリである「Hardcaml」についての記事をご覧ください。
- 学術分野: 訪問研究者プログラムまたは大学院フェローシッププログラムについての記事をご覧ください。
もし単に情報交換したい場合は、こちらのフォームにご記入ください。