v0.15.1: SV構文拡張#16
Conversation
v0.15.0のPR#14マージ以降の全変更をfeature/v0.15.1に移行:
- SVバックエンド品質改善: 定数ビット幅推論・else if正規化・冗長除去
- always_ff/always_comb/always_latch キーワード直接サポートと自動判別
- SV構文拡張Phase1: bit[N]型・assign文・inoutサポート
- SV構文拡張Phase2: enum→typedef enum・struct→struct packed・function→function automatic
- SV連接({a,b})・複製({N{expr}})構文のフルパイプライン実装
- 全60テストPASS
There was a problem hiding this comment.
Pull request overview
Cm の SystemVerilog バックエンド v0.15.1 として、SV 向けの構文・型・コード生成を拡張し、周辺ドキュメント/テスト/バージョン表記を更新する PR です。
Changes:
- SV 向けに
always(_ff/_comb/_latch)・assign・bit[N]・inout・{a,b}/{N{expr}}などの構文要素をフロントエンド〜MIR〜SV codegen へ伝搬 - SV codegen の出力要素を拡充(localparam、typedef enum/struct packed、function/task、always_latch、concat/replicate など)
- v0.15.1 ドキュメント追加とテスト追加、各種バージョンを 0.15.1 に更新
Reviewed changes
Copilot reviewed 99 out of 99 changed files in this pull request and generated 11 comments.
Show a summary per file
| File | Description |
|---|---|
| vscode-extension/package.json | VSCode 拡張のバージョン更新 (0.15.1) |
| VERSION | リポジトリのバージョン更新 (0.15.1) |
| src/main.cpp | get_version() の既定値更新 (0.15.1) |
| src/frontend/lexer/token.hpp | SV 用キーワード/トークン追加(always/assign/bit/initial 等) |
| src/frontend/lexer/token.cpp | 追加トークンの文字列表現を追加 |
| src/frontend/lexer/lexer.cpp | SV キーワードテーブルに追加キーワードを登録 |
| src/frontend/parser/parser_type.cpp | bit 型のパース追加 |
| src/frontend/parser/parser_stmt.cpp | 型開始判定に bit を追加 |
| src/frontend/parser/parser_decl.cpp | always* 修飾子・assign トップレベル宣言・配列サフィックス先読み拡張 |
| src/frontend/parser/parser_expr.cpp | {...} を連接/複製/構造体リテラルとして判別するパース追加 |
| src/frontend/ast/types.hpp | AST TypeKind に Bit 追加 |
| src/frontend/ast/decl.hpp | FunctionDecl/GlobalVarDecl に always/assign フラグ追加 |
| src/frontend/types/checking/call.cpp | __builtin_concat / __builtin_replicate の型推論バイパス追加 |
| src/hir/nodes.hpp | HIR に always/assign フラグと属性を追加 |
| src/hir/lowering/decl.cpp | AST→HIR で always/assign/属性を伝搬 |
| src/hir/lowering/expr.cpp | __builtin_concat / __builtin_replicate を builtin として扱う |
| src/mir/nodes.hpp | MIR に always/assign フラグ追加 |
| src/mir/lowering/impl.cpp | HIR→MIR で always kind を伝搬 |
| src/mir/lowering/base.cpp | const/assign の global var 登録挙動を変更 |
| src/codegen/sv/codegen.hpp | SVModule の出力要素(typedef/function/always_latch 等)を追加 |
| src/codegen/sv/codegen.cpp | SV の型/ビット幅/always 種別/assign/localparam/typedef/function/concat/replicate を実装 |
| docs/v0.15.1/sv_syntax_reference.md | v0.15.1 向け SV 構文リファレンス追加 |
| docs/v0.15.1/sv_language_design.md | v0.15.1 向け SV 言語デザイン文書追加 |
| docs/v0.15.1/sv_extension_proposal.md | SV 構文拡張提案文書追加 |
| docs/v0.15.1/sv_cm_mapping.md | Cm⇔SV マッピング表追加 |
| tests/sv/basic/all_comparisons.cm | SV 向け比較演算テスト追加 |
| tests/sv/basic/all_comparisons.expect | 期待結果追加 |
| tests/sv/basic/all_operators.cm | SV 向け演算子テスト追加 |
| tests/sv/basic/all_operators.expect | 期待結果追加 |
| tests/sv/basic/assign_wire.cm | SV assign テスト追加 |
| tests/sv/basic/assign_wire.expect | 期待結果追加 |
| tests/sv/basic/bit_width.cm | bit[N] テスト追加 |
| tests/sv/basic/bit_width.expect | 期待結果追加 |
| tests/sv/basic/bool_logic.cm | bool 論理演算テスト追加 |
| tests/sv/basic/bool_logic.expect | 期待結果追加 |
| tests/sv/basic/increment.cm | ++ 展開テスト追加 |
| tests/sv/basic/increment.expect | 期待結果追加 |
| tests/sv/basic/inout_port.cm | inout テスト追加 |
| tests/sv/basic/inout_port.expect | 期待結果追加 |
| tests/sv/basic/internal_reg.cm | 内部レジスタ宣言テスト追加 |
| tests/sv/basic/internal_reg.expect | 期待結果追加 |
| tests/sv/basic/nested_ternary.cm | 三項演算子ネストテスト追加 |
| tests/sv/basic/nested_ternary.expect | 期待結果追加 |
| tests/sv/basic/signed_types.cm | signed 型幅テスト追加 |
| tests/sv/basic/signed_types.expect | 期待結果追加 |
| tests/sv/basic/unsigned_types.cm | unsigned 型幅テスト追加 |
| tests/sv/basic/unsigned_types.expect | 期待結果追加 |
| tests/sv/control/compound_conditions.cm | 複合条件テスト追加 |
| tests/sv/control/compound_conditions.expect | 期待結果追加 |
| tests/sv/control/deep_if_else.cm | 深い if/else テスト追加 |
| tests/sv/control/deep_if_else.expect | 期待結果追加 |
| tests/sv/control/for_loop.cm | for ループテスト追加 |
| tests/sv/control/for_loop.expect | 期待結果追加 |
| tests/sv/control/switch_case.cm | switch/case テスト追加 |
| tests/sv/control/switch_case.expect | 期待結果追加 |
| tests/sv/control/switch_fsm.cm | switch + FSM テスト追加 |
| tests/sv/control/switch_fsm.expect | 期待結果追加 |
| tests/sv/advanced/always_async_reset.cm | 複数エッジ(非同期リセット)テスト追加 |
| tests/sv/advanced/always_async_reset.expect | 期待結果追加 |
| tests/sv/advanced/always_auto_latch.cm | always 自動ラッチ判別テスト追加 |
| tests/sv/advanced/always_auto_latch.expect | 期待結果追加 |
| tests/sv/advanced/always_comb_explicit.cm | always_comb 明示指定テスト追加 |
| tests/sv/advanced/always_comb_explicit.expect | 期待結果追加 |
| tests/sv/advanced/always_comb_mux.cm | always_comb(後方互換)テスト追加 |
| tests/sv/advanced/always_comb_mux.expect | 期待結果追加 |
| tests/sv/advanced/always_counter.cm | always_ff(後方互換)テスト追加 |
| tests/sv/advanced/always_counter.expect | 期待結果追加 |
| tests/sv/advanced/always_ff_explicit.cm | always_ff 明示指定テスト追加 |
| tests/sv/advanced/always_ff_explicit.expect | 期待結果追加 |
| tests/sv/advanced/backward_compat_async.cm | async 構文の後方互換テスト追加 |
| tests/sv/advanced/backward_compat_async.expect | 期待結果追加 |
| tests/sv/advanced/backward_compat_comb.cm | void(エッジなし) の後方互換テスト追加 |
| tests/sv/advanced/backward_compat_comb.expect | 期待結果追加 |
| tests/sv/advanced/backward_compat_posedge.cm | posedge 引数の後方互換テスト追加 |
| tests/sv/advanced/backward_compat_posedge.expect | 期待結果追加 |
| tests/sv/advanced/clock_domain.cm | clock_domain 属性テスト追加 |
| tests/sv/advanced/clock_domain.expect | 期待結果追加 |
| tests/sv/advanced/concat_replicate.cm | 連接/複製テスト追加 |
| tests/sv/advanced/concat_replicate.expect | 期待結果追加 |
| tests/sv/advanced/const_expr.cm | const 式→localparam テスト追加 |
| tests/sv/advanced/const_expr.expect | 期待結果追加 |
| tests/sv/advanced/enum_typedef.cm | enum→typedef enum テスト追加 |
| tests/sv/advanced/enum_typedef.expect | 期待結果追加 |
| tests/sv/advanced/latch_explicit.cm | always_latch 明示指定テスト追加 |
| tests/sv/advanced/latch_explicit.expect | 期待結果追加 |
| tests/sv/advanced/localparam_const.cm | const→localparam テスト追加 |
| tests/sv/advanced/localparam_const.expect | 期待結果追加 |
| tests/sv/advanced/mixed_always.cm | always_ff + always_comb 混在テスト追加 |
| tests/sv/advanced/mixed_always.expect | 期待結果追加 |
| tests/sv/advanced/multi_always_comb.cm | always_comb 複数ブロックテスト追加 |
| tests/sv/advanced/multi_always_comb.expect | 期待結果追加 |
| tests/sv/advanced/struct_packed.cm | struct→typedef struct packed テスト追加 |
| tests/sv/advanced/struct_packed.expect | 期待結果追加 |
| tests/sv/advanced/sv_function.cm | function automatic 出力テスト追加 |
| tests/sv/advanced/sv_function.expect | 期待結果追加 |
| tests/sv/advanced/sv_param.cm | parameter 出力テスト追加 |
| tests/sv/advanced/sv_param.expect | 期待結果追加 |
| tests/sv/advanced/uart_counter.cm | 複雑制御フロー+定数テスト追加 |
| tests/sv/advanced/uart_counter.expect | 期待結果追加 |
Comments suppressed due to low confidence (1)
src/mir/lowering/base.cpp:181
- ここで
returnを削除して const 変数もmir_program.global_varsに登録するように変わっていますが、コメントの「非constグローバル変数のみMirGlobalVarとして登録」と矛盾しています。また、SV向けの意図であればターゲットに応じて挙動を切り替えないと LLVM など他バックエンドでも const がグローバル変数として出力されるようになり、従来挙動から変わります。意図を明確にした上でコメント更新・必要ならターゲット条件分岐を入れてください。
// SVバックエンドではlocalparam出力のため、global_varsにも登録する
// (returnせずフォールスルーで下のMirGlobalVar登録へ進む)
}
}
// 非constグローバル変数のみMirGlobalVarとして登録
auto mir_gv = std::make_unique<MirGlobalVar>();
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
- パーサー: extern struct 構文, フィールド属性パース (#[sv::param], #[output] 等) - パーサー: extern struct フィールドのデフォルト値パース (= expr) - パーサー: SVプラットフォームで初期値なし構造体型グローバル変数宣言を許可 - HIR/MIR: is_extern フラグ, フィールド属性, デフォルト値の伝播チェーン - SV Codegen: extern struct typedef 出力抑制 - SV Codegen: モジュールインスタンス化文生成 (パラメータ + ポート接続) - SV Codegen: extern struct 型のレジスタ宣言重複を解消 - テスト: extern_instance テストケース追加 - SVテスト 61/61 PASS, インタプリタテスト 349/372 PASS (既知18 FAIL)
v0.15.1のSV拡張(連接/複製構文)で暗黙的構造体リテラル {field: val, ...} のパースが
is_sv_platform_条件下に移動されたため、非SVテストで16件の回帰エラーが発生。
非SVプラットフォーム用の構造体リテラルパースを独立ブロックとして復元。
- インタプリタテスト: 349/372 → 365/372 PASS (16件修正)
- SVテスト: 61/61 PASS (回帰なし)
- 残り2 FAIL (generic_with_macro, typed_macro) はマクロ無限ループの既知問題
MIRToLLVM::convert のグローバル変数初期化で builder->CreateGlobalStringPtr を 使用していたが、IRBuilderにインサートポイント(BasicBlock)が設定されていない 状態での呼び出しがLLVM内部で無限ループを引き起こしていた。 修正: ConstantDataArray::getString + ConstantExpr::getInBoundsGetElementPtr で IRBuilderを介さずにグローバル文字列定数を直接作成するよう変更。 - macro string テスト (typed_macro, generic_with_macro) の完全復旧 - インタプリタテスト: 367/372 PASS, 0 FAIL, 5 SKIP - SVテスト: 61/61 PASS
MIR生成時に全関数の末尾に到達不能な 'return 0' ブロックが生成される。 LLVM O3最適化がこれを unreachable → ud2 (x86_64) に変換し、 Ubuntu環境でSIGILL (exit code 132)を引き起こしていた。 修正: convertFunctionにエントリブロックからのBFS到達可能性分析を追加。 Goto/SwitchInt/Callの遷移先を辿り到達可能ブロックを収集し、 到達不能ブロックのLLVMブロック作成とコード変換をスキップ。 - LLVM O3テスト: 403/411 PASS, 0 FAIL (Ubuntu x86_64 SIGILL解消) - インタプリタテスト: 回帰なし
bytecodealliance/actions/wasmtime/setup@v1 がGitHub APIレート制限で HTMLエラーページを受け取りCIが失敗する問題を修正。 Wasmtime公式インストールスクリプト(curl https://wasmtime.dev/install.sh) による直接インストールに切り替え。
docs/v0.15.1/sv_tutorial.md: 包括的なSVバックエンドチュートリアル - 構文・型マッピング・ポート宣言 - ロジックブロック (always_ff/always_comb) の4パターン - 演算子マッピング・定数リテラル・ビット幅付与 - Cm独自の暗黙的変換 (代入方式自動決定・論理否定→ビット反転・ clk/rst自動追加・MIR一時変数展開・else if正規化 等) - SV属性一覧・トークン一覧・予約語 - LED点滅の完全な例 (Cm → SV 出力)
- docs/tutorials/en/compiler/sv.md: 英語版(v0.15.1対応詳細版に更新) - docs/tutorials/ja/compiler/sv.md: 日本語版(v0.15.1対応詳細版に更新) - docs/tutorials/en/index.md: SVバックエンドリンクを追加 - docs/tutorials/ja/index.md: SVバックエンドリンクを追加、進捗トラッカー更新 - docs/v0.15.1/sv_tutorial.md: 削除(正しい場所に移動) 内容: 暗黙的変換8項目、SV属性11項目、トークン一覧、 ロジックブロック4パターン、完全な例(Cm→SV出力)を網羅
コンパイラ (codegen/sv/codegen.cpp): 1. const → 常にlocalparam(#[sv::param]属性があってもconstなら変更不可) - 評価順序を反転: const チェックを #[sv::param] チェックより先に - #[sv::param] + 非const → parameter(外部からオーバーライド可能) 2. void/非void → task/function の自然マッピング - 引数あり(edge paramなし)の非void関数 → function automatic - 引数あり(edge paramなし)のvoid関数 → task automatic - 引数なしvoid関数 → always_comb (後方互換維持) - #[sv::function]/#[sv::task] 属性は不要に ドキュメント: - tutorials/en/compiler/sv.md: parameter/function/task の説明修正 - tutorials/ja/compiler/sv.md: 同上 - docs/v0.15.1/sv_language_design.md: #[sv::param] const → 非const に修正 - docs/v0.15.1/sv_syntax_reference.md: parameter属性の説明修正 テスト: SVテスト 61/61 PASS、回帰なし
コンパイラ (codegen/sv/codegen.cpp): 1. #[sv::param] → parameter のコードを完全削除 - const は常に localparam に変換(属性不要) - parameter 宣言は生成しない 2. task 出力を完全削除 - void関数は常に always_comb(引数あり/なし関わらず) - 非void関数(戻り値あり)のみ function automatic - task は合成に不適切なため廃止 テスト: - parameterized.cm: #[sv::param] → const に変更 - SVテスト 61/61 PASS、回帰なし ドキュメント: - tutorials/en/ja/compiler/sv.md: #[sv::param]・task 記述削除 - v0.15.1/sv_syntax_reference.md: parameter行をlocalparam行に修正 - v0.15.1/sv_language_design.md: 既に前コミットで修正済み
コンパイラ (codegen/sv/codegen.cpp): 1. function内MIRテンポラリ変数のインライン展開 - always ブロックと同じ2パス処理を function にも適用 - _tXXXX 変数が除去されクリーンな出力に 2. 一般function呼び出しのSV出力を実装 - result = func_name(arg1, arg2); として出力 - always_comb/always_ff 内での関数呼び出しが可能に 3. else if 正規化後のインデント修正 - 結合時にブロック内のインデントを4スペース浅く調整 - 余分なend除去も統合した新ロジック ドキュメント (tutorials/en,ja/compiler/sv.md): 4. 数値区切り文字の記述を削除(未サポート) 5. localparam出力例に型情報 logic [31:0] を追加 テスト: SVテスト 61/61 PASS、回帰なし
ドキュメント (tutorials/en,ja/compiler/sv.md):
- switch/case構文を正しい case(pattern) 形式に修正
- 旧: case 0: { ... } / default: { ... }
- 新: case(0) { ... } / else { ... }
- enum + switch FSMの使用例を追加
- case(State::IDLE) { ... } 形式でenum マッチ
テスト: SVテスト 61/61 PASS
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 113 out of 113 changed files in this pull request and generated no new comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 141 out of 144 changed files in this pull request and generated 1 comment.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 153 out of 156 changed files in this pull request and generated 4 comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 155 out of 158 changed files in this pull request and generated 2 comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
- 配列型の unpacked dimension ([0:N-1]) が SV 出力に含まれるよう修正 - emitPlace に ProjectionKind::Index 対応を追加 (配列インデックスアクセス) - BRAM/LutRAM 宣言に配列サイズサフィックスを追加 - 通常の内部レジスタ配列宣言にもサイズサフィックスを追加 - 配列変数の重複宣言を防止 (名前ベースの検出に改善) - 代入文左辺のテンポラリ変数インライン展開を追加 - getArraySuffix ヘルパーメソッドを新規追加 テスト: 67 PASS / 0 FAIL / 4 SKIP (ベースライン 64→67)
- tests/sv/hdmi/video_timing.cm: 640x480@60Hz VGA タイミング - tests/sv/hdmi/tmds_encoder.cm: DVI 1.0 TMDS 8b/10b エンコーダ テスト: 69 PASS / 0 FAIL / 4 SKIP
Cm v0.15.1 リリースノート
リリース日: 2026-04-29
前バージョン: v0.15.0
✨ ハイライト
v0.15.1はSystemVerilogバックエンドの品質向上とテスト基盤の強化を含むメンテナンスリリースです。SVテストの並列実行対応、x86_64デバッグ環境の整備、型推論の修正により、開発体験が向上しました。
🔧 SystemVerilog バックエンド改善
__builtin_concat/__builtin_replicate型推論の修正パーサが生成する
TypeKind::BitとArray<Bit>を正しく認識するよう型推論を修正。ビット幅の合算・複製後幅計算が正確に行われるようになりました。SV バックエンド品質改善
#[sv::param]属性🧪 テスト基盤強化
make testの改善make testにSystemVerilogテストを含むように変更SVテストスイート拡充
parallel_test_a/b/c,signed_types,unsigned_types,nested_ternarycompound_conditions,deep_if_else,for_loop,switch_case,switch_fsmdeep_nesting,empty_concat,large_array,multi_clock_domainpointer_type,string_typeinitial_basicテスト総数: 69テスト(v0.15.0の23テストから大幅増加)
CI強化
🛠️ x86_64 デバッグ環境(macOS Rosetta)
Apple Silicon Mac上でx86_64コードをデバッグするための新しいMakeターゲットを追加。
ショートカット:
bx,tx,dx必要条件
x86_64用のHomebrewパッケージが必要:
📝 ドキュメント
SVチュートリアル
docs/tutorials/にSystemVerilogバックエンドのチュートリアルを日英両言語で追加。ROADMAP更新
リファクタリング項目としてSystemVerilogバックエンドテストのドキュメントを追加。
🐛 バグ修正
CreateGlobalStringPtrのハングを解消__builtin_concat/replicateTypeKind::Bool→TypeKind::Bitに修正📁 主要な変更ファイル
Makefilemake testにSV追加・並列化.gitignorecm-x86を追加.github/workflows/ci.ymlsrc/frontend/types/checking/call.cpp__builtin_concat/replicateの型推論修正ROADMAP.mdtests/sv/📊 テスト結果