【FPGAテストベンチ/検証ノウハウ】テストベンチTEXTIOの使い方 (Verilog編)
今回はTEXTIOを使用してテストベンチを説明します。
前回 のVHDL版と違ってVerilogではC言語を使える人にはわかりやすい構造となっています。
それでは始めましょう。
このブログは「FPGA設計ブログ一覧」の
2. シミュレーションのひとつです。
目次
入出力ファイルの登録
ここでは上位からTEXTIOに使用するファイルを選択できるようにmodule部でparameter宣言にてファイルを登録しています。(下線部は任意の名前でOKです)
注意点としてファイルのパスを書かない場合はシミュレーターに依存しますので、ファイルを置く場所が決まっているのであれば絶対パスで記述したほうがよいです。
module tb_textio_verilog #(
parameter infile1 ="/PATH/textio_in.txt" , //読み込むファイルのパス
parameter outfile1 ="/PATH/textio_out.txt" //書き込むファイルのパス
) (
nput wire clk
);
integer宣言で入力と出力信号を宣言して、$fopenにて初期ファイル読み込みを行います。
$fopenで読み込むファイルは上記でparameter宣言した信号名と合わせます。
この際、”r”をつけると読み込み専用、”w”で書き込みも可能となります。
integer file_in, file_out;
initial begin
file_in = $fopen(infile1 , "r"); // 読み込み用
file_out = $fopen(outfile1, "w"); // 書き込み用
end
入力ファイルのサンプル
以下が入力テキストファイルのサンプルになります。
1100 0 F1000334 0000000C FF0F0000
1130 1 F1000334 00000000 00000000
1160 0 F1000334 00000000 FFFFFFF7
2360 0 F1000334 00000000 FF0F0000
2390 0 F1000338 00000000 FF0F0000
2420 0 F10000C0 00000000 00000000
2450 1 F10000F0 FFFFFFFF 00000000
2480 0 F10000F0 00000000 FFFFFFF0
- 実行時間(このCLK数後に実行)
- リードまたはライトの識別 (リード=0 / ライト=1)
- アドレス
- データ (リード時は期待値)
- マスク (リードのみ使用。リード値とorしてデータと比較します)
※VHDL版ではリードライトの識別をR/Wと文字列としていましたがVerilog版では文字列を直接扱えるのはSystemVerilogからとなるため、0/1の識別としています。
出力ファイルのサンプル
以下が入力テキストファイルに対する出力テキストファイルになります。
1100 1 f1000334 0000000c ff0f0000 OK
1130 0 f1000334 00000000 00000000 OK
1160 1 f1000334 00000000 fffffff7 OK
2360 1 f1000334 00000000 ff0f0000 OK
2390 1 f1000338 00000000 ff0f0000 OK
2420 1 f10000c0 00000000 00000000 OK
2450 0 f10000f0 ffffffff 00000000 1
2480 1 f10000f0 00000000 fffffff0 1
リード結果を表示しており、以下の内容を表示しています。
- 実行時間
- アドレス
- リード期待値
- 実リードデータ
- 期待値とのOK/NG判定
TEXTIOコマンド
コマンドは以下のとおりです。使用方法については後述します。
$fopen ファイルオープン
$fscanf 1行を読み込んで、文字列を型に合わせて信号に格納
$fdisplay 文字列を型に合わせて、ファイルに書き込み
$eof 読み込んだファイルの最後を検出
$fclose ファイルクローズ
流れとしては以下記載のとおりとなります。
- $fopenでファイルをオープン
- $fscanfで文字列を取得
- $fdisplayでファイルに文字列を格納
- $eofを検出したら$fcloseでファイルをクローズ
$fcacnf/$fdisplayの識別子
%b 文字列をバイナリで処理
%h 文字列を16進数で処理
%d 文字列を10進数で処理
実行サンプル
以下がTEXTIOを使った処理のサンプルになります。
module tb_textio #(
parameter infile1 ="textio_in.txt" , //読み込むファイルのパス
parameter outfile1 ="textio_out.txt" //読み込むファイルのパス
)
(
input wire clk
);
integer file_in, file_out;
wire [31:0] TIME;
wire RW;
wire [31:0] ADR;
wire [31:0] DAT;
wire [31:0] MASK;
reg cycle_busy =0;
reg [31:0] cnt =0;
wire [31:0] readdata;
always @(posedge clk) begin
cnt <= cnt +1;
end
initial begin
file_in = $fopen(infile1 , "r");
file_out = $fopen(outfile1, "w");
end
always @(posedge clk) begin
if ($feof(file_in) !=1) begin // 読み込みファイルがEOF=1でなければ実行
if (cycle_busy == 0) begin
$fscanf(file_in, "%d %b %h %h %h\n", TIME,RW,ADR,DAT,MASK);
if (TIME < cnt) begin
cycle_busy <= 0;
end else begin
cycle_busy <= 1;
end
end else begin
if (RW ==0) begin //リード処理
//※【ライト処理】
cycle_busy <=0;
end else begin //write
//※【リード処理readdataを取得】
//データチェック
if (readdata == (DAT | MASK)) begin
$fdisplay(file_out, "%d %b %h %h %h OK", TIME,RW,ADR,DAT,MASK);
end else begin
$fdisplay(file_out, "%d %b %h %h %h NG", TIME,RW,ADR,DAT,MASK);
end
cycle_busy <=0;
end
end
end else begin
$fclose(file_out); //EOFでファイルクローズ
end
end
endmodule
以上です。
今回は、テストベンチTEXTIOの使い方(Verilog編)と題して、 入出力ファイルの登録、入力/出力ファイルのサンプル、TEXTIOコマンド、 $fcacnf/$fdisplayの識別子、実行サンプルについてお話しました。
最後までご覧いただきましてありがとうございました!
このブログは「FPGA設計ブログ一覧」の
2. シミュレーションのひとつです。
今回説明した内容などでのご質問がありましたら、下記よりお問い合わせください。
ModelSim/Questa エディション比較表はこちらをご覧ください。