Skip to content

v0.15.1: SV構文拡張#16

Open
shadowlink0122 wants to merge 32 commits into
mainfrom
feature/v0.15.1
Open

v0.15.1: SV構文拡張#16
shadowlink0122 wants to merge 32 commits into
mainfrom
feature/v0.15.1

Conversation

@shadowlink0122
Copy link
Copy Markdown
Owner

@shadowlink0122 shadowlink0122 commented Mar 10, 2026

Cm v0.15.1 リリースノート

リリース日: 2026-04-29
前バージョン: v0.15.0

✨ ハイライト

v0.15.1はSystemVerilogバックエンドの品質向上テスト基盤の強化を含むメンテナンスリリースです。SVテストの並列実行対応、x86_64デバッグ環境の整備、型推論の修正により、開発体験が向上しました。


🔧 SystemVerilog バックエンド改善

__builtin_concat / __builtin_replicate 型推論の修正

パーサが生成する TypeKind::BitArray<Bit> を正しく認識するよう型推論を修正。ビット幅の合算・複製後幅計算が正確に行われるようになりました。

//! platform: sv
#[input]  bit[4] a = 0;
#[input]  bit[4] b = 0;
#[output] bit[8] result = 0;      // {a, b} → 4+4=8ビット
#[output] bit[12] replicated = 0; // {3{a}} → 4*3=12ビット

always_comb void compute() {
    result = {a, b};
    replicated = {3{a}};
}

SV バックエンド品質改善

改善項目 説明
switch/case構文 ドキュメント修正とenum FSM例を追加
#[sv::param]属性 廃止(言語仕様整合)
task出力 廃止
言語仕様整合 SV バックエンドの言語仕様を整理

🧪 テスト基盤強化

make test の改善

  • SVテスト追加: make test にSystemVerilogテストを含むように変更
  • 全テスト並列実行: interpreter、LLVM、WASM、SVの全バックエンドで並列実行
make test  # unit + interpreter + llvm + wasm + sv (全て並列)

SVテストスイート拡充

カテゴリ 新規追加
sv/basic parallel_test_a/b/c, signed_types, unsigned_types, nested_ternary
sv/control compound_conditions, deep_if_else, for_loop, switch_case, switch_fsm
sv/edge-cases deep_nesting, empty_concat, large_array, multi_clock_domain
sv/errors pointer_type, string_type
sv/simulation initial_basic

テスト総数: 69テスト(v0.15.0の23テストから大幅増加)

CI強化

  • SV O0/O3テストの両方を実行するよう設定
  • Ubuntu/macOS両環境でのSVテスト実行

🛠️ x86_64 デバッグ環境(macOS Rosetta)

Apple Silicon Mac上でx86_64コードをデバッグするための新しいMakeターゲットを追加。

make build-x86              # x86_64用コンパイラをビルド
make test-x86               # x86_64でテスト実行(Rosetta経由)
make debug-x86 FILE=<file>  # 特定テストをx86_64でデバッグ
make clean-x86              # x86_64ビルドをクリーン

ショートカット: bx, tx, dx

必要条件

x86_64用のHomebrewパッケージが必要:

arch -x86_64 /usr/local/bin/brew install llvm@17 openssl@3

📝 ドキュメント

SVチュートリアル

docs/tutorials/ にSystemVerilogバックエンドのチュートリアルを日英両言語で追加。

ROADMAP更新

リファクタリング項目としてSystemVerilogバックエンドテストのドキュメントを追加。


🐛 バグ修正

問題 修正内容
MIR→LLVM到達可能性 到達不能ブロックをスキップする分析を追加
グローバル文字列初期化 CreateGlobalStringPtrのハングを解消
wasmtime CIセットアップ curlインストールに切り替え
__builtin_concat/replicate TypeKind::BoolTypeKind::Bit に修正

📁 主要な変更ファイル

ファイル 変更内容
Makefile x86_64デバッグターゲット追加、make testにSV追加・並列化
.gitignore cm-x86 を追加
.github/workflows/ci.yml SV O0/O3テスト追加
src/frontend/types/checking/call.cpp __builtin_concat/replicate の型推論修正
ROADMAP.md リファクタリング項目追加
tests/sv/ 46+テストファイル追加

📊 テスト結果

バックエンド 通過 失敗 スキップ
JIT (O3) 368 0 5
LLVM (O3) 411 0 8
WASM (O3) 368 0 5
SV (O3) 64 0 5

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
Copilot AI review requested due to automatic review settings March 10, 2026 15:14
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Cm の SystemVerilog バックエンド v0.15.1 として、SV 向けの構文・型・コード生成を拡張し、周辺ドキュメント/テスト/バージョン表記を更新する PR です。

Changes:

  • SV 向けに always(_ff/_comb/_latch)assignbit[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.

Comment thread src/codegen/sv/codegen.cpp Outdated
Comment thread docs/v0.15.1/sv_syntax_reference.md
Comment thread docs/v0.15.1/sv_language_design.md Outdated
Comment thread src/frontend/parser/parser_expr.cpp Outdated
Comment thread src/frontend/types/checking/call.cpp Outdated
Comment thread src/codegen/sv/codegen.cpp Outdated
Comment thread docs/v0.15.1/sv_language_design.md
Comment thread docs/v0.15.1/sv_language_design.md Outdated
Comment thread docs/v0.15.1/sv_cm_mapping.md Outdated
Comment thread docs/v0.15.1/sv_syntax_reference.md
- パーサー: 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
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment thread src/frontend/types/checking/call.cpp
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment thread src/mir/lowering/lowering.cpp
Comment thread Makefile
Comment thread src/main.cpp
Comment thread src/mir/lowering/base.cpp
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment thread src/mir/lowering/impl.cpp
Comment thread src/mir/lowering/lowering.cpp
- 配列型の 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants