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アドレスを含むモジュールの情報だけを抽出するとかできないかしら。