ジェーンストリートのリバースエンジニアリングチャレンジを解決する
概要
- Jane StreetのASICリバースエンジニアリングチャレンジへの挑戦記
- GDSファイル解析から回路抽出までの試行錯誤
- 独自ツール開発や多くの遠回りを経て解決への道筋を記録
- 回路要素の特定とシミュレーションによる動作検証
- バリデーション問題やバグ対応の苦労も詳細に記述
Jane StreetのASICチャレンジに挑戦した話
- Jane Streetが定期的に出す 技術チャレンジ への参加記録
- 今回は ASIC(Application-Specific Integrated Circuit) のリバースエンジニアリング課題
- GDSファイルから チップ動作の解析 を目指す内容
- ウォームアップ課題と本番課題の2部構成
ファイル構造と初期調査
- GDSファイルには 回路設計情報 が記録
- ‘clk’(クロック)、‘rst’(リセット)、‘VGND’(グランド)、‘VPWR’(電源)などの 基本信号名 を確認
- sky130_fd_sc_hd__などの セル名 から論理素子を推測
- Pythonの gdstkライブラリ でGDSファイルを解析し、ウォームアップ課題で27要素を検出
シミュレーションデータの発見
- メイン課題には VCDファイル (シミュレーション入出力)が付属
- ASCII文字列らしき出力(例:‘TRY AGAIN’)をC言語で抽出
- 回路に メッセージ埋め込み があることを発見
独自ツール開発の遠回り
- 独自の 回路シミュレータ をsqlite3で作成
- Pythonでの回路設計の難しさに気付き、 専用ハードウェア記述言語 のパーサーも自作
- テスト用ハーネスやGDSビューアも自作したが、結局公式GDS Viewerを利用
- 多くの 遠回りと時間消費 を経験
回路構造の理解と抽出
- GDSファイルは 多層構造 で、各層に素材や配線情報が記録
- gdstkで SVG出力 し、セルのI/O位置を特定
- sky130の 公式ドキュメント で各素子の機能を確認、I/Oマッピングに活用
- セルの重なり判定で 回路接続グラフ を構築
回路抽出とシミュレーション
- 約1,000本の配線と17,000ポリゴンから 接続判定アルゴリズム を作成
- 配線の 統合・簡略化 で処理効率化
- Verilog形式 で回路記述を出力し、シミュレーションで動作検証
- ウォームアップ課題では シフトレジスタ、加算器、比較器 など主要素を特定
- 入力値を調整し、比較器の条件(合計496)を満たすことで出力を確認
本番課題への挑戦
- 本番は 要素数・種類ともに大幅増加 (約10,000要素、81種類)
- ウォームアップのスクリプトを流用しつつ、 新規素子の実装 を手動で追加
- 配線収集処理の 高速化 で効率向上
- バリデーション(検証)機能 の一時無効化で進捗優先
バグ対応と検証
- バリデーション再開時に 未接続ワイヤ の存在を検出
- シミュレーション上で値が不定となるワイヤの調査
- ピン検出ロジックの見直し と視覚的な回路確認
ASICリバースエンジニアリングの教訓
- 独自ツール開発 は学びが多いが、効率面では公式ツール活用が有効
- ドキュメントや既存ライブラリの 積極活用 が重要
- 回路抽出やシミュレーションには 地道なバグ修正 が不可欠
- 複雑な回路 でも分解・可視化・シミュレーションで理解が進む
- 最終的には 粘り強さと細かい検証作業 が成果に繋がる
まとめ
- Jane StreetのASICチャレンジは 技術的好奇心 と 忍耐力 が試される課題
- 遠回りや失敗も含めて、 実践的な学びと達成感 を得られる貴重な体験