Claude Code を使ってSystemVerilogシミュレータ を開発してみた 1

---

## はじめに

筆者は、自分自身の勉強目的で、Claude Code を使って、mrun(仮) というSystemVerilogシミュレータを約一週間前から開発中です。
いずれ公開するつもりですが、現時点の開発状況をVerilatorと比較する形で紹介させていただきます。なお、Verilatorについて詳しくは[前回の記事](https://qiita.com/sukimaengineer/items/e4ccaeb7aa3ac874d6da)を参照ください。

---
## 概要
mrun(仮)とVerilatorは、どちらもSystemVerilogシミュレータですが、設計思想と対象用途が大きく異なります。

- Verilator : 合成可能なRTLの高速機能検証に特化。C++にトランスパイルすることで高速実行を実現。
- mrun(仮) : SystemVerilog言語仕様の完全な実装を目指す。検証環境構築や言語学習に適したインタープリタ型シミュレータ。そのほぼ 100% のコードを Claude Code を使って作成中。

## 詳細機能比較表

### 基本アーキテクチャ

| 機能 | mrun(仮) | Verilator v5.036 | 備考 |
|------|------|------------------|------|
| 実行方式 | インタープリタ（バイトコード） | トランスパイル（C++変換） | Verilatorは高速だが再コンパイルが必要 |
| シミュレーション方式 | イベント駆動 | サイクルベース | mrun(仮)は詳細なタイミング制御が可能 |
| 4値論理サポート | ◯ 完全対応 | △ 2値主体 | mrun(仮)はX/Z/強弱を完全サポート |
| コンパイル時間 | ◯ 高速 | △ 大規模設計で遅い | mrun(仮)は即座に実行開始可能 |
| 実行速度 | △ 中速 | ◯ 超高速 | Verilatorは商用ツールに匹敵する速度 |

### SystemVerilog言語機能

#### データ型・構造

| 機能 | mrun(仮) | Verilator | mrunの実装状況 |
|------|------|-----------|----------------|
| `logic`, `bit` | ◯ | ◯ | 4値/2値完全対応 |
| `enum` | ◯ | ◯ | 完全実装 |
| `struct` (packed) | ◯ | ◯ | 完全実装 |
| `struct` (unpacked) | ◯ | △ 制限あり | 完全実装 |
| `union` | ◯ | △ | 完全実装 |
| 固定長配列 | ◯ | ◯ | 多次元配列も対応 |
| 動的配列 | ◯ | △ 基本のみ | push/pop等メソッド実装済 |
| 連想配列 | ◯ | △ delete()なし | 全メソッド実装済 |
| キュー | ◯ | △ | push_front/back等実装済 |
| `string` | ◯ | ◯ | 完全実装 |

#### タイミング制御

| 機能 | mrun(仮) | Verilator | mrun(仮)の実装状況 |
|------|------|-----------|----------------|
| `#delay` | ◯ | △ --timingのみ | タイムホイール実装済 |
| `@(posedge/negedge)` | ◯ | △ クロックのみ推奨 | エッジ検出完全実装 |
| `@(a or b)` | ◯ | △ 制限あり | EventExpression実装済 |
| `wait(condition)` | ◯ | △ --timingのみ | 条件待機・再評価実装済 |
| `fork/join` | ◯ | △ 安定性向上中 | 3種類のjoin完全実装 |
| `fork/join_any` | ◯ | △ | 実装済 |
| `fork/join_none` | ◯ | △ | 実装済 |
| イベント (`->`, `@`) | ◯ | △ 制限あり | named event実装予定 |
| `disable` | ◯ | △ | 実装済 |

#### 階層・接続性

| 機能 | mrun(仮) | Verilator | mrun(仮)の実装状況 |
|------|------|-----------|----------------|
| モジュール階層 | ◯ | ◯ | 深い階層も対応 |
| `interface` | ◯ | △ 基本のみ | 完全実装 |
| `modport` | ◯ | △ | 完全実装 |
| `virtual interface` | △ 実装中 | ✕ | 将来実装予定 |
| `bind` | △ | △ | 部分実装 |
| generate | ◯ | ◯ | for/if generate対応 |

#### オブジェクト指向

| 機能 | mrun(仮) | Verilator | mrun(仮)の実装状況 |
|------|------|-----------|----------------|
| クラス基本 | ◯ | △ | constructor等実装済 |
| 継承 | △ | △ | 基本実装済 |
| `virtual` メソッド | △ 計画中 | ✕ | 将来実装予定 |
| `$cast` | △ 計画中 | ✕ | 将来実装予定 |
| パラメータ化クラス | △ | △ | 部分実装 |

#### 検証機能

| 機能 | mrun(仮) | Verilator | mrun(仮)の実装状況 |
|------|------|-----------|----------------|
| 即時アサーション | ◯ | △ | assert/assume/cover実装済 |
| 並列アサーション(SVA) | △ 基本のみ | ✕ | シーケンス未実装 |
| `covergroup` | △ 計画中 | ✕ | 将来実装予定 |
| `coverpoint` | △ 計画中 | ✕ | 将来実装予定 |
| ランダム化 (`randomize`) | ◯ | △ 制限あり | 基本実装済 |
| 制約 (`constraint`) | △ | △ solve...before | 部分実装 |

#### システムタスク

| 機能 | mrun(仮) | Verilator | mrun(仮)の実装状況 |
|------|------|-----------|----------------|
| `$display/$write` | ◯ | ◯ | フォーマット対応済 |
| `$finish/$stop` | ◯ | ◯ | 完全実装 |
| `$time/$realtime` | ◯ | ◯ | 完全実装 |
| `$random` | ◯ | ◯ | 完全実装 |
| `$dumpfile/$dumpvars` | △ | ◯ | VCD出力実装中 |
| `$readmemh/$readmemb` | △ | ◯ | 実装予定 |
| `$monitor` | △ | △ | 実装予定 |

### 外部連携・拡張性

| 機能 | mrun(仮) | Verilator | 備考 |
|------|------|-----------|------|
| DPI-C | △ 計画中 | ◯ 完全対応 | Verilatorの最強機能の一つ |
| VPI | △ 計画中 | △ 読み出し中心 | mrun(仮)は将来部分的な実装予定 |
| 独自拡張API | ◯ | ◯ | 両者とも豊富 |
| デバッグ機能 | ◯ 充実 | △ | mrunはインタラクティブデバッグ可能 |

### 開発・運用面

| 項目 | mrun(仮) | Verilator | 備考 |
|------|------|-----------|------|
| 必要なC++バージョン | C++23 | C++14 (GCC13+) | mrun(仮)は最新C++機能を積極活用 |
| 使用C++機能 | std::expected, ranges, format等 | C++14標準機能のみ | mrun(仮)はモダンC++で開発効率向上 |
| コンパイラ要件 | GCC 14.2+/Clang 18+ | GCC 13+/Clang 14+ | mrun(仮)はより新しいコンパイラ必須 |
| ビルドシステム | CMake | autoconf/CMake | 両者ともCMake対応 |
| プラットフォーム | Linux/WSL | Linux/Mac/Win | Verilatorの方が幅広い |
| ライセンス | オープンソース予定 | LGPL v3 | mrun(仮)はライセンス未定 |
| 成熟度 | 開発中 | 成熟・安定 | Verilatorは20年以上の歴史、mrun(仮)は開発開始から約1週間|

## 使い分け指針

### mrun(仮)が適している用途

1. **SystemVerilog学習・教育**
   - 言語仕様の完全な理解
   - インタラクティブな実験
   - デバッグしやすい環境

2. **検証環境の開発**
   - UVM/OVMスタイルの環境構築（将来）
   - 複雑なテストベンチ
   - 高度なタイミング制御が必要な検証

3. **プロトタイピング**
   - 新しいデザインの素早い検証
   - アルゴリズムの実験
   - コンパイル時間を最小化したい場合

### Verilatorが適している用途

1. **大規模SoCの検証**
   - 高速シミュレーションが必須
   - 合成可能なRTLの検証
   - CI/CDパイプライン統合

2. **ソフトウェア協調検証**
   - エミュレータ的な使用
   - ファームウェア開発
   - システムレベル検証

3. **形式的等価性検証の補完**
   - ゲートレベルシミュレーション代替
   - 電力解析用の高速実行
   - カバレッジ収集

## まとめ

- **Verilator**: 実行速度を最優先。大規模な商用プロジェクトでの実績多数
- **mrun(仮)**: SystemVerilog言語仕様の完全性を重視。自分自身の勉強目的

## 今後の展望

### mrun(仮)のロードマップ
- virtual interface実装によるUVM対応
- DPI-C/VPIの完全実装
- 並列シミュレーション対応

### Verilatorの方向性
- SystemVerilog対応の漸進的改善
- 更なる高速化
- より良いデバッグ機能
- エコシステムの拡充