SystemVerilog|テキストファイルに書き込む

Systemverilog
田中太郎
田中太郎

SystemVerilogでテキストファイルに値を書き込みます

はじめに

デバッグ用や期待値生成用に値をファイルに書き込みたいときがあります

今回はSystemVerilogの機能を使用して値をテキストファイルに書き込んでみます

サンプルコード

カウンタ回路の出力を10進数表示でテキストファイル書き込みます

dut.sv

カウンタ回路です

initがHighでdoutがリセット(0)になり、initがLowでdoutが1づつカウントアップします

module sample(
    input clk,
    input rst_n,
    input init,
    output logic [3:0] dout
);
    always_ff @(posedge clk, negedge rst_n) begin
        if (!rst_n) begin
            dout <= '0;
        end
        else begin
            if (init) begin
                dout <= '0;
            end
            else begin
                dout <= dout + 1'b1;
            end
        end
    end
endmodule
tb.sv

カウンタの値をテキストファイルに書き込むテストベンチです

module tb;
    bit clk = 0;
    bit rst_n = 0;
    always #5 clk = !clk;

    bit init = 0;
    logic [3:0] dout;

    initial begin // シーケンス
        #20;
        rst_n = 1;
        #20;
        init = 1;
        #20;
        init = 0;
        #100;
        $finish;
    end

    int f, status;
    initial begin
        // init が 1 -> 0 で1クロック立ち上がったあとに書き込みを開始します
        @(init == 1);
        @(init == 0);
        @(posedge clk);

        f = $fopen("data.txt", "w"); // w:write型でファイルを開く
        $fdisplay(f, "Counter Value"); // ヘッダーコメントを書き込みます
        while (!init) begin // initがLow の間はdoutの値を書き込み続けます
            $fdisplay(f, "%d : %b : %h", dout, dout, dout); // ファイルに書き込みます
            @(posedge clk); // クロックの立ち上がりを待ちます。
        end
        $fclose(f); // ファイルを閉じます
    end

    // カウンタ回路のインスタンス
    sample u_dut(
        .clk(clk),
        .rst_n(rst_n),
        .init(init),
        .dout(dout)
    );
endmodule
実行結果
Counter Value
 0 : 0000 : 0
 1 : 0001 : 1
 2 : 0010 : 2
 3 : 0011 : 3
 4 : 0100 : 4
 5 : 0101 : 5
 6 : 0110 : 6
 7 : 0111 : 7
 8 : 1000 : 8
 9 : 1001 : 9

解説

f = $fopen("data.txt", "w"); // w:write型でファイルを開く

$fopen(<ファイル名>, “w”)

で<ファイル名>をwriteモードで開きます

wでwriteモード、rでreadモード、aで上書きモードです

$fdisplay(f, "Counter Value"); // ヘッダーコメントを書き込みます

$fdisplay(<ファイル変数>, “<テキスト>”)

でさきほど開いたファイルに<テキスト>を書き込みます

$fdisplay(f, "%d : %b : %h", dout, dout, dout); // ファイルに書き込みます

ファイルに値を書き込みます

%d:10進数
%b:2進数
%h:16進数

でそれぞれ値を書き込めます

まとめ

SystemVerilogで変数の値をテキストファイルに書き込みました

コメント

タイトルとURLをコピーしました