FPGA開発日記

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

QuestaSimで配列型のシミュレーション波形取得方法

最近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

これで、メモリの波形まで取得してくれるようになった。

f:id:msyksphinz:20210227143646p:plain