最近System VerilogのシミュレーションでQuestaSimを使うことが多くなったが、デフォルトで波形を出力させようとすると配列形式の信号の記録が取られていなくて非常に不便だった。
私の場合はvsim
起動時に以下のようなオプションで実行していた。
vsim -c -do "add wave * -recursive; run -all; archive write vsim.dbar -wlf vsim.wlf ; quit;" -l sim.log +HEX=${HEX}
この時にadd wave * -recursive
としているのが波形を取得するためのコマンドなのだが、これだけでは例えば以下のような配列の信号は記録されない。
typedef struct packed { logic valid; logic [31: 0] addr; logic [63: 0] data; } data_t; data_t r_data_array[32];
これは信号が[31:0] data
のような形式ではなく、配列として定義されているためQuestaSimはこのような信号の波形はデフォルトでは取得しないらしい。
これはどうすればこれらの信号を取得してくれるようになるのかというと、いろいろ調べた結果シミュレーション前に以下のコマンドを実行すれば良いらしい。つまり、ワイルドカードの対象をメモリにまで広げるようだ。
set WildcardFilter [lsearch -not -all -inline $WildcardFilter Memory]
なので、以下のようなrun.tcl
を作ってvsim
でこれを実行させるように修正する。
set WildcardFilter [lsearch -not -all -inline $WildcardFilter Memory] add wave * -recursive run -all archive write vsim.dbar -wlf vsim.wlf quit
$ vsim.exe -c work.tb -do run.tcl -l sim.log +HEX=../tests/simple_ld/test.hex
これで、メモリの波形まで取得してくれるようになった。