FPGA開発日記

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

SystemVerilogの階層構造把握のためのsvinstを試す

Chiselが生成するVerilogファイルはとにかく長い。 ファイルを1つにまとめて生成するというのもあるが(モジュール毎に分割するオプションも存在するのでこれは問題ではないけど)、1つ1つのモジュールも大きくなりがちで、解析に非常に時間がかかる。 Chiselで生成されたデザインを読み解くために必要なのは、生成されたVerilogファイルを以下に効率的に読み解くかと、という所だと思う。そのために必要なのは、SystemVerilogの階層構造の把握だ。これを効率的に行う方法は無いだろうか。

Rustで実装されたsv-parserというツールがある。これはSystemVerilogファイルをParseして解析してくれるツールだ。このライブラリをつかってモジュールのインスタンス状態を示してくれるツールとして、svinstというものがあるらしい。

github.com

github.com

svinstのインストールには、cargoを使用する。これだけでインストールすることができる。

cargo install svinst

さっそく使ってみよう。ChipyardのRocket-Chipの解析を行いたいので、所望のディレクトリでコマンドを入力する。

svinst chipyard.TestHarness.RocketConfig.top.v > chipyard.TestHarness.RocketConfig.top.tree

全ての解析には10分程度かかった。20MB程度あるVerilogファイルとはいえ、ちょっと解析に時間がかかりすぎではないか?Verdiだとこの程度なら割と短時間で解析してしまう。

解析が終了すると、以下のようなログが表示される。

      - mod_name: "RocketTile"
        insts:
          - mod_name: "TLXbar_8"
            inst_name: "tlMasterXbar"
          - mod_name: "IntXbar_4"
            inst_name: "intXbar"
          - mod_name: "DCache"
            inst_name: "dcache"
          - mod_name: "Frontend"
            inst_name: "frontend"
          - mod_name: "TLBuffer_11"
            inst_name: "buffer"
          - mod_name: "IntSyncAsyncCrossingSink"
            inst_name: "intsink"
          - mod_name: "IntSyncSyncCrossingSink"
            inst_name: "intsink_1"
          - mod_name: "IntSyncSyncCrossingSink_1"
            inst_name: "intsink_2"
          - mod_name: "IntSyncSyncCrossingSink_1"
            inst_name: "intsink_3"
          - mod_name: "FPU"
            inst_name: "fpuOpt"
          - mod_name: "HellaCacheArbiter"
            inst_name: "dcacheArb"
          - mod_name: "PTW"
            inst_name: "ptw"
          - mod_name: "Rocket"
            inst_name: "core"

なるほど、このモジュール内でインスタンス化されたモジュールの一覧が表示されるのか。欲を言えばもう一段、階層構成まで表示して欲しいところだ。でもこのRustコード自体はそれほど難しくなさそうなので、自分で改造すれば所望の物が作れそうな気がしてくる。