テストベンチ
基本文法
もっともシンプルな例
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