ハードウェア記述言語Verylのアップデート
はじめに
VerylはSystemVerilogの代替言語として開発中のハードウェア記述言語です。
昨年末、ある程度動くようになったところで簡単な紹介記事を書きました。
今回はそこから1年でのアップデートを紹介します。
ドキュメント
昨年の記事ではテストケースとして用意したサンプルソースしかありませんでしたが、ドキュメントをある程度整備しました。
言語リファレンスは未記載のページもまだありますが、ある程度は雰囲気がつかめるようになったのではないかと思います。これから試してみようと思う方は 2. Getting Started や 3. Code Examples あたりから見てみてください。
Playground
Webブラウザ上から簡単に試してみる環境としてPlaygroundも用意しました。
言語機能・コンパイラ
言語やコンパイラへのアップデートのうち大きなものをいくつか紹介します。
依存関係
gitリポジトリから依存関係を取得したり、自分のパッケージをバージョン番号を付けて公開することができるようになりました。
[dependencies]
"https://github.com/dalance/veryl_sample" = "0.1.0"
詳細は以下をご覧ください。
ドキュメントの自動生成
モジュール一覧やそのポート一覧などのドキュメントを自動生成することができるようになりました。Rustと同じくドキュメンテーションコメント(///
で始まるコメント)に対応しており、モジュールの説明文などを書いておくと自動で反映されます。
/// The detailed description of ModuleA
///
/// * list item0
/// * list item1
module ModuleA #(
/// Data width
parameter ParamA: u32 = 1,
localparam ParamB: u32 = 1,
) (
i_clk : input logic , /// Clock
i_rst_n: input logic , /// Reset
i_data : input logic<ParamA>, /// Data input
o_data : output logic<ParamA>, /// Data output
) {}
命名規則
識別子の命名規則を設定できるようになりました。ケース(スネークケースやキャメルケース)の設定や固定のprefixを要求するもの、正規表現による設定などが可能です。
<
と>
言語として最も大きな変更は<
と>
の扱いです。一般的なプログラミング言語では比較演算子として扱われると思いますが、<>
を括弧として使おうと思うと括弧なのか演算子なのか簡単にはわからないという問題が発生します。
大抵の場合、文脈から判断するようにするなど頑張って演算子と括弧の両立を図りますが、Verylでは演算子側をあきらめるという解決を採用しました。
比較演算子としては<:
と:>
を使うことにすることで
- 比較演算子
<=
、=>
と文字数が揃う - 複雑な構文解析なしに
<>
を括弧として使える
というメリットがあると判断しました。最終的に<>
はpacked arrayを表す構文とし、unpacked arrayの[]
と区別しやすくなっています。
module ModuleA #(
parameter ParamA: u32 = 10,
) (
i_clk : input logic,
i_rst : input logic,
i_sel : input logic,
i_data: input logic<ParamA> [2], // `[]` means unpacked array in SystemVerilog
o_data: output logic<ParamA> , // `<>` means packed array in SystemVerilog
) {
}
また将来的にはジェネリクス(SystemVerilogのgenerate
ではなくVerylコンパイラが処理するより一般のジェネリクスに近いもの)のための構文としても使う予定です。
その他
そのほか細かいアップデートを以下にまとめておきます。
- Changed modport separator from . to :: by @dalance in #65
- Changed [package] in Veryl.toml to [project] by @dalance in #82
- Changed enum member scope by @dalance in #66
- Type cast by @dalance in #48
- Unknown member check by @dalance in #84
- File scope import by @dalance in #59
- Signed type modifier by @dalance in #85
- Attribute arguments check by @dalance in #90
- Metadata check by @dalance in #91
- Dependency support by @dalance in #36
- Language server metadata support by @dalance in #95
- Changed compare operator to <: and >: by @dalance in #94
- Width <> and array [] notation by @dalance in #94
- Operator completeion support of language server by @dalance in #16
- String literal support by @dalance in #109
- implicit_parameter_types in Veryl.toml by @dalance in #109
- Fixed Incorrect if block scope by @dalance in #55
- Msb/lsb notation by @dalance in #9
- Struct packed by default by @dalance in #118
- Reset statement check by @dalance in #117
- allow attribute by @dalance in #116
- lint for naming convention by @dalance in #116
- Remove rev tag branch in dependencies by @dalance in #132
- Change dependencies format by @dalance in #139
- Closed range syntax by @dalance in #146
- initial/final declaration by @dalance in #148
- Function call as statement by @dalance in #149
- Error check before veryl publish by @dalance in #150
- Multithreaded veryl-ls by @dalance in #155
- Add toplevel entity and keyword completion by @dalance in #156
- Add inside/outside expression by @dalance in #159
- Release aarch64 mac binray by @dalance in #163
- Widthless number by @dalance in #174
- Sized set bits by @dalance in #189
- Unconnected port support by @dalance in #190
- Automatic ducumentation by @dalance in #195
- Add modport member resolve by @dalance in #332
- Add hierarchical identifier check by @dalance in #333
- Typedef by @nblei in #326
- Added union type by @nblei in #357
- Cycle check by @nblei in #383
- Checks that (module) inputs are only read by @nblei in #393
おわりに
この1年のアップデートを紹介しました。今年は業務で実戦投入しつつブラッシュアップすることを目標としていたのですが、なかなか予定通りにいかず、後半はあまり触る時間が取れませんでした。
来年はもう少し進めたいところです。
Discussion