テストベンチ

基本文法

もっともシンプルな例

module テストベンチ名;
reg 入力信号1;	//----+
reg 入力信号2;	//    +--(1)入力信号regの定義
reg 入力信号3;	//----+

wire 出力信号1;	//----+
wire 出力信号2;	//    +--(2)出力信号wireの定義
wire 出力信号3;	//----+

観測目的のmodule名 インスタンス名(                     //--+
	/*                                              //  |
	  観測対象のmoduleのインスタンス定義            //  |
	 input,outputの接続の定義は以下の2種類	        //  |
	 1.[.信号ポート名(配線名"入出力信号など")]     //  +--(3)インスタンス定義
	 2.定義されている信号ポート順に配線名を並べる  //  |
	 注:配線の区切りは","で行う                   //  |
	*/                                              //  |
);                                                      //--+
initial begin                   //--+
		初期設定;       //  |
#(CYCLE)*2	印加記述1;      //  |
#(CYCLE)	印加記述2;      //  +--(4)信号印加
#(CYCLE)/4	印加記述3;      //  |
        :                       //  |
end                             //--+
endmodule

(1)入力信号regの定義

入力信号は「外部からの値の変化が無い限り、一定期間は同じ値を入力し続ける」という概念からreg宣言を行う
ここで宣言されたreg信号は入力信号として扱える。

(2)出力信号wireの定義

出力信号は、入力信号や内部処理によって変化するため、出力値の変化するタイミングはモジュールに依存するため、wire宣言で出力の変化を外部で観測する

(3)インスタンス定義

インスタンスの方法は上記のように2種類
1.[.信号ポート名(配線名"入出力信号など")]。並び順は任意。
2.観測対象で定義されている信号ポート順に配線名を並べる。
→配線ミスも考えられるので1.の方法が適当

(4)信号印加

観測対象に入力する信号を記述する。
外部モジュールの出力を使用することもできる。(クロックについては後述する)
遅延は"#(時間)"で表現できる。遅延は、前の信号からの遅延時間で表現する

クロック生成

よく使うクロック信号はモジュール化しておくと便利
※ここでは、リセット信号もよく使用することから同時に記述している
module clkgen (
  OCLK, ORST
  );

  parameter CYCLE=10;
  
  output OCLK;
  output ORST;

  reg OCLK;
  reg ORST;

  initial begin
     ORST=1'b1;
     #100;
     ORST=1'b0; 
  end
  
  initial begin
     OCLK=1'b0;
     forever
       #(CYCLE/2) OCLK=~OCLK;
  end
  
endmodule

ファイルの入出力

Verilogでもテストベンチではファイルの入出力を使用することができる。
文法はC言語と似ている。ただし、C言語とは違い、書き込み読み込みを行うタイミングを記述しなくてはならない

書き込み

$writememb:2進数の表記データの書き込み

書式:$writememb("入力ファイル名" , メモリ名 , [開始アドレス] , [終了アドレス]);

$writememh:16進数の表記データの書き込み

読み込み

$readmemb:2進数の表記データの読み込み

書式:$readmemb("入力ファイル名" , メモリ名 , [開始アドレス] , [終了アドレス]);

メモリ(memname)が"reg[7:0] memname[0:7]"のときのメモリファイルの書き方
(1)上から順にメモリ登録する場合
0000_0000
0000_0001
0000_0010
0000_0100
0000_1000
0001_0000
0100_0000
1000_0000
(2)アドレス指定
書式:@[アドレス] 値
アドレスの指定は16進数で行う

@6 0000_0000
@7 0000_0001
@3 0000_0010
@5 0000_1000
@2 0001_0000
@4 0010_0000
@0 0100_0000
@1 1000_0000

$readmemh:16進数の表記データの読み込み

書式:$readmemh("入力ファイル名" , メモリ名 , [開始アドレス] , [終了アドレス]);
詳細はreadmembの2進数が16進数となっただけで使用方法は同じ

最終更新:2009年04月23日 13:54