特徴
この章ではVerylの特徴的な機能をわかりやすい例とともに紹介します。
- リアルタイム診断
- 自動フォーマット
- 組み込みテスト
- 論理合成
- 依存関係管理
- ジェネリクス
- 型推論
- クロックドメインアノテーション
- 末尾カンマ
- クロックとリセットの抽象化
- ドキュメンテーションコメント
always_ffでの複合代入演算子- 独立した名前空間を持つenumバリアント
- ビット連結における
repeat if/case式- 範囲
for/inside/outside msb記法let文<>演算子- 名前付きブロック
- 可視性制御
リアルタイム診断
変数の未定義・未使用・未代入といった問題はエディタでの編集中にリアルタイムに通知されます。次の例では、未使用変数として通知された変数に _ プレフィックスを付加することで未使用であることを明示し、警告を抑制しています。
自動フォーマット
エディタと連携した自動フォーマット機能のほか、コマンドラインでのフォーマットやCIでのフォーマットチェックも可能です。
組み込みテスト
テストは Veryl で直接記述し、veryl test コマンドで実行できます。基本となるのは ネイティブテスト で、Veryl 自体で記述したテストベンチを組み込みシミュレータで実行します。SystemVerilog を埋め込んだり外部フレームワークに依存したりする必要はありません。外部シミュレータのインストールは不要です。
#[test(test_example)]
module test_example {
inst clk: $tb::clock_gen;
inst rst: $tb::reset_gen ( clk );
initial {
rst.assert();
clk.next (10);
$finish ();
}
}
外部の RTL シミュレータが必要な場合は、SystemVerilog や cocotb で書いたテストコードを Veryl コードに埋め込み、同じ veryl test コマンドで実行することもできます。
#[test(test1)]
embed (inline) sv{{{
module test1;
initial begin
assert (0) else $error("error");
end
endmodule
}}}
論理合成
Veryl はプロジェクトに対して簡易的な論理合成を行い、概算の面積・タイミング・電力を報告できます。これは設計検討中に素早くフィードバックを得るためのツールであり、本格的な合成フローの代替を意図したものではありません。
レポートは1行のサマリで始まり、続いて面積・タイミング・電力の詳細が示されます。
synth: TopModule — 123 gates, 17 FFs
library: sky130_fd_sc_hd ...
summary:
area: 1234.56 um² (comb 1000.00, seq 134.56, mem 100.00)
timing: 2.345 ns 8 levels in_dat → out_dat
power: 0.1234 mW (leak 0.0123 mW, dyn 0.1111 mW)
@ f_clk = 100 MHz, activity = 0.10
依存関係管理
Verylには依存関係の管理機能が組み込まれており、プロジェクト設定に以下のようにライブラリのリポジトリパスとバージョンを追加するだけで、簡単にライブラリを組み込むことができます。
[dependencies]
veryl_sample = {git = "https://github.com/veryl-lang/veryl_sample", version = "0.1.0"}
ジェネリクス
ジェネリクスによるコード生成は従来のパラメータオーバーライドよりさらに再利用性の高いコードを記述することができます。以下の例のような関数のパラメータだけでなく、インスタンスのモジュール名や構造体定義の型名もパラメータ化することができます。
| SystemVerilog | Veryl |
|---|---|
|
|
型推論
var、let、const の型注釈は、右辺や最初の代入から型が導出できる場合に省略できます。関数呼び出しのジェネリック引数も、実引数の宣言型から推論できます。ポートや関数のシグネチャはインターフェースの可読性を保つために、引き続き明示的な型指定が必要です。
| SystemVerilog | Veryl |
|---|---|
|
|
クロックドメインアノテーション
モジュール内に複数のクロックがある場合、明示的なクロックドメインアノテーションとクロックドメイン境界への unsafe (cdc) ブロックが必要です。Veryl コンパイラは意図しないクロックドメインクロッシングをエラーとして検出し、明示的な unsafe (cdc) ブロックによりレビューが容易になります。
| SystemVerilog | Veryl |
|---|---|
|
|
末尾カンマ
末尾カンマは、リストの最後の要素の後ろにカンマが置かれる構文です。これにより、要素の追加や削除が容易になり、バージョン管理システムにおける不必要な差異を減らすことができます。
| SystemVerilog | Veryl |
|---|---|
|
|
クロックとリセットの抽象化
クロックの極性やリセットの極性と同期性を構文上指定する必要はなく、ビルド時の設定で指定することができます。これにより同じVerylのコードからASIC向けの負極性・非同期リセットとFPGA向けの正極性・同期リセットのそれぞれのコードを生成することができます。
さらに、明示的な clock と reset 型により、レジスタへのクロック・リセット接続が正しく行われているかどうかを確認することができます。モジュール内にクロックとリセットが1つだけの場合、レジスタへの接続を省略することもできます。
| SystemVerilog | Veryl |
|---|---|
|
|
ドキュメンテーションコメント
ドキュメンテーションコメントとしてモジュールの説明を書いておくとドキュメントを自動生成することができます。単なるテキストだけでなく、以下のフォーマットを使用することができます。
| SystemVerilog | Veryl |
|---|---|
|
|
always_ff での複合代入演算子
ノンブロッキング専用の代入演算子はなく、always_ff 内ではノンブロッキング代入が、 always_comb 内ではブロッキング代入が推論されます。そのため always_ff 内でも always_comb 内と同様に様々な複合代入演算子を使用することができます。
| SystemVerilog | Veryl |
|---|---|
|
|
独立した名前空間を持つenumバリアント
enumのバリアントはenum毎に独立した名前空間を持っており意図しない名前の衝突を防ぐことができます。
| SystemVerilog | Veryl |
|---|---|
|
|
ビット連結における repeat
ビット連結における繰り返し記述として明示的な repeat 記法を採用し、 複雑な {} の組み合わせより可読性が向上しています。
| SystemVerilog | Veryl |
|---|---|
|
|
if / case 式
三項演算子の代わりに if 式と case 式を採用することで、比較するアイテム数が多い場合の可読性が向上します。
| SystemVerilog | Veryl |
|---|---|
|
|
範囲 for / inside / outside
閉区間 ..= と半開区間 .. を表す記法を導入し、 for 、inside で範囲を統一的に記述できるようにしました。また、inside の逆を意味する outside も導入しました。
| SystemVerilog | Veryl |
|---|---|
|
|
msb 記法
最上位ビットを示す msb 記法により、パラメータから最上位ビットを計算する必要がなくなり、より意図を明確にすることができます。
| SystemVerilog | Veryl |
|---|---|
|
|
let 文
変数宣言と同時に値を束縛する専用の let 文が用意されており、SystemVerilogではサポートされていなかった様々な場所で使用することができます。
| SystemVerilog | Veryl |
|---|---|
|
|
<> 演算子
<> 演算子は2つのインターフェースを接続します。SystemVerilogではインターフェースを接続するためにぞれぞれのメンバーを代入する必要がありましたが、簡単に接続することができるようになります。
| SystemVerilog | Veryl |
|---|---|
|
|
名前付きブロック
変数のスコープを限定するための名前付きブロックを定義することができます。
| SystemVerilog | Veryl |
|---|---|
|
|
可視性制御
pub キーワードの付かないモジュールはプロジェクト外から参照できず、ドキュメントの自動生成にも含まれません。これによりプロジェクト外に公開したいものと内部実装とを区別することができます。
| SystemVerilog | Veryl |
|---|---|
|
|