特徴
この章ではVerylの特徴的な機能をわかりやすい例とともに紹介します。
- リアルタイム診断
- 自動フォーマット
- 組み込みテスト
- 依存関係管理
- ジェネリクス
- クロックドメインアノテーション
- 末尾カンマ
- クロックとリセットの抽象化
- ドキュメンテーションコメント
always_ff
での複合代入演算子- 独立した名前空間を持つenumバリアント
- ビット連結における
repeat
if
/case
式- 範囲
for
/inside
/outside
msb
記法let
文- 名前付きブロック
- 可視性制御
リアルタイム診断
変数の未定義・未使用・未代入といった問題はエディタでの編集中にリアルタイムに通知されます。次の例では、未使用変数として通知された変数に _
プレフィックスを付加することで未使用であることを明示し、警告を抑制しています。
ビデオが再生されない場合1
自動フォーマット
エディタと連携した自動フォーマット機能のほか、コマンドラインでのフォーマットやCIでのフォーマットチェックも可能です。
ビデオが再生されない場合1
組み込みテスト
SystemVerilogまたはcocotbで書かれたテストコードをVerylに埋め込み、veryl test
コマンドで実行することができます。
#[test(test1)]
embed (inline) sv{{{
module test1;
initial begin
assert (0) else $error("error");
end
endmodule
}}}
依存関係管理
Verylには依存関係の管理機能が組み込まれており、プロジェクト設定に以下のようにライブラリのリポジトリパスとバージョンを追加するだけで、簡単にライブラリを組み込むことができます。
[dependencies]
"https://github.com/veryl-lang/sample" = "0.1.0"
ジェネリクス
ジェネリクスによるコード生成は従来のパラメータオーバーライドよりさらに再利用性の高いコードを記述することができます。以下の例のような関数のパラメータだけでなく、インスタンスのモジュール名や構造体定義の型名もパラメータ化することができます。
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 |
---|---|
|
|
名前付きブロック
変数のスコープを限定するための名前付きブロックを定義することができます。
SystemVerilog | Veryl |
---|---|
|
|
可視性制御
pub
キーワードの付かないモジュールはプロジェクト外から参照できず、ドキュメントの自動生成にも含まれません。これによりプロジェクト外に公開したいものと内部実装とを区別することができます。
SystemVerilog | Veryl |
---|---|
|
|
いくつかのブラウザはデフォルトでGIF動画の再生を停止しています。ブラウザの設定を確認してください。