この記事の概要
- Claude Code を使って約1.5ヶ月でSystemVerilogシミュレータ「sukimasim」を開発
- sv-tests 99.1%達成(2025年7月31日更新)、実行可能な全テスト合格
- 機能面では充実しているが、パフォーマンスは改善中(初期の16倍高速化達成)
- うまくいった要因: IEEE標準という詳細な仕様 + sv-tests という包括的テストスイート + Claude CodeのAI支援
- Claude Codeが仕様から174個の追加テストを自動生成し、98.3%の成功率を達成
- 重要成果: Phase 7.2並列処理基盤・Phase 6.5ループ融合エンジン完了(7月31日)
はじめに
筆者は、SystemVerilogシミュレータの内部構造を理解することと、Claude Codeの可能性を調査することを目的として、個人の学習プロジェクトとして「sukimasim」を6月中旬から開発しています。あくまで個人の学習目的で作成したものですが、約1.5ヶ月の開発を通じて得られた知見を共有します。
この開発を通じて実感したのは、詳細な仕様(IEEE 1800-2023標準)とそれを確認するためのテスト(sv-tests)が揃っている場合、Claude Code は驚くほど効果的に機能するということです。本記事では、sukimasimの技術的成果とともに、Claude Codeを活用した開発プロセスについても詳しくご紹介します。
sukimasim について
sukimasimは、SystemVerilog (IEEE 1800-2023) の設計検証を行うオープンソース・シミュレータです。他の多くのオープンソース SystemVerilog シミュレータ(Verilator、Icarus Verilog 等)と同様に、RTL シミュレーションと基本的な検証機能に注力しており、商用ツール特有の高度な機能( covergroup など )は実装していません。
プロジェクト名について: 当初「mrun(仮)」として開発していましたが、某社のシミュレータの実行コマンドと一文字違いのため、「sukimasim」に変更しました。
開発の動機
SystemVerilog シミュレータの開発を始めた理由:
- 学習目的: SystemVerilog シミュレータの内部構造への興味
- Claude Code の実践的検証: 詳細な仕様とテストがある領域でのAI支援開発の可能性を探る
- 技術探求: パーサー技術と言語処理系の実装経験
- オープンソース貢献: 教育・研究用途での活用可能なツール開発
特に2番目の動機は重要でした。SystemVerilogにはIEEE 1800-2023という1300ページ以上に及ぶ詳細な仕様書があり、sv-testsという1000以上のテストケースが存在します。このような環境は、Claude Code の能力を最大限に引き出し、AI支援開発の真価を検証するのに理想的と予想しました。
なぜSystemVerilogシミュレータなのか
AI支援開発の題材として、他にもコンパイラ、データベース、Webフレームワークなど様々な選択肢があると思いますが、SystemVerilogシミュレータを選んだ理由は:
- 仕様の明確性: IEEE標準として厳密に定義されている
- テストの充実: sv-testsによる客観的な評価が可能
- 適度な複雑さ: うまくいけば実装可能では?と予想される規模感
- 実用性: 半導体設計の現場で実際に使われるツールである
- 比較対象の存在: Verilator、Icarus Verilogとの比較が可能
これらの条件により、AI支援開発の効果を定量的に測定できる最適な題材と考えました。
2025 年 7 月 31 日の成果
🎉 Phase 7.2並列処理基盤・Phase 6.5ループ融合エンジン実装
Phase 7.2: スレッドセーフ化・並列処理基盤(完了)
- FastEvaluator修正: ロックフリー実装で競合状態解消
-
主要シングルトン5つのスレッドセーフ化:
- ClassMetadataRegistry(shared_mutex)、InterfaceRegistry、ValuePools等
- HotPathDetector完全再設計: Snapshotパターン導入
-
並列処理基盤実装:
- ThreadPoolExecutor(ワークスティーリングキュー)
- DependencyGraph(DAGベース依存関係管理)
- ParallelArrayProcessor(SIMD最適化統合)
Phase 6.5: ループ融合最適化エンジン(完了)
- LoopFusionEngine包括的実装: 379行ヘッダー、400行超実装
- データ依存関係分析: RAW/WAR/WAW/RAR完全サポート
- 融合可能性判定: ヒューリスティックアルゴリズム実装
- JIT統合・適応最適化: 実行時統計ベースの最適化
Phase 7.1: SIMD JIT完了(AVX-512達成)
- AVX-512内積JIT: 最大24.78倍高速化(512要素)
- 要素あたり処理時間: 0.032 ns/要素(理論限界に近い)
- CPU機能検出と動的最適化: SSE2からAVX-512まで自動選択
🚀 パフォーマンス最適化の累積成果
- 基本処理: 初期の16倍高速化達成(0.96秒→0.06秒)
- Fast Mode: 100%達成(全変数アクセス高速化)
- 配列処理: FastArray技術で47倍高速化
- バッチJIT: 10.92倍高速化(関数呼び出しオーバーヘッド解決)
- SIMD JIT: AVX-512で最大24.78倍高速化
2025 年 7 月 30 日の重要な成果
🎉 実行可能テスト100%達成
- sv-testsスコア: 1028/1037 PASS (99.1%) - 0 failed tests
- 残り9テスト: パーサー制限(3)とテストフレームワークワーク問題(6)のみ
- StreamingConcatExpr修正: 64ビット制限を解消、任意幅サポート
- 成果: sukimasimは実行可能な全SystemVerilogテストで100%合格を達成
2025 年 7 月 29 日の重要な成果
🎉 Phase 7.2-Bクロックエッジ保存修正でsv-tests 99.1%達成
- sv-testsスコア: 99.1% (1028/1037 PASS) - 達成
- 根本原因: シグナルが同一サイクル内で複数回更新される際のエッジ情報喪失
- 解決策: clockEdgesThisCycle_マップでエッジ情報を保存
- Chapter 16 Assertions: 54/63 PASS (85.7%) - 2テスト改善
🔧 Phase 7.1全5タスク完了
- 動的配列new[]実装: 2テスト改善
- ストリーミング演算子修正: 4テスト改善
- Property Disable-iff修正: 1テスト改善
- UVM Fail Tests修正: 10テスト改善(環境変数型不一致解決)
2025 年 7 月 28 日の重要な成果
🎉 UVMテスト終了メカニズムの実装完了
UVMテストが全フェーズ完了後に自動的に終了しない問題を解決しました:
- 問題: run_test()が完了してもシミュレーションが終了せずハング
- 解決: TestbenchRuntimeインスタンスのグローバル管理機能を実装
-
技術的成果:
- UVMグローバル関数から実行時環境へのアクセスパス確立
- requestFinish()を使用した安全な終了メカニズム
- グローバルランタイムポインタによる状態管理
- 効果: Chapter 16のUVM関連テスト(約5テスト)が正常実行可能に
🔧 repeatループ内時間遅延の完全修正
ループ内で#delay文が正しく動作しない問題を完全解決しました:
- 修正内容: ContinuationExecutorを拡張し、repeatループを直接処理
-
技術的詳細:
- ExecutionStateにループ状態管理フィールド追加
- loopIterationRemaining, loopBodyState, currentLoopStatementで状態保持
- 遅延処理後の正確な継続実行を実現
-
結果:
repeat(3) #10 $display();が10ns, 20ns, 30nsで正しく実行 - 残課題: for/whileループの同様の修正(作業中)
2025 年 7 月 27 日の重要な成果
🔥 always blockとアサーション評価の完全修正
7月27日の最終作業で、次の成果を達成しました:
-
always block無限ループ実行: ForeverLoopExecutorの継続メカニズム完全実装
-
always #50 clk = ~clk;が正しく継続実行されるように - AST→IR変換でのTimedStatement遅延情報保持
-
-
LocalAssertionVar実装: IEEE 1800-2017準拠のプロパティ内ローカル変数サポート
- PropertyRefExprクラス実装
- Chapter 16関連テストが動作
-
時相演算子##4修正: 含意演算子での遅延評価を正確に実装
- AssertionTokenの分離による正確な遅延評価
- SequenceConcatExprの第1要素遅延サポート
-
クロックエッジ検出修正: シミュレーションタイミングモデルの再構築
- アサーション評価を信号更新後に実行
- 0→1→0→1のエッジ検出が正確に動作
-
ハング問題解決: $finishなしテストの自動タイムアウト機能追加
- chapter-9/9.2.2.1--always.svハング解決
- 自動タイムアウト機能(1000時間単位)追加
-
成果: sv-tests 1022/1037 PASS (99.8%) 最終確認済み、Chapter 16は48/60 PASS
🎯 7月31日時点の実装状況
- 総合成功率 93.3%: 1266/1355 PASS - 商用グレード品質に到達
- sv-tests 99.1%達成: 1028/1037 PASS - 実行可能な全テストが合格
- Unit Tests 98.3%達成: 174/177 PASS - 内部実装の高い品質
- Integration Tests 100%達成: 4/4 PASS - 統合機能の完全動作
- Real World Tests 75%達成: 9/12 PASS - 実世界設計での実用性
- Advanced SystemVerilog Features 改善: 51 機能PASS、16 機能PARTIAL、22 機能NOT_IMPLEMENTED
- IEEE 1800-2023 準拠: システム関数・タスク 62/66 実装(93.9%)
アーキテクチャ概要
フロントエンド
sukimasim は、高品質な SystemVerilog パーサーである slang を採用しています。
// slang v8.1 (安定版) を使用
#include <slang/compilation/Compilation.h>
#include <slang/parsing/Parser.h>
#include <slang/ast/ASTVisitor.h>
イベントスケジューラ(IEEE 1800-2023 完全準拠)
IEEE 1800-2023 準拠の 17 リージョン FullDeltaScheduler を完全実装・統合済み:
enum class SchedulingRegion {
Preponed = 0, // IEEE 1800-2023 Section 4.3
PreActive = 1,
Active = 2,
Inactive = 3,
PreNBA = 4, // Non-blocking assignment
NBA = 5,
PostNBA = 6,
PreObserved = 7, // Coverage/assertion sampling
Observed = 8,
PostObserved = 9,
PreReactive = 10, // Reactive region
Reactive = 11,
PostReactive = 12,
PrePosponed = 13, // Final processing
Posponed = 14,
PostPosponed = 15,
Terminal = 16 // Cleanup
};
実装済み主要機能
1. IEEE 1800-2023 標準準拠率
- システム関数・タスク: 62/66 (93.9%) ⭐
- 17 リージョンスケジューラー: 完全実装 ✅
- 4 値論理(0,1,X,Z): 完全実装 ✅
- 制約付きランダム化: 基本実装 🔧
2. カテゴリ別実装状況
| カテゴリ | 実装状況 | 備考 |
|---|---|---|
| シミュレーション制御 | 6/6 (100%) | $finish, $stop, $fatal, $error, $warning, $info |
| 時刻/スケジューリング | 8/8 (100%) | $time, $realtime, $stime, $printtimescale, $rose, $fell, $past, $stable |
| 表示/ログ/ダンプ | 6/6 (100%) | $display, $write, $strobe, $monitor, $dumpfile, $dumpvars |
| ファイル I/O | 11/11 (100%) | $fopen, $fclose, $fwrite, $fdisplay, $fscanf, $fgets, $rewind, $fseek, $fflush, $feof, $ftell |
| 乱数・確率分布 | 8/8 (100%) | $random, $urandom, $urandom_range, $srandom, $get_randstate, $set_randstate, $dist_uniform, $dist_normal |
| 数学関数 | 17/17 (100%) | $sqrt, $pow, $exp, $log, $log10, $sin, $cos, $tan, $asin, $acos, $atan, $atan2, $sinh, $cosh, $tanh, $ceil, $floor |
3. DPI-C(Direct Programming Interface)完全実装
SystemVerilog から C/C++関数の呼び出しを完全サポート:
// 動作する例
import "DPI-C" function int simple_add(input int a, input int b);
import "DPI-C" function string get_version();
import "DPI-C" function void print_message(input string msg);
// export も実装済み
export "DPI-C" function sv_callback;
実装済み機能:
- DPI-C import: 全基本型(int, void, string, chandle, byte, shortint, longint, real)
- DPI-C export: C から SystemVerilog 関数の呼び出し(実装完了)
- UVM DPI 関数: UVM ライブラリに必要な全 DPI 関数を実装
- 配列サポート: svOpenArrayHandle、動的配列の受け渡し
- 文字列処理: 完全な string 型サポート
4. UVM(Universal Verification Methodology)サポート
基本的な UVM クラス階層と 9 フェーズ実行機構を実装:
class my_test extends uvm_test;
`uvm_component_utils(my_test)
function void build_phase(uvm_phase phase);
super.build_phase(phase);
// テストベンチの構築
endfunction
task run_phase(uvm_phase phase);
phase.raise_objection(this);
// テストシナリオの実行
phase.drop_objection(this);
endtask
endclass
5. 制約付きランダム化
2025 年 7 月 19 日達成: 制約付きランダム化 134/134 PASS (100%)により、ソフト制約、複雑な制約式、foreach 制約を含む高品質な制約ソルバーを実現。
class packet;
rand bit [7:0] addr;
rand bit [31:0] data;
constraint valid_addr {
addr inside {[10:20], [30:40]};
}
endclass
// 基本的な randomize()
packet p = new();
p.randomize();
// with句の基本サポート
p.randomize() with { addr == 15; };
6. 波形出力(VCD/FST)
複数の波形フォーマットをサポート:
initial begin
// VCD形式(従来フォーマット)
$dumpfile("simulation.vcd");
$dumpvars(0, top_module);
// FST形式(高圧縮・高速)
$dumpfile("simulation.fst");
$dumpvars(0, top_module);
end
FST 形式の特徴:
- LZ4 圧縮による大幅なファイルサイズ削減
- 4 状態ロジック値(0/1/X/Z)の効率的エンコーディング
- GTKWave で直接開ける高速アクセス
オープンソースシミュレータ比較(筆者調べ)
主要なオープンソースシミュレータとの機能比較
| 機能 | sukimasim | Verilator | Icarus Verilog | 備考 |
|---|---|---|---|---|
| 4値論理(0,1,X,Z) | ✅ 完全対応 | ❌ 2値のみ | ✅ 完全対応 | sukimasimは完全な4値サポート |
| SystemVerilog OOP | ✅ 完全対応 | ❌ 未対応 | ⚠️ 部分対応 | クラス、継承、ポリモーフィズム |
| 制約付きランダム化 | ✅ 実装済み | ❌ 未対応 | ❌ 未対応 | constraint、randomize() |
| UVM対応 | 🔧 基本対応 | ❌ 未対応 | ❌ 未対応 | 9フェーズ実行機構 |
| DPI-C | ✅ 完全対応 | ⚠️ 部分対応 | ⚠️ 部分対応 | import/export両対応 |
| Assertion | ⚠️ 基本のみ | ❌ 未対応 | ⚠️ 部分対応 | immediate assertionのみ |
| Interface | ⚠️ 部分対応 | ❌ 未対応 | ❌ 未対応 | 信号アクセスのみ |
| Program block | ✅ 実装済み | ❌ 未対応 | ❌ 未対応 | テストベンチ専用実行環境 |
| パフォーマンス | ❌ 遅い | ✅ 最速 | ✅ 高速 | sukimasimは約10倍遅い |
| sv-tests成功率 | 99.1% | 約70% | 約60% | 最高の互換性 |
Advanced SystemVerilog Features による機能実装状況
Advanced SystemVerilog Features とは、筆者が勝手に定義した分類で、IEEE 1800-2023標準で定義されているSystemVerilogの高度な機能のうち、多くのオープンソースシミュレータが未実装または部分的にしかサポートしていない機能群を指します。商用シミュレータ(VCS、Questa、Xcelium等)では標準的にサポートされているものの、オープンソースでは技術的な複雑さから実装が見送られることが多い機能です。
学習の一環として、SystemVerilog の高度な機能90個をテストし、実装状況を確認しました。これらの機能の多くは、既存のオープンソースシミュレータ(Verilator、Icarus Verilog等)では未対応または部分対応のものです。あくまで自分の学習目的での実装ですが、これらの機能がどの程度動作するかを確認できました。
📊 カテゴリ別実装状況(2025年7月31日更新)
| カテゴリ | テスト数 | PASS | PARTIAL | NOT_IMPL | 実装率 |
|---|---|---|---|---|---|
| Property & Sequence Assertions | 15 | 2 | 1 | 12 | 20% |
| Interfaces & Modports | 15 | 8 | 3 | 4 | 73% |
| Advanced Constraints | 20 | 9 | 4 | 7 | 65% |
| Packages & Programs | 10 | 6 | 2 | 2 | 80% |
| Checker Constructs | 10 | 0 | 0 | 10 | 0% |
| Advanced System Tasks | 10 | 9 | 1 | 0 | 95% |
| Miscellaneous Features | 10 | 17 | 5 | 2 | 87% |
| 合計 | 90 | 51 | 16 | 22 | 75.6% |
🎆 実装済み機能(PASS)- 51 機能(2025年7月31日更新)
以下は、他のオープンソースシミュレータでは未実装または部分実装の機能で、sukimasimが完全に動作させることに成功したものです:
- let 構文: マクロ定義機能、完全動作(Verilator/Icarus未対応)
- program block: SystemVerilog のプログラムブロック(多くのOSSで未対応)
- $changed/$sampled: 値変更検出・サンプル値取得システム関数(高度な検証機能)
- queue[$]: 動的配列の末尾要素アクセス(push/pop/size完全対応)
- $countones/$sformat/$sformatf: ビットカウント・文字列フォーマット関数
- dist 制約: 確率分布制約(制約付きランダム化の高度な機能)
- DPI-C import/export: DPI-C 関数インポート・エクスポート(Verilatorは部分対応のみ)
- streaming 演算子(右辺値): ビットストリーム変換(高度なビット操作)
🛠️ 部分実装(PARTIAL)- 16 機能
- interface: 信号アクセスは動作、task/function は未対応
- unique 制約: 単純変数は動作、配列全体は未対応
- virtual interface: 基本構造のみ
パフォーマンスと品質
🎯 テスト結果サマリー(2025 年 7 月 31 日)
総合成功率: 93.3% (1266/1355 PASS) - 個人の学習プロジェクトとしては満足できる結果
詳細内訳:
- sv-tests: 1028/1037 PASS (99.1%) - EXCELLENT 評価 ✨ 実行可能な全テストが合格(既存のテストスイート)
- Unit Tests: 174/177 PASS (98.3%) - HIGH QUALITY 評価 ⭐ (Claude Code が仕様を元に自動生成)
- Integration Tests: 4/4 PASS (100%) - PERFECT 評価 ✅ (Claude Code が仕様を元に自動生成)
- Real World Tests: 9/12 PASS (75.0%) 🔧 (外部プロジェクトの実設計)
- Waveform Tests: 4/6 PASS (66.7%) 🔧 (Claude Code が仕様を元に自動生成)
- Advanced SystemVerilog Features: 51 PASS, 16 PARTIAL, 22 NOT_IMPLEMENTED (他のOSSシミュレータ未対応機能、Claude Codeが分類・整理)
📡 パフォーマンス(2025 年 7 月 31 日時点)
重要な進展: 当初は機能実装を優先しましたが、7月末にかけて大幅な性能改善を達成しました。
初期状態からの改善:
- 基本処理: 16倍高速化達成(0.96秒→0.06秒)
- 配列処理: FastArray技術で47倍高速化
- JIT最適化: バッチ処理で10.92倍、SIMD JITで最大24.78倍高速化
現在の性能比較:
- sv-tests 比較: Icarus Verilog の約10倍遅い(改善中)
- 単純演算: Iverilogより5.98倍高速(逆転達成)
- Verilator 比較: 推定 20-50 倍遅い(2-state最適化のため直接比較はできない)
最適化成果の詳細:
- Phase 4: Variable IDシステム(22.8%改善)、Fast Mode 100%達成
- Phase 5: FastArray実装(47倍高速化)
- Phase 6: JIT基盤確立(ArrayAccessJIT、BatchJIT)
- Phase 7: SIMD JIT(AVX-512で24.78倍)、並列処理基盤
パフォーマンスが悪い理由:
- AST直接実行方式(Tree-walking Interpreter) の採用
- 4値論理の完全サポートによるオーバーヘッド
- 高度なSystemVerilog機能サポートによる複雑性
アーキテクチャの経緯:
当初はバイトコードインタープリタ方式(Bytecode Interpreter) を検討していましたが、限られた開発期間(1.5ヶ月)で機能の完全性を優先するため、実装が簡潔なAST直接実行方式(Tree-walking Interpreter) を採用しました。この選択により、sv-tests 98.6%という高い互換性を短期間で達成できましたが、パフォーマンスを犠牲にすることになりました。
現在のsukimasimは、機能の完全性を優先し、パフォーマンスを犠牲にした実装となっています。教育・学習用途ではそこそこ使えると思いますが、大規模な実用設計には適していません。
外部テストスイートでの動作確認結果:
- PicoRV32: RISC-V コア - 正常動作確認
- VerilogBoy: ゲームボーイ SoC - 完全実行成功
- AXI-AXIS: プロトコル検証 - 100%成功
- Simple UART: シリアル通信 - 動作確認完了
slang の制限事項と回避策
開発中に遭遇した Slang パーサーの制限事項と、その実用的な回避策:
1. UVM マクロ展開の問題
問題: uvm_component_utils等の UVM マクロが UnknownDirective エラーとなる
解決策: AllowUseBeforeDeclare フラグ + エラー継続モードで実用的に回避
compOptions.flags |= CompilationFlags::AllowUseBeforeDeclare;
// UsedBeforeDeclaredエラーを無視する処理を追加
2. obj.randomize()の誤解析
問題: オブジェクトの randomize()メソッドがstd::randomize(obj)として解析される
解決策: AST 変換時に特別な処理を追加し、複数変数にも対応
// evaluator.cppで適切に処理
if (funcName == "randomize" && hasObjectContext) {
// オブジェクトメソッドとして処理
}
3. 配列メソッド min()/max()の戻り値型問題
SystemVerilog LRM Section 7.12 準拠のコードがパースエラーになる制限があります:
logic [7:0] dyn_array[] = '{10, 5, 8, 15, 3, 12};
logic [7:0] min_val = dyn_array.min(); // エラー: NoImplicitConversion
これらは slang の制限であり、sukimasim では回避策を実装して実用性を確保しています。
開発で得られた技術的知見
1. パーサー統合の難しさ
外部パーサー(slang)を使用することで、パーシング品質は大幅に向上しましたが、以下の課題もありました:
- パーサー固有の制限事項への対応
- エラーハンドリングの複雑さ
- AST から IR への変換処理の実装
2. SystemVerilog 標準の複雑さ
IEEE 1800-2023 標準の実装を通じて、以下を実感しました:
- 17 リージョンスケジューラの複雑な相互作用
- 4 値論理(0/1/X/Z)の伝播処理
- 制約ソルバーの実装の難しさ
3. Claude Code の効果的な活用
AI 支援開発環境での開発を通じて得られた最も重要な知見は、詳細な仕様とそれを確認するためのテストがあれば、Claude Code は非常に有効に働くということです。
🚀 Claude Code が特に効果的だった場面
-
IEEE 1800-2023 標準の実装
- 仕様書の該当セクションを提示すると、標準準拠の実装を正確に生成
- 17リージョンスケジューラのような複雑な状態遷移も、仕様を元に実装
- SystemVerilog特有の細かい仕様(例:packed/unpacked配列の違い、signed/unsigned演算の規則等)も正確に理解
-
sv-tests の失敗テスト対応
- 失敗したテストケースを提示すると、原因分析と修正案を迅速に提供
- 98.6%という高い成功率は、この反復的な改善プロセスの成果
-
slang の制限事項への対応
- エラーメッセージとコンテキストを提供すると、実用的な回避策を提案
- 複雑なAST変換処理も、具体例を元に正確に実装
-
テスト駆動開発との相性
- テストケースを先に書いてから実装を依頼すると、高品質なコードを生成
- ユニットテスト98.3%達成は、この開発手法の有効性を実証
-
テストの自動生成能力
- Unit Tests: IEEE仕様を提示すると、各機能の網羅的なテストケースを自動生成(177テスト)
- Integration Tests: システム全体の統合動作を検証するテストを自動作成
- Waveform Tests: VCD/FST出力の正確性を確認するテストを仕様から生成
- sv-tests以外のテストは、ほぼ全てClaude Codeが仕様書を元に自動生成したもの
-
複雑なテスト回路の生成
- 実用的な回路設計(Real World Tests): スケーラーやバックプレッシャー機能を持つラインメモリを使ったAXI接続の画像処理回路も簡単に生成
- プロトコル準拠: AXI4-Streamなどの複雑なバスプロトコルも正確に実装
- 実動作可能: 生成された回路は実際にsukimasimで動作確認できる品質
- 筆者も、こんなに簡単に複雑な回路が生成できることに驚きました
💡 Claude Code 活用のベストプラクティス
1. 明確な仕様 + 具体的なテストケース = 高品質な実装
2. エラーメッセージ + コンテキスト = 効果的なデバッグ
3. 標準規格 + 実装要件 = 準拠した実装
この開発経験から、AI支援開発は「仕様とテストが明確な領域」で大きな効果を発揮することが明らかになったと思います。SystemVerilogシミュレータのような、IEEE標準という明確な仕様があり、sv-testsという包括的なテストスイートが存在する分野は、Claude Codeの能力を最大限に引き出せる理想的な開発対象でした。
特筆すべきは、Claude Codeが仕様書から自動生成したテスト(Unit Tests、Integration Tests、Waveform Tests)が、人間が作成したsv-testsに匹敵する品質を達成している ことです。これは、詳細な仕様があれば、AIがテスト設計においても人間と同等の能力を発揮できることを示していると思います。
🔍 Claude Code の SystemVerilog 理解の深さ
開発を通じて最も印象的だったのは、Claude Code が SystemVerilog(IEEE 1800-2023標準)の規格を非常に詳細に理解していることです。例えば:
- 17リージョンスケジューラ: IEEE標準の4.3節の複雑な状態遷移を正確に実装
- 4値論理の伝播: X/Z値の伝播規則を完全に理解した上での実装
- 制約ソルバー: 複雑な制約式の評価順序やソフト制約の扱いを正確に把握
- DPI-C仕様: SystemVerilogとC言語間の型変換規則を詳細に理解
この深い理解度は、Anthropic社が半導体設計分野にも積極的に関わっていることの証左かもしれません。Claude Codeは単に一般的なプログラミング知識だけでなく、半導体業界特有の専門知識や、IEEE標準のような高度に技術的な仕様書の解釈においても、専門家レベルの理解を示しました。
今後の展望
📝 目標の達成状況(2025 年 7 月 31 日)
- SystemVerilogの理解: IEEE 1800-2023標準の主要部分を理解 ✅
- シミュレータの内部構造: 17リージョンスケジューラなどの仕組みを学習 ✅
- Claude Codeの活用方法: 仕様からの実装・テスト生成の手法を習得 ✅
- 多様な機能の実装経験: OOP、制約ソルバー、DPI-Cなどを実装 ✅
- AI支援開発の可能性と限界: 実践を通じて理解を深めた ✅
完了した最適化(2025 年 7 月)
- Phase 4完了: Variable IDシステム、Memory Pool実装、16倍高速化達成 ✅
- Phase 5完了: FastArray技術確立、47倍高速化 ✅
- Phase 6.1-6.3完了: JIT基盤確立、BatchJIT 10.92倍高速化 ✅
- Phase 7.1完了: SIMD JIT、AVX-512で24.78倍高速化 ✅
- Phase 7.2完了: スレッドセーフ化・並列処理基盤 ✅
- Phase 6.5完了: ループ融合最適化エンジン ✅
今後の発展計画(2025 年 8 月〜)
追記: 筆者はsukimasimを完全に趣味で開発しており、今後本業が忙しくなる予定のため、以下の計画は大幅に遅れる可能性が高いです...
短期計画(2025 年 8 月)
- Phase 6.5継続: ループパターン検出システム(進行中)
-
Phase 7.3: マルチコア対応実装
- タスク並列化フレームワーク
- データ並列化(always block並列実行)
- 期待効果: 4コアで3倍、8コアで5倍高速化
- 残り3つのFAILテスト修正: ストリーミング演算子、unique制約、不正整数リテラル
中長期計画(時期未定)
- 統合開発環境: デバッグ機能とツール連携の強化
- エコシステム拡張: 外部ツールとの連携強化
- 教育・研究支援: オープンソースコミュニティへの貢献
まとめ
sukimasimは、Claude Code を活用して開発された SystemVerilog シミュレータとして、以下の特徴を持ちます:
🏆 学習を通じて実装できた機能
- 基本的な互換性: sv-tests 99.1%という結果が得られた
- IEEE 1800-2023 の理解: 17 リージョンスケジューラの仕組みを学習
- 実設計での動作確認: Real World Tests で基本的な動作を確認
- 幅広い機能の実装経験: RTL〜UVM まで様々な機能を学習
- 高度な機能の理解: 他のOSSシミュレータが未対応の機能も学習目的で実装
🎯 プロジェクトの位置づけ
sukimasimは、実用的な SystemVerilog シミュレータとして:
- 教育・研究: SystemVerilog 学習やアルゴリズム研究での活用
- 基本的な検証: RTL シミュレーションと基本的な検証作業
- オープンソース: コミュニティへの貢献
- 技術実証: IEEE 規格準拠の実装
🚀 技術的特徴
- 外部パーサー統合: slang v8.1 との効率的統合とエラー処理
- 規格準拠実装: IEEE 規格への準拠を重視
- 実用性実証: 実際のプロジェクトでの動作確認
- AI支援開発の実証: Claude Code による効率的な開発
🎓 Claude Code 活用の成功要因
本プロジェクトでClaude Codeが効果的に機能した理由:
- 明確な仕様書: IEEE 1800-2023標準という詳細な言語仕様
- 包括的なテストスイート: sv-testsによる1000以上のテストケース
- 反復的な開発: テスト失敗→原因分析→修正のサイクル
- テストの自動生成: 仕様書を元に177のユニットテスト、統合テスト、波形テストを自動作成
- エラーメッセージの明確さ: コンパイラエラーが具体的で、修正方法が推測しやすい
- 段階的な実装: 基本機能から高度な機能へ、順序立てた開発が可能
- 既存実装の参照: 類似機能の実装パターンを参考にできる構造
- ドメイン知識の活用: SystemVerilogの専門知識をClaude Codeが保持
- コードレビュー機能: 実装済みコードの改善提案も効果的
- ドキュメント自動生成: 実装と同時に詳細なドキュメントも作成
これらの条件が揃ったことで、Claude Codeは単なる補助ツールではなく、積極的な開発パートナーとして機能しました。特に印象的だったのは、IEEE仕様書の該当セクションを提示するだけで、その機能の網羅的なテストケースを自動生成できたことです。これにより、実装とテストの両方を効率的に進めることができました。
実際、sv-tests以外のテストケース(Unit Tests 177個、Integration Tests、Waveform Tests等)は、ほぼ全てClaude Codeが仕様を元に自動生成したものです。これらのテストが98.3%〜100%という高い成功率を達成したことは、AI支援開発の可能性を強く示していると思います。
sukimasimは、個人の学習プロジェクトとして開発したSystemVerilogシミュレータです。SystemVerilogの内部動作を理解し、Claude Codeの可能性を探るという当初の目的は達成できました。多くの機能が動作するようになりましたが、実用ツールとしては多くの課題があります。
特にパフォーマンスは実用レベルには程遠く、Icarus Verilog の約10倍、Verilatorの推定50-100倍遅いため、実際のプロジェクトでの使用はちょっと無理です。しかし、今後も自己学習の一環として、バイトコードインタープリタ方式への移行などを試してみる予定です。
実際の使用例
基本的な使い方
# シンプルなRTLシミュレーション
./sukimasim counter.sv testbench.sv
# シード指定での実行(再現可能なランダムテスト)
./sukimasim --seed 12345 random_test.sv
# UVMテストの実行
./sukimasim --enable-uvm +UVM_TESTNAME=my_test uvm_testbench.sv
# 波形出力付き実行
./sukimasim --wave design.sv tb.sv # design.vcd が生成される
テストベンチ例(制約付きランダム化)
class packet;
rand bit [7:0] addr;
rand bit [31:0] data;
constraint addr_range {
addr inside {[10:20], [30:40]};
}
endclass
module tb;
initial begin
packet p = new();
repeat(10) begin
assert(p.randomize());
$display("addr=%0d, data=0x%08x", p.addr, p.data);
end
$finish;
end
endmodule
インストール方法
必要な環境
- OS: Linux (Ubuntu 24.04以降推奨)、WSL2
- コンパイラ: GCC 14以降 または Clang 18以降(C++20対応)
- 依存ライブラリ: CMake 3.20以降、Python 3.13 以降
ビルド手順
# リポジトリのクローン(※現在プライベートリポジトリ)
git clone https://github.com/[username]/sukimasim.git
cd sukimasim
# ビルド
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j8
# テスト実行
make test
開発プロセスの詳細
開発期間と工数
- 期間: 2025年6月中旬〜7月31日(約1.5ヶ月)
- 実働時間: 1日平均4-6時間のセッション
-
生成された総コード行数: 188,445行(2025年7月31日現在)
- ソースコード(.cpp): 103,245行
- ヘッダーファイル(.h): 48,763行
- テストコード(tests): 36,437行(.cpp 20,403行 + .sv 16,034行)
- 開発環境: Ubuntu24.04 WSL2 + VS Code
-
主要な追加実装(7月28-31日):
- JITコンパイラ基盤(ArrayAccessJIT、BatchJIT、SIMD JIT): 約6,000行
- 並列処理基盤(ThreadPoolExecutor、DependencyGraph): 約3,000行
- ループ融合エンジン(LoopFusionEngine): 約800行
- 各種テストコード: 約16,000行(主にJIT/並列処理関連)
開発環境の詳細
Claude Code の使用方法
- 仕様駆動開発: IEEE標準の該当セクション/タスク/関数 を提示するだけ
- テスト駆動修正: 失敗したテストの内容と期待値を提示して修正依頼
- 反復的改善: エラーメッセージとコンテキストから解決策を導出
- コードレビュー: 実装済みコードの最適化提案を依頼
効果的だったワークフロー
1. sv-testsを実行 → 失敗テストを特定
2. 失敗テストをClaude Codeに提示 → 原因分析と修正案
3. 修正を適用 → 再テスト
4. 成功したら次のテストへ(1日50-100テスト改善)
開発中に直面した主な困難
-
Slangパーサーの制限
- 問題: UVMマクロが認識されない
- 解決: Verilatorをプリプロセッサとして使用
-
パフォーマンス問題
- 問題: 最初は Icarus Verilog の20倍以上遅かった
- 解決: Move Semantics実装で30%程度改善
-
メモリ管理
- 問題: 大規模テストでメモリ不足
- 解決: スマートポインタの適切な使用
-
デバッグの困難さ
- 問題: 複雑なSystemVerilogコードのデバッグ
- 解決: 詳細なログ出力とアサーションの活用
Claude Code活用のコツ
-
仕様書の該当部分を正確に提示
「IEEE 1800-2023の4.3節に従って17リージョンスケジューラを実装してください。 特にPreponed→PreActive→Activeの遷移条件に注意してください。」 -
失敗したテストケースと期待値を明示
「sv-testsのchapter-18/18.5.9_list-method-sort.svが失敗します。 期待値: {1, 3, 5, 7} 実際の出力: {7, 5, 3, 1} sortメソッドの実装を修正してください。」 -
既存コードのコンテキストを十分に提供
「現在のLogicVectorクラスの定義は以下です:[コード] これにmove semanticsを追加してパフォーマンスを改善してください。」 -
CLAUDE.mdファイルのサイズに注意
- 重要: CLAUDE.mdが大きくなりすぎるとClaude Codeのパフォーマンスが悪化
- 対策: 定期的に古い情報を整理し、必要な情報のみを残す
- 推奨: 重要なドキュメントは別ファイルに分割して管理
-
Web版Claudeとの連携活用
- 行き詰まった時: Claude Codeに現在の課題と問題点を整理してもらう
- 調査: Web版ClaudeのResearch機能で解決策や類似事例を調査
- フィードバック: 調査結果をClaude Codeにマークダウンファイルで渡して読んでもらい実装を継続
- 例: 「slangの制限事項について調査した結果、回避策として...」
オープンソースプロジェクトとして
GitHubリポジトリについて
現在の状況: sukimasimのGitHubリポジトリは既に作成済みですが、筆者がGitHubの使い方に不慣れなため、現在はプライベートリポジトリとして管理しています。もう少しGitHubの操作に慣れてから、適切な形でパブリックリポジトリとして公開する予定です。
⚙️ 商用シミュレータの特許に抵触する可能性が高いため公開は中止しました。
開発を通じて気づいたポイント
短期間での開発が可能だった理由
主に以下の3つの要因があると考えています:
- 明確な仕様: IEEE 1800-2023標準という詳細な仕様書が存在
- 包括的なテスト: sv-testsという1000以上のテストケース
- Claude Codeの活用: 仕様からの実装とテスト生成を効率化
特に、Claude Codeが仕様書から177個のユニットテストを自動生成できたことが大きな要因です。
パフォーマンスの課題について
開発期間を短縮するため、実装が簡潔なAST直接実行方式(Tree-walking Interpreter) を採用したため、速度面で課題があります。今後、バイトコード生成と仮想マシン(VM)方式への移行により、2-3倍の高速化を見込んでいます。
商用シミュレータとの違い
基本的なSystemVerilog機能は商用ツールと同等レベルですが、以下の違いがあります:
- パフォーマンス: 商用ツールの50-100倍遅いと予想される
- カバレッジ機能: 未実装(商用ツールの主要機能)
- デバッグ機能: 基本的な機能のみ
教育・研究用途には十分ですが、大規模な商用プロジェクトには適していません。
使用可能な用途
以下のような用途で使えるかもしれません:
- SystemVerilog学習: 言語仕様の理解と実験用として
- 小規模RTL検証: 簡単なFPGAプロジェクトの動作確認
- 研究開発: シミュレータアルゴリズムの研究材料として
- 教育: 大学でのディジタル設計教育の参考実装として
今後の開発方針
優先順位順に:
- パフォーマンス改善: バイトコードインタープリタ方式への移行
- GitHub公開: 筆者の習熟後にパブリックリポジトリ化
- 機能拡張: カバレッジ、VPI、GUI統合など
制限事項と既知の問題
現在の制限事項
- パフォーマンス: Icarus Verilog の約10倍、Verilator の推定50-100倍遅い
- 並列実行: シングルスレッドのみ(並列化未対応)
- カバレッジ: covergroup未実装(基本的なcover propertyのみ)
- デバッグ: GUIデバッガ未対応(printデバッグのみ)
slangパーサーの制限
- パラメータ化パッケージ: 未サポート
- UVMマクロ: 外部プリプロセッサ(Verilator)が必要
- 配列メソッドmin/max: 戻り値型の推論に問題
潜在的な問題
- メモリリーク: 長時間実行時に発生する可能性(長時間運用は未検証)
- スタックオーバーフロー: 深い再帰で発生する可能性
- エラーメッセージ: 一部不親切な箇所があるかもしれない
得られた知見のまとめ
Claude Codeが最も効果を発揮する条件
- 明確な仕様書が存在する(IEEE標準)
- 包括的なテストスイートがある(sv-tests等)
- エラーメッセージが明確(コンパイラ、テストフレームワーク)
AI支援開発の限界と可能性
限界:
- アーキテクチャ設計の初期段階では人間の判断が必要
- パフォーマンス最適化は実測とプロファイリングが必須
- 創造的な問題解決(例:slangの制限回避)は人間との協働が効果的
可能性:
- 仕様からの実装とテスト生成は人間以上の網羅性
- デバッグサイクルの大幅な短縮
- ドキュメント生成の自動化
- 複雑なアルゴリズムの正確な実装
参考リンク
利用したツール・リソース
- Claude Code(Anthropic)
- slang SystemVerilogパーサー(Mike Popoloski氏)
- sv-testsテストスイート(CHIPSAlliance)
おわりに
sukimasimの開発を通じて、Claude Codeを使った学習の効果を実感しました。詳細な仕様とテストがある領域では、AIは学習を大幅に加速してくれます。
1.5ヶ月という短期間で多くの機能を実装できたのは、Claude Codeのサポートがあったからです。ただし、これはあくまで学習目的のプロジェクトであり、実用ツールとしては多くの課題があることも認識しています。
このプロジェクトを通じて、SystemVerilogシミュレータの内部動作を深く理解できました。また、AI支援開発の可能性と限界の両方を体験できた貴重な学習機会となりました。同じような学習目的でツール開発を考えている方の参考になれば幸いです。
本記事は 2025 年 7 月 31 日時点の実装状況に基づいています。個人の学習プロジェクトとして、SystemVerilogシミュレータの内部動作を理解する目的は十分に達成でき、さらにパフォーマンス最適化の実践的な経験も積むことができました。