はじめに
筆者は、自分自身の勉強目的で、Claude Code を使って、mrun(仮) というSystemVerilogシミュレータを6月中旬から開発中です。
いずれ公開するつもりですが、現時点の開発状況(途中経過)を紹介させていただきます。
開発の動機
SystemVerilogは、ハードウェア記述言語として広く使われていますが、商用シミュレータは高価で、オープンソースの選択肢も限られています。そこで、以下の目標を掲げて開発を始めました:
- 自分自身の勉強目的
- どうせなら C++23 で実装したい
- SystemVerilog の、ほとんどの主要機能をサポートしたい
Claude Codeとの開発体験
AIペアプログラミングの威力
ほんの2週間ほどですが、Claude Codeと二人三脚で開発を進めてきました。その結果、当初想定していた基本機能に関しては、現在では約90%の完成度まで到達していると思います。
開発効率の劇的な向上
Claude Codeとの協働により:
- 複雑なパーサー実装をスキップ: Slang v8.1を採用し、シミュレーションエンジンに注力
- バグの早期発見: AIがコードレビューとテストを常時実施
現在の実装状況
アーキテクチャ
実装済み機能のハイライト
1. 基本言語機能(100%実装済)
- データ型: bit, logic, reg, wire, int, real, string(128文字、Unicode対応)
- 制御構造: if/else, case, for, while, foreach, repeat
- 演算子: 算術、論理、ビット、比較、縮約演算子
2. 高度な機能
- オブジェクト指向: クラス、継承、パラメータ化クラス(90%)
- 動的データ型: 動的配列、連想配列、キュー(100%)
- SystemVerilog Assertions: 即時アサーション(100%)
- 機能カバレッジ: covergroup、coverpoint(80%)
- 制約付きランダム検証: rand/randc、constraint(70%)
3. システムタスク
// 完全実装済み
$display, $write // %d, %h, %b, %s, %m など全フォーマット対応
$sformatf // 文字列フォーマット
$finish, $time // シミュレーション制御
$random, $urandom // 乱数生成
$fopen, $fclose // ファイルI/O
$fwrite, $fdisplay // ファイル出力
$dumpfile, $dumpvars // VCD波形出力
4. 最新追加した実装( 2025年6月26日 )
- 波形ダンプ機能: VCDフォーマット完全対応
- %mフォーマッタ: 階層パス表示
- foreach文: 配列反復処理
- $fscanf: フォーマット付きファイル入力(実装中)
パフォーマンス特性
- 実行速度: 中規模設計で商用ツールの50-70%と予想
- メモリ効率: mimallocによる最適化
- スケーラビリティ: 数万ゲート規模まで実用的と予想
技術的な特徴
1. バイトコードインタープリタ
256個の基本オペコード + 拡張オペコードによる効率的な実行:
enum class OpCode : uint8_t {
// 制御フロー
NOP = 0x00, HALT = 0x01, JUMP = 0x02,
// ネット/定数操作
LOAD_NET_VAL = 0x10, STORE_BA = 0x11, STORE_NBA = 0x12,
// 算術演算
ADD = 0x30, SUB = 0x31, MUL = 0x32,
// システムタスク
SYSCALL_DISPLAY = 0x70, SYSCALL_DUMPVARS = 0x76,
// 高度な制御
FOREACH_START = 0xDC, FOREACH_END = 0xDD,
};
2. 4値論理の完全サポート
class Value {
// 0, 1, X, Z の各ビット表現
// 任意ビット幅サポート(1~数千ビット)
// 効率的なメモリ管理と演算実装
};
3. IEEE 1800準拠のスケジューラ
- Active, Inactive, NBA, Observed, Reactiveリージョン
- 正確なデルタサイクル管理
- イベント駆動シミュレーション
開発環境とビルド
要件
- 開発環境: Ubuntu 24.04.1LTS + Claude Code, Google Test, CMake, clang-format, clang-tidy, Sanitizers, Gitleaks, Git, GitHub Actions, ccache, 他
- コンパイラ: GCC 14+ と Clang 18+ の両方に対応
- C++標準: C++23
- 依存ライブラリ: Slang v8.1, fmt, Google Test, mimalloc
ビルド手順
cd mrun
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make -j16
使用例
# 基本的な実行
mrun design.sv
# 波形出力付き
mrun design.sv --dump-vars --dump-file output.vcd
# デバッグモード
mrun design.sv --debug --log-level=debug
Claude Codeとの開発で学んだこと
1. 効果的な対話のコツ
- 明確な要件定義: 実装したい機能を具体的に仕様書として最初に作成
- 段階的な実装: 大きな機能を小さなステップに分割
- テスト駆動: テストケースを先に作成してから実装
2. AIの強みを活かす
- ドキュメント作成: 包括的な仕様書の自動作成(この記事の雛形を含む)
- エラーメッセージの改善: ユーザーフレンドリーなメッセージ設計
3. 人間の判断が重要な部分
- アーキテクチャ設計: 全体の方向性は人間(私)が決定しています
- 外部ライブラリの選定: Slang採用の決定
今後の展望
短期目標(今後、数日程度で達成可能と予想)
- $fscanfのスタックエラー修正
- do-while文の完全実装
- inside演算子の実装
- unique/priority case修飾子
中期目標(2~4週間程度と予想)
- 高度な検証機能の内、実装が簡単なもの
- UVM対応
- DPI/VPIのサポート
長期目標(数か月程度と予想)
- 高度な検証機能のすべて
- マルチスレッドシミュレーション
まとめ
Claude Codeとの開発で、当初の目標を超える成果を達成できました。mrunは既に以下の特徴を持つ入門レベルの実用的なツールに成長しています:
- ✅ SystemVerilog基本機能の90%程度の実装
- ✅ VCD波形出力機能
- ✅ 高度な検証機能の一部分
AIペアプログラミングにより、個人プロジェクトでもローエンドの入門レベルの商用ツールに匹敵するソフトウェアを短期間で開発できることが確認できました。
謝辞
Slang(Mike Popoloski氏が開発)をはじめとするオープンソースコミュニティに感謝いたします。
注: mrunはまだ開発中のため、本記事の内容は変更される可能性があります。正式リリース時にはGitHubで公開予定です。