アウトプットブログ

勉強したことをまとめていきます。

SystemVerilogでファイル入出力

前回テストデータと比較データを自動生成しました。その比較結果は標準出力に表示していましたが、ログとしてファイル出力できると便利そう。比較はSystemVerilg側で実施しているので、そのままSystemVerilogで出来るならやってしまいたい。ということで試してみたところ簡単にできました。

今回は前回のソースからtest_sv.svのみ変更しています。変更・追記箇所のみ以下に記載します。
・test_sv.sv

    // 比較タイミング生成のためのイネーブル
    // VHDLモジュールへ入力してから結果出力までのクロック数を指定
    bit d_c_en;
    assign d_c_en = (d_c_que.size() >= 1) ? 1: 0;
    // キューを読み出して結果と比較
    byte cmp;
    always @(posedge clk_i) begin
        if (d_c_en == 1) begin
            cmp = d_c_que.pop_front();
            // [変更点]display -> fdisplayに変更
            if (d_o != cmp) begin
                $fdisplay(fileHandle, "NG,%d,%d", d_o, cmp);
            end
        end
    end
    // [以下追記]
    // ファイルオープン -> csv最初の行出力 -> テスト終了時にファイルクローズ
    int fileHandle;
    initial begin
        fileHandle = $fopen("test.csv","a");
        $fdisplay(fileHandle, "Cmp Result,Input,Output");
        @(negedge d_c_en);
        $fclose(fileHandle);
    end

出力ファイル(test.csv)の内容が以下になります。エラー時の比較値と出力結果が出力されています。

Cmp Result,Input,Output
NG,   8,  12
NG,  10,  15
NG,  12,  18
NG,  14,  21

やりたいことは出来ましたが、入力値もログとして出力すると分かりやすいですね…。でも比較値と一緒にキューで遅らせるだけです。キュー便利。