Cm v0.15.0 リリースノート
リリース日: 2026-03-09 前バージョン: v0.14.2
✨ ハイライト
v0.15.0はSystemVerilog (SV) バックエンドの本格実装とプラットフォームディレクティブによるレキサーモード分離を含むメジャーアップデートです。CmからFPGA向けのSystemVerilogコードを生成し、iverilogによるシミュレーション検証まで一貫して実行可能になりました。
🔧 SystemVerilogバックエンド(新規)
Phase 1-5: コア実装
MIRからSystemVerilogへの変換パイプラインを実装。構造化CFG走査により、MIRの基本ブロックからif/else/case等のSV制御構文を正確に再構築します。
cm compile --target=sv program.cm -o output.sv
ポート宣言と回路タイプ
| アトリビュート | 生成されるSV |
|---|---|
#[input] |
input logic [N:0] name |
#[output] |
output logic [N:0] name |
| 通常関数 | always_comb begin ... end |
posedge型引数 |
always_ff @(posedge clk) begin ... end |
negedge型引数 |
always_ff @(negedge clk) begin ... end |
SV固有型(文脈キーワード)
posedge、negedge、wire、reg型をCm言語レベルで直接サポート。SVプラットフォーム時のみキーワードとして認識され、非SVモードでは通常の識別子として使用可能。
SV幅付きリテラル
SystemVerilog形式の幅付きリテラル(N'd, N'b, N'h)をCmパーサーで直接サポート。Token→AST→HIR→MIR→SV codegen の全段で元のベース形式を保持して出力します。
out = 3'b101; // → 3'b101 (2進数)
out = 8'hFF; // → 8'hFF (16進数)
out = 8'd170; // → 8'd170 (10進数)
一時変数の最適化
MIR→SV変換時に一時変数(_tXXXX)をインライン展開し、使用されなくなった変数のlogic宣言を自動除去。クリーンなSV出力を実現。
三項演算子の自動最適化
if/elseが同一変数への単一代入のみの場合、cond ? a : b に自動変換。合成ツールの効率向上と可読性改善。
テストベンチ自動生成
cm compile --target=sv実行時にiverilog互換のテストベンチ(_tb.sv)を自動生成。
その他の機能
| 機能 | 説明 |
|---|---|
| BRAM推論 | 配列をBlock RAMとして推論 |
| マルチクロックドメイン | sv::clock_domain(clk_name)アトリビュート |
| XDC制約ファイル生成 | sv::pinアトリビュートでピン配置指定 |
| 非ブロッキング代入 | 順序回路で<=を自動使用 |
🆕 プラットフォームディレクティブ
ソースファイル先頭の //! platform: sv ディレクティブまたは --target=sv CLIオプションにより、レキサーのキーワードテーブルをプラットフォームごとに切り替える仕組みを導入。
//! platform: sv
// posedge/negedge/wire/reg がキーワードトークンとして認識される
| モード | キーワード追加 | 用途 |
|---|---|---|
LexerPlatform::Default |
なし | 通常のCmコード |
LexerPlatform::SV |
posedge, negedge, wire, reg |
SVターゲット |
🐛 バグ修正
| 問題 | 修正内容 |
|---|---|
| 型キーワードnamespace関数呼び出し失敗 | parse_namespace()/current_text()でget_string()→token_kind_to_string()に修正 |
| posedge等が非SVコードで型消費 | parse_type()のIdentテキスト比較ブロック削除、レキサーKwトークンに完全移行 |
| rstポート挿入位置 | clk実位置を検索して直後に挿入するよう修正 |
| 非合成型チェック未呼び出し | compile()からvalidateSynthesizableTypes()を呼び出し、エラー時にコンパイル中止 |
| parameter二重宣言 | sv::param変数がparameter/logicで二重定義されるバグを修正 |
| SV幅付きリテラル例外クラッシュ | stoi/stoullをtry-catchで保護、値部空チェック・基数文字検証を追加 |
| グローバル変数初期化子省略範囲 | SVポート型/アトリビュートのみ省略可能に限定 |
⚡ ビルド高速化
| 変更 | 説明 |
|---|---|
| ccache自動検出 | インストール済みなら自動でコンパイルキャッシュ有効化 |
| Unity build | ソースファイル結合(バッチ16)でヘッダパース回数を大幅削減 |
| SV生成物管理 | デフォルトSV出力を.tmp/配下に変更、ルートディレクトリの汚染を防止 |
| コンパイラ警告0件達成 | 符号比較・演算子優先順位・未使用変数の警告を全解消 |
| Token/AST/HIR/MIR最適化 | SV幅付きリテラル情報をstd::optional<BitLiteralInfo>に統一 |
🎨 VSCode拡張機能
SV幅付きリテラルのハイライト
N'[dbh]VALUEパターンをconstant.numeric.sv-literal.cmスコープとして認識。8'hFF等が文字リテラルではなく数値リテラルとしてハイライトされるよう修正。
文字リテラルパターン修正
シングルクォートの文字リテラルを'X'(1文字のみ)にマッチするmatchパターンに変更。
🧪 テスト基盤
テストディレクトリ統合
tests/programs/を廃止し、全テストをtests/直下のカテゴリディレクトリに統合。
SVテストの並列実行
unified_test_runner.shのrun_parallel_testにSVバックエンドを追加。make tsvpでiverilogシミュレーション検証を含む全SVテストを並列実行可能に。
CIへのSVテスト・iverilog追加
GitHub Actions CIにiverilogのインストールとSVシミュレーション検証を追加。macOSでのbrew install失敗時はwarning出力+SVテストスキップへ明示的分岐。
テストカバレッジ
| カテゴリ | テスト数 |
|---|---|
| sv/advanced | 6 (fsm, led_blinker, multi_clock, negedge_reset, parameterized, posedge_counter) |
| sv/basic | 11 (adder, arithmetic, binary_bits, bitwise, counter, multi_expr, mux, shift, sv_width_literal, ternary, unary) |
| sv/control | 5 (compare, nested_if, priority_encoder, shift_register, signed_ops) |
| sv/memory | 1 (bram) |
| 合計 | 23テスト |
📁 主要な変更ファイル
| ファイル | 変更内容 |
|---|---|
src/codegen/sv/codegen.cpp |
SVコード生成エンジン全体 |
src/frontend/lexer/lexer.hpp |
LexerPlatform enum、add_sv_keywords()定義 |
src/frontend/lexer/lexer.cpp |
SVキーワード動的追加、プラットフォームディレクティブ検出 |
src/frontend/parser/parser_type.cpp |
SV Identテキスト比較ブロック削除 |
src/frontend/parser/parser_module.cpp |
namespace名取得のget_string()修正 |
src/frontend/parser/parser_expr.cpp |
SV幅付きリテラル・型キーワード名前空間修飾 |
vscode-extension/syntaxes/cm.tmLanguage.json |
SV幅付きリテラルハイライト |
.github/workflows/ci.yml |
SVテスト+iverilog追加 |
tests/unified_test_runner.sh |
SVテスト並列実行対応 |
📊 テスト結果
| バックエンド | 通過 | 失敗 | スキップ |
|---|---|---|---|
| JIT (O0) | 368 | 0 | 5 |
| SV | 23 | 0 | 0 |
📖 ドキュメント
- 新規チュートリアル: SVバックエンド (ja/en)
- 設計書更新: SV設計書2件をPhase 1 IMPLEMENTED、他3件のステータスを更新
🔮 今後の予定
- v0.16.0: 型同一性改善、メソッドチェーン型チェッカー拡張、モジュール分離コンパイル