FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

GoogleのSystemVerilog ParserであるVeribleを試す(2)

f:id:msyksphinz:20200917212059p:plain

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オプションで指定するらしい。かなりオプションが複雑なので興味のある人は以下の説明を読んでみてほしい。

github.com

早速、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との連携ツールなども存在している。しっかり触ると面白そう。 私としてはEmacsVisual Studio Codeなどのツールとの結合と、あとはvhierに変わるツールが出てくるとすごく便利そうだ。