Rustライクな新しいハードウェア記述言語「Veryl」

## はじめに

新しいハードウェア記述言語「**Veryl**」が注目を集めています。RustやSystemVerilogからインスピレーションを受けた現代的な言語として開発されており、Rustで実装されています。今回はVerylについてウェブでの評価を含めて調べてみました。

## Verylとは何か？

Verylは、SystemVerilogの代替として設計された現代的なハードウェア記述言語です。SystemVerilogベースでありながら、ロジック設計に最適化された文法を採用し、Rustの影響を強く受けた読みやすく書きやすい構文を持っています。下記の記事もたいへｎ参考になりました。

https://qiita.com/Kenta11/items/c9d83a285edb22b5077f


この言語の最大の特徴は、既存のSystemVerilogプロジェクトとスムーズに統合できる点です。Verylで書かれたコードは人間が読みやすいSystemVerilogコードに変換され、既存のEDAツールチェーンをそのまま使用できます。また、パッケージマネージャー、ビルドツール、VSCode、Vim、Emacsなどの主要エディタ対応のリアルタイムチェッカーといった開発ツールも提供されています。

## なぜ新しい言語が必要なのか？

従来のハードウェア記述言語の課題として、フォーマッター、リンター、言語サーバー、ビルドマネージャーなどの開発ツールサポートが不足している点があります。

また、人間工学的な観点からも、末尾カンマが許可されないなど、現代的なプログラミング言語では当たり前の利便性が欠けています。さらに深刻なのは、SystemVerilogの仕様が複雑すぎて、商用EDAツールベンダーでさえ全仕様をカバーできていない現状があります。

Verylはこれらの問題を根本的に解決するアプローチを取っています。文法をシンプルに保つことでツール実装の負担を軽減し、開発支援ツールを標準で提供します。

## 実際のコード比較

Verylの特徴を理解するために、公式ドキュメントから実際のコード例を見てみましょう。以下は基本的なモジュールのVerylでの実装例です：

```veryl
module ModuleA {
    initial {
        $display("Hello, world!");
    }
}
```

Verylのより複雑な例として、公式サイトで紹介されているコードを見てみます：

```veryl
/// documentation comment by markdown format
/// * list item1
/// * list item2
pub module Delay #(
    param WIDTH: u32 = 1, // trailing comma is allowed
) (
    i_clk : input clock ,
    i_rst : input reset ,
    i_data: input logic<WIDTH>,
    o_data: output logic<WIDTH>,
) {
    // unused variable which is not started with `_` are warned
    var _unused_variable: logic;
    
    // clock and reset signals can be omitted
    // because Veryl can infer these signals
    always_ff {
        // abstraction syntax of reset polarity and synchronicity
        if_reset {
            o_data = '0;
        } else {
            o_data = i_data;
        }
    }
}
```

このコードの特徴は、クロックとリセットの極性や同期性を文法で指定する必要がない点です。これらの設定はビルド時の設定で指定できるため、同じVerylコードから負極性非同期リセットのASIC向けと正極性同期リセットのFPGA向けの両方のコードを生成できます。

上記のVerylコードは、以下のようなSystemVerilogコードに変換されます：

```systemverilog
module Counter (
    input logic i_clk,
    input logic i_rst,
    output logic [8-1:0] o_count
);
    logic [8-1:0] count;
    
    always_ff @(posedge i_clk, negedge i_rst) begin
        if (!i_rst) begin
            count <= 8'h0;
        end else begin
            count <= count + 8'h1;
        end
    end
    
    assign o_count = count;
endmodule
```

変換されたSystemVerilogコードは読みやすく、デバッグ時にも理解しやすい構造になります。

## 他の代替言語との比較

ハードウェア記述言語の分野では、ChiselやSpinalHDLなど他の代替言語も存在します。Veryl開発者の意見としては、大規模なChiselコードベースでの経験から、ChiselやSpinalHDLはASIC開発でSystemVerilogの代替として使用するには限界があると述べています。

多くの既存代替HDLは、プログラミング言語の内部DSLとして実装されています。このアプローチには迅速な開発や既存ツールエコシステムの再利用といった利点がありますが、文法がハードウェア記述に完全に最適化されない問題があります。またコードは短く洗練されていても、生成されるVerilogコードは膨大であるため、タイミング改善やプリ・ポストマスクECOなどの一般的なASICワークフローでの使用が困難とのことです。

Verylは、SystemVerilogとの言語セマンティクス上の等価性を重視して設計されたとのことです。これにより、Verylコードの変更がSystemVerilogコードに与える影響を予測しやすく、ASIC開発ワークフローに直接適用できるという大きなアドバンテージがあります。

## 実用的な機能とエコシステム

Verylは単なる新しい文法を提供するだけでなく、Rustに倣った現代的な開発環境に必要な機能を包括的に提供しています。パッケージ管理機能では、以下のようにプロジェクト設定で簡単にライブラリを組み込むことができます：

```toml
[dependencies]
"https://github.com/veryl-lang/sample" = "0.1.0"
```

テスト機能も統合されており、SystemVerilogやcocotbで書かれたテストコードをVerylコード内に埋め込み、`veryl test`コマンドで実行できます：

```veryl
#[test(test1)]
embed (inline) sv{{{
module test1;
initial begin
    assert (0) else $error("error");
end
endmodule
}}}
```

ジェネリクスによるコード生成も可能で、従来のパラメータオーバーライドよりも再利用性の高いコードを記述できます。関数のパラメータだけでなく、インスタンス化のモジュール名や構造体定義の型名などもパラメータ化可能です。

## 実際の使用例と意見

既にVerylを使用した意欲的なプロジェクトがあります。`nananapo/bluecore` プロジェクトや `nananapo/veryl-riscv-book` プロジェクトなどがみつかりました。

一方で、懐疑的な意見も見られます。なぜ新しい言語を作る必要があるのかという根本的な疑問や、Rustライクな構文を「醜い」と感じる開発者の意見、プリプロセッサーとしての追加レイヤーがバグや予期しない動作を引き起こす可能性への懸念などが議論されています。

また、確立された企業では言語移行の慣性が大きく、実際の産業界での採用には時間がかかるという現実的な指摘もあります。新しい技術の導入においては常に直面する壁ですね。

## 学習と導入への道筋

SystemVerilogの知識があれば、Verylの学習は比較的スムーズです。基本的な構文はSystemVerilogベースで、Rustライクな改良が加えられているため、既存の知識を活かしながら新しい機能を習得できます。

実際に始めるには、まずRust環境が必要です。以下のコマンドでVerylをインストールし、プロジェクトを作成できます：

```bash
# Verylのインストール
cargo install veryl

# プロジェクトの作成
veryl new hello
cd hello

# ビルド
veryl build
```

学習のための環境として、[Verylの公式プレイグラウンド](https://doc.veryl-lang.org/playground/)がブラウザ上で利用できます。これにより、インストールなしに言語の特徴を試すことができます。

## まとめ

Verylは以下のような特徴を持つ現代的なハードウェア記述言語です：

**主な特徴**:
- Rustライクな読みやすい構文
- SystemVerilogとの高い互換性
- 開発ツールの充実

Rustに馴染みがあり、ハードウェア設計を学んでみようという開発者には、Verylは有望な選択肢だと思います。

## 参考リンク

- [Veryl公式サイト](https://veryl-lang.org/)
- [GitHubリポジトリ](https://github.com/veryl-lang/veryl)
- [ドキュメント](https://doc.veryl-lang.org/book/)
- [Redditでの議論](https://www.reddit.com/r/rust/comments/1l3oa13/veryl_a_modern_hardware_description_language/)