1. 株式会社PALTEK
  2. TECHブログ
  3. 技術情報
  4. 【FPGAテストベンチ/検証ノウハウ】テストベンチTEXTIOの使い方 (Verilog編)

TECHブログ

【FPGAテストベンチ/検証ノウハウ】テストベンチTEXTIOの使い方 (Verilog編)

【FPGAテストベンチ/検証ノウハウ】テストベンチTEXTIOの使い方 (Verilog編)

関連ウェビナー

今回はTEXTIOを使用してテストベンチを説明します。
前回 のVHDL版と違ってVerilogではC言語を使える人にはわかりやすい構造となっています。
それでは始めましょう。

目次

入出力ファイルの登録

ここでは上位から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版では文字列を直接扱えるのはSystem Verilogからとなるため、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の識別子、実行サンプルについてお話しました。
最後までご覧いただきましてありがとうございました!

今回説明した内容などでのご質問がありましたら、下記よりお問い合わせください。

お問い合わせはこちら

このブログのシリーズ

関連ブログ