【verilog】内部信号をモニタする2

便利なモニタ用のモジュールを作成中。今回はシンプルな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