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固有型(文脈キーワード)

posedgenegedgewirereg型を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/stoulltry-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.shrun_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

📖 ドキュメント


🔮 今後の予定