はじめに
筆者は、自分自身の勉強目的で、Claude Code を使って、mrun(仮) というSystemVerilogシミュレータを約一週間前から開発中です。
いずれ公開するつもりですが、現時点の開発状況をVerilatorと比較する形で紹介させていただきます。なお、Verilatorについて詳しくは前回の記事を参照ください。
概要
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(仮)が適している用途
-
SystemVerilog学習・教育
- 言語仕様の完全な理解
- インタラクティブな実験
- デバッグしやすい環境
-
検証環境の開発
- UVM/OVMスタイルの環境構築(将来)
- 複雑なテストベンチ
- 高度なタイミング制御が必要な検証
-
プロトタイピング
- 新しいデザインの素早い検証
- アルゴリズムの実験
- コンパイル時間を最小化したい場合
Verilatorが適している用途
-
大規模SoCの検証
- 高速シミュレーションが必須
- 合成可能なRTLの検証
- CI/CDパイプライン統合
-
ソフトウェア協調検証
- エミュレータ的な使用
- ファームウェア開発
- システムレベル検証
-
形式的等価性検証の補完
- ゲートレベルシミュレーション代替
- 電力解析用の高速実行
- カバレッジ収集
まとめ
-
Verilator: 実行速度を最優先。大規模な商用プロジェクトでの実績多数
-
mrun(仮): SystemVerilog言語仕様の完全性を重視。自分自身の勉強目的
今後の展望
mrun(仮)のロードマップ
- virtual interface実装によるUVM対応
- DPI-C/VPIの完全実装
- 並列シミュレーション対応
Verilatorの方向性
- SystemVerilog対応の漸進的改善
- 更なる高速化
- より良いデバッグ機能
- エコシステムの拡充