便利なモニタ用のモジュールを作成中。今回はシンプルな2つのデータを常時監視するモニタを作成しました。
このモニタは、bindでdutの内部にインスタンス化することを想定しています。内部信号をモニタに接続して、CSVファイルに格納します。
CSVファイルに格納する意図は、波形を目視して確認しないため。 リファレンスモデル側でも同じようにファイル出力ができれば、diffで差分比較ができます。
// monitor.v module monitor#( parameter p_width_data1 =4, parameter p_width_data2 =8, parameter p_dly_cycle_data1 =0, parameter p_dly_cycle_data2 =1, parameter output_file_name ="test_output.csv", parameter data1_name ="data1", parameter data2_name ="data2" ) ( input clk, input rst, input [p_width_data1-1:0] data1, input [p_width_data2-1:0] data2 ); integer fp; logic [p_width_data1-1:0] queue_data1[$]; logic [p_width_data2-1:0] queue_data2[$]; logic [p_width_data1-1:0] print_data1; logic [p_width_data2-1:0] print_data2; //Set up output file initial begin fp = $fopen(output_file_name); $fdisplay(fp,"monitor %s and %s",data1_name,data2_name); end //monitor always@(posedge clk or negedge rst)begin queue_data1.push_front(data1); queue_data2.push_front(data2); if(queue_data1.size() >= p_dly_cycle_data2-p_dly_cycle_data1+1)begin print_data1 = queue_data1.pop_back; end if(queue_data2.size() >= p_dly_cycle_data1-p_dly_cycle_data2+1)begin print_data2 = queue_data2.pop_back; end if(print_data1 !== {p_width_data1{1'bX}} && print_data2 !== {p_width_data2{1'bX}})begin $fwrite(fp,"%t,%h,%h\n",$realtime,print_data1,print_data2); end end endmodule
module tb_top(); ・・・ bind dut monitor #( .p_width_data1(4), .p_width_data2(8), .p_dly_cycle_data1(0), .p_dly_cycle_data2(1), .output_file_name("output_1.csv"), .data1_name("add"), .data2_name("rdata_r") )u_monitor_1( .clk(clk), .rst(rst_n), .data1(add), .data2(rdata_r) ); endmodule