FPGA開発日記

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

RTLシミュレーションにおいて波形をダンプする以外にデバッグする方法はあるか(2. 情報を絞る)

RTLシミュレーションにおいて、波形ダンプはとにかくディスク容量を食う。VCSなどが使用するFSDBはともかく、VCDとかで長期間シミュレーションをするととんでもないサイズのVCDファイルが生成されてしまい波形ビューアへのロードも時間がかかる。

という訳で前回jsonファイル形式にdumpするシミュレーションモジュールを書いたのだが、単純に1サイクルごとにすべての情報を出してしまうとテキストファイルの情報が増えすぎてしまうので、「有効な情報が入っている場合のみ」ダンプするように変更した。

 `ifdef SIMULATION

 function void dump_entry_json(int fp, stq_entry_t entry, int index);

   if (entry.is_valid) begin
     $fwrite(fp, "    \"msrh_stq_entry[%d]\" : {", index);
     $fwrite(fp, "       valid : %d, ", entry.is_valid);
     $fwrite(fp, "       pc_addr : \"0x%0x\", ", entry.inst.pc_addr);
=    $fwrite(fp, "       inst : \"%08x\", ", entry.inst.inst);

     $fwrite(fp, "       cmt_id : %d, ", entry.cmt_id);
     $fwrite(fp, "       grp_id : %d, ", entry.grp_id);

     $fwrite(fp, "       state : \"%s\, ", entry.state == STQ_INIT               ? "INIT" :
                                           entry.state == STQ_TLB_HAZ            ? "TLB_HAZ" :
                                           entry.state == STQ_READY              ? "READY" :
                                           entry.state == STQ_DONE               ? "DONE" :
                                           entry.state == STQ_COMMIT             ? "COMMIT" :
                                           entry.state == STQ_WAIT_ST_DATA       ? "WAIT_ST_DATA" :
                                           entry.state == STQ_WAIT_LRQ_REFILL    ? "WAIT_LRQ_REFILL" :
                                           entry.state == STQ_COMMIT_L1D_CHECK   ? "COMMIT_L1D_CHECK" :
                                           entry.state == STQ_L1D_UPDATE         ? "L1D_UPDATE" : "x");
     $fwrite(fp, "    },\n");
   end // if (entry.valid)

 endfunction // dump_json

 function void dump_json(int fp);
   $fwrite(fp, "  \"msrh_stq\" : {\n");
   for (int s_idx = 0; s_idx < MEM_Q_SIZE; s_idx++) begin
     dump_entry_json (fp, w_stq_entries[s_idx], s_idx);
   end
   $fwrite(fp, "  },\n");
 endfunction // dump_json
 `endif // SIMULATION

こうして生成したJSONは末尾にカンマの付いているため正式なJSONではないので、一端hjsonをかませて正式なJSONに変換しそのうえでjqに渡す。

$ hjson -j < dump.json | jq

何となくParseできるJSONを生成できた。これで、例えばデバッグしたい命令のPCアドレスを含むモジュールの情報だけを抽出するとかできないかしら。

f:id:msyksphinz:20210312000800p:plain