Verilog ファイルの IO 操作
Verilog には、ファイルを開く、ファイルに値を出力する、ファイルから値を読み取る、他の変数にロードする、ファイルを閉じることができるシステム タスクと関数があります。
ファイルの開閉
module tb;
// Declare a variable to store the file handler
integer fd;
initial begin
// Open a new file by the name "my_file.txt"
// with "write" permissions, and store the file
// handler pointer in variable "fd"
fd = $fopen("my_file.txt", "w");
// Close the file handle pointed to by "fd"
$fclose(fd);
end
endmodule
ファイルモードを開く
引数 | 説明 |
---|---|
「r」または「rb」 | 閲覧用に開く |
"w" または "wb" | 書き込み用の新しいファイルを作成します。ファイルが存在する場合は、長さ 0 に切り詰めて上書きします |
「a」または「ab」 | ファイルが存在する場合は追加 (EOF で書き込み用に開く)、存在しない場合は新しいファイルを作成 |
「r+」、「r+b」または「rb+」 | 読み書き両方可能 |
"w+"、"w+b" または "wb+" | 更新のために切り捨てるか作成する |
「a+」、「a+b」、または「ab+」 | 追加、または EOF での更新用に新しいファイルを作成 |
ファイルの書き方
関数 | 説明 |
---|---|
$fdisplay | $display と同様に、代わりにファイルに書き込みます |
$fwrite | $write と同様に、代わりにファイルに書き込みます |
$fstrobe | $strobe と同様に、代わりにファイルに書き込みます |
$fmonitor | $monitor と同様に、代わりにファイルに書き込みます |
上記の各システム関数は、基数 10 進数で値を出力します。また、値を 2 進数、8 進数、16 進数で出力する 3 つのバージョンもあります。
関数 | 説明 |
---|---|
$fdisplay() | デフォルトで 10 進数で出力 |
$fdisplayb() | バイナリで出力 |
$fdisplayo() | 8 進数で表示 |
$fdisplayh() | 16 進数で表示 |
module tb;
integer fd;
integer i;
reg [7:0] my_var;
initial begin
// Create a new file
fd = $fopen("my_file.txt", "w");
my_var = 0;
$fdisplay(fd, "Value displayed with $fdisplay");
#10 my_var = 8'h1A;
$fdisplay(fd, my_var); // Displays in decimal
$fdisplayb(fd, my_var); // Displays in binary
$fdisplayo(fd, my_var); // Displays in octal
$fdisplayh(fd, my_var); // Displays in hex
// $fwrite does not print the newline char '
' automatically at
// the end of each line; So we can predict all the values printed
// below to appear on the same line
$fdisplay(fd, "Value displayed with $fwrite");
#10 my_var = 8'h2B;
$fwrite(fd, my_var);
$fwriteb(fd, my_var);
$fwriteo(fd, my_var);
$fwriteh(fd, my_var);
// Jump to new line with '
', and print with strobe which takes
// the final value of the variable after non-blocking assignments
// are done
$fdisplay(fd, "
Value displayed with $fstrobe");
#10 my_var <= 8'h3C;
$fstrobe(fd, my_var);
$fstrobeb(fd, my_var);
$fstrobeo(fd, my_var);
$fstrobeh(fd, my_var);
#10 $fdisplay(fd, "Value displayed with $fmonitor");
$fmonitor(fd, my_var);
for(i = 0; i < 5; i= i+1) begin
#5 my_var <= i;
end
#10 $fclose(fd);
end
endmodule
シミュレーションログ Value displayed with $fdisplay 26 00011010 032 1a Value displayed with $fwrite 43001010110532b Value displayed with $fstrobe 60 00111100 074 3c Value displayed with $fmonitor 60 0 1 2 3 4
ファイルの読み方
セリフを読む
システム関数 $fgets
[hl]fd[/hd] で指定されたファイルから変数 str に文字を読み取り、str が満たされるまで、または改行文字が読み取られて str に転送されるまで、または EOF 条件が検出されるまで。
読み取り中にエラーが発生すると、コード 0 が返されます。それ以外の場合は、読み取った文字数を返します。
EOF の検出
システム関数 $feof
EOF が見つかった場合はゼロ以外の値を返し、それ以外の場合は引数として指定されたファイル記述子に対してゼロを返します。
module tb;
reg[8*45:1] str;
integer fd;
initial begin
fd = $fopen("my_file.txt", "r");
// Keep reading lines until EOF is found
while (! $feof(fd)) begin
// Get current line into the variable 'str'
$fgets(str, fd);
// Display contents of the variable
$display("%0s", str);
end
$fclose(fd);
end
endmodule
fdisplay への複数の引数
$fdisplay
に複数の変数を与える場合 、指定された順序ですべての変数をスペースなしで次々に出力するだけです。
module tb;
reg [3:0] a, b, c, d;
reg [8*30:0] str;
integer fd;
initial begin
a = 4'ha;
b = 4'hb;
c = 4'hc;
d = 4'hd;
fd = $fopen("my_file.txt", "w");
$fdisplay(fd, a, b, c, d);
$fclose(fd);
end
endmodule
シミュレーションログ 10111213
データを文字列にフォーマットする
$sformat
の最初の引数 システム関数は、結果が配置される変数名です。 2 番目の引数は format_string です これは、次の引数を文字列にフォーマットする方法を示します。
module tb;
reg [8*19:0] str;
reg [3:0] a, b;
initial begin
a = 4'hA;
b = 4'hB;
// Format 'a' and 'b' into a string given
// by the format, and store into 'str' variable
$sformat(str, "a=%0d b=0x%0h", a, b);
$display("%0s", str);
end
endmodule
シミュレーションログ xcelium> run a=10 b=0xb xmsim: *W,RNQUIE: Simulation is complete.
Verilog