4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

新しい時代の HDL "Veryl" を試した

Posted at

はじめに

Veryl は SystemVerilog にトランスパイルされる HDL です.公式が「学習の容易さ、設計プロセスの信頼性と効率の向上、およびコードの記述の容易さが実現されます。」と謳っているように,覚えやすく書きやすい言語です.

私は以前 FPGA 向けの UART モジュールを SystemVerilog で実装しました.このモジュールを先日 Veryl で移植しました.

本稿では,移植の際に Veryl の機能について個人的に良いなと感じた点を,SystemVerilog と比較して紹介します.

良かった機能

打鍵数が減る

SystemVerilog ではコードブロックは module endmodulebegin end などで囲った範囲でした.対して Veryl では {} で囲った範囲です.タイプする量が減るので単純に楽です.ミスタイプする機会も減ります.

宣言が楽

SystemVerilog では2ビット以上のレジスタ等のサイズを:で指定します.この表現は初学者にとって非常に分かりづらく,熟練者でもミスの温床になります.

SystemVerilog での宣言
logic [31:0] clock_counts;

対して Veryl ではサイズそのものを指定します.

Veryl での宣言
var clock_counts : logic<32>;

多くのプログラミング言語ではむしろこの方法が一般的だと思うので,分かりやすいのではないでしょうか.

列挙型が現代的

SystemVerilog では列挙子がグローバルな名前空間に定義されます.これは名前の衝突リスクがあります.

SystemVerilog での列挙型定義
typedef enum logic [1:0] {
    STATE_WAIT         = 2'h0,
    STATE_RECEIVE_BITS = 2'h1,
    STATE_WRITE_WORD   = 2'h2
} state_t;
// state <= STATE_WAIT; // 列挙子の参照方法

対して Veryl では列挙子が列挙型を通して参照されます.名前の衝突リスクが減るので,名前が簡素になります.

Veryl での列挙型定義
enum state_t: logic<2> {
    WAIT,
    RECEIVE_BITS,
    WRITE_WORD,
}
// state = state_t::WAIT; // 列挙子の参照方法

SystemVerilog では C 言語風の,Veryl では Rust 風の列挙型が定義できると考えれば理解がしやすいでしょう.

リセット周りが便利

SystemVerilog ではリセットも他の信号と同様に register または wire として扱います.この表現ではリセットの性質(極性と同期・非同期)によって,記述を修正する必要がありました.

SystemVerilog でのリセット定義
module receiver_axis (
    input rst,
    // 省略
);

Veryl ではリセット専用の型でこの問題を解決します.これはリセットの性質を抽象化しています.

Veryl でのリセット定義
module receiver_axis (
    rst : input reset,
    // 省略
)

リセット型を導入すると,リセット専用の文法 if_reset を使うことができます.

Veryl でのリセット参照
always_ff (clk) {
    if_reset {
        // リセット時の記述
    } else {
        // 省略
    }
}

veryl 0.15.0 時点では,上記の記述は負極性で非同期のリセットにトランスパイルされます.

トランスパイル後のリセット参照
always_ff @ (posedge clk, negedge rst) begin
    if (!rst) begin
        // リセット時の記述
    end else begin
        // 省略
    end
end

ここで Veryl.toml に次の記述を追加しましょう.

Veryl.toml に追記する内容
[build]
reset_type = "sync_high"

もう一度トランスパイルし直すと,次の SystemVerilog 記述が得られます.正極性で同期のリセットになりました.

再トランスパイル後のリセット参照
always_ff @ (posedge clk) begin // <- negedge rst が削除された
    if (rst) begin // <- リセットの論理が逆になった
        // リセット時の記述
    end else begin
        // 省略
    end
end

開発ターゲットに応じてリセットの性質は異なることがあるはずなので,このリセットの抽象化はとても便利なのではないでしょうか.

おわりに

本稿では Veryl 移植で感じた良かった点を紹介しました.Veryl は SystemVerilog が抱えていた問題や難しさを解決するよい言語だと思います.JavaScript に TypeScript がいるように,SystemVerilog にも Veryl がいると,開発体験が良いものになるのではないでしょうか.

Veryl には他にも様々な特徴がありますので,気になる方は公式サイトを見てください.また,Veryl は現在も開発中のため,紹介した機能は今後変わってゆく可能性があります.ご利用の際は最新情報をご参照ください.

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?