Chiselが生成するVerilogファイルはとにかく長い。 ファイルを1つにまとめて生成するというのもあるが(モジュール毎に分割するオプションも存在するのでこれは問題ではないけど)、1つ1つのモジュールも大きくなりがちで、解析に非常に時間がかかる。 Chiselで生成されたデザインを読み解くために必要なのは、生成されたVerilogファイルを以下に効率的に読み解くかと、という所だと思う。そのために必要なのは、SystemVerilogの階層構造の把握だ。これを効率的に行う方法は無いだろうか。
Rustで実装されたsv-parserというツールがある。これはSystemVerilogファイルをParseして解析してくれるツールだ。このライブラリをつかってモジュールのインスタンス状態を示してくれるツールとして、svinst
というものがあるらしい。
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コード自体はそれほど難しくなさそうなので、自分で改造すれば所望の物が作れそうな気がしてくる。