
GoogleのSystemVerilog Parserの続き。さらにいくつかコマンドがあるので探っていく。
verible-verilog-syntax
これがおそらくSyntax解析エンジンの最も中心的なコマンドであろう。Verilogファイルを読み取って階層構造を出力する。階層構造を出力するためには--printtreeオプションを付加する。
$ verible-verilog-syntax --printtree counter_4bit.v
Parse Tree:
Node @0 (tag: kDescriptionList) {
Node @0 (tag: kDPIImportItem) {
Leaf @0 (#"import" @25-31: "import")
Leaf @1 (#TK_StringLiteral @32-39: ""DPI-C"")
Leaf @2 (#"context" @40-47: "context")
Node @5 (tag: kTaskPrototype) {
Leaf @1 (#"task" @48-52: "task")
Leaf @3 (#SymbolIdentifier @53-63: "dpi_c_func")
Node @4 (tag: kParenGroup) {
Leaf @0 (#'(' @63-64: "(")
Node @1 (tag: kPortList) {
Node @0 (tag: kPortItem) {
Leaf @0 (#"input" @64-69: "input")
Node @1 (tag: kDataTypeImplicitBasicIdDimensions) {
Node @0 (tag: kDataType) {
Node @0 (tag: kDataTypePrimitive) {
Leaf @0 (#"int" @70-73: "int")
Node @2 (tag: kPackedDimensions) {
}
}
凄く詳細なSyntax Treeが表示された。これ単体では使い物にならないので、このツール自体をライブラリとして使っていろいろ作るのが正しいんだろうな。
verible-verilog-lint
これはLinterだ。Linterというからにはルールセットが必要だが、これは--rulesオプションで指定するらしい。かなりオプションが複雑なので興味のある人は以下の説明を読んでみてほしい。
早速、counter_4bit.vに適用してみる。
$ verible-verilog-lint counter_4bit.v
counter_4bit.v:15:6: Explicitly define static or automatic lifetime for non-class tasks [Style: function-task-explicit-lifetime] [explicit-task-lifetime]
何じゃこりゃ。あれ、そういえばtaskってautomaticとか修飾子を付けないといけないんだっけ。忘れてしまったけどとりあえず付けてみよう。
// task dpi_verilog_task(input int in); task automatic dpi_verilog_task(input int in); $display("dpi_verilog_task is called. in = %d", in); endtask // dpi_verilog_task
今回はエラーを何も出力しなかった。なるほど、デフォルトでもこれは意外と使えるかもな。。。
verible-transform-interactive.sh
これはかなり激しいツールだ。ツールと言ってもshell scriptなのだが、試してみるとどうやら自動的にverible-verilog-formatを実行してオリジナルファイルに対してパッチを作成し、それをApplyするかを聞いてくる。使う用途あるかなあ...?
$ verible-transform-interactive.sh -- verible-verilog-format -- counter_4bit.v
--- counter_4bit.v +++ NEW/counter_4bit.v ... - end else begin - if (en) begin - cnt <= cnt + 4'h1; - /* verilator lint_off WIDTH */ - dpi_c_func (cnt, return_value); - $display("return_value = %d", return_value); +module counter_4bit ( + input logic clk, + input logic reset_n, + input logic en, + output logic [3:0] cnt +); + + int return_value; ... Apply this hunk? [y,n,a,d,s,q,?]
それ以外にも、今回は試し切れなかったKytheとの連携ツールなども存在している。しっかり触ると面白そう。 私としてはEmacsやVisual Studio Codeなどのツールとの結合と、あとはvhierに変わるツールが出てくるとすごく便利そうだ。