
田中太郎
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で変数の値をテキストファイルに書き込みました
コメント