初歩からのHDLテストベンチ 初歩からのHDLテストベンチ

初歩からのHDLテストベンチ
第 6 回 タスク/プロシージャの記述方法
安岡貴志
デバイスの記事
ビギナーズ
HDL で回路を記述できるようになったばかりで,これからテ
の順次処理文(initial 文,process 文)に書こうとする
ストベンチを書こうとしてる方を対象とした連載の第 6 回であ
と,大変な行数になります.行が多くなればなるほど,書
る.前回までで for 文などプログラム的な記述や,各種システ
くのが大変になるだけではありません.一目でそのテスト
ム・タスク/プロシージャによる標準出力,ファイル入出力の
が何をしているのかが分からなくなり,思わぬ動きをした
文 法 を解 説 してきた. これらはすべて一 つの順 次 処 理 文
ときに不具合の原因を突き止めるのも大変になります.
(initial 文,process 文)の中だけで実行される平坦な記述方
そこで,テストの規模が大きくなると,テストベンチを
法である.今回はタスク/プロシージャを使用したテストベン
構造化する事が必須になってきます.テストベンチを構造
チの構造化を解説する.
化するには,Verilog HDL であればタスク,VHDL であれ
(筆者)
ばプロシージャを使用します.これらは,メインのルーチ
ン(テスト入力)に対するサブルーチン(サブプログラム)の
1.テストベンチの構造化
役割を果たします.記述量や間違いを減少させ,読解性や
テストに必要な機能の記述,特にテスト入力をただ一つ
平坦なテストベンチ
構造化したテストベンチ
平坦なテストベンチ
構造化したテストベンチ
initial文
initial文
処理ABC(task)
process文
process文
処理ABC(procedure)
begin
begin
task
begin
begin
begin
1
1
A
1
1
A
A
B
C
処理ABC
B
処理ABC
B
2
C
A
B
C
2
C
2
処理ABC
endtask
2
処理ABC
end
A
B
C
3
A
B
C
3
end
3
3
end
end
(a)Verilog HDL
図1
デバッグの効率を高めます(図 1).
end
(b)VHDL
テストベンチの構造化
テストの規模が大きくなってくると,テストベンチの構造化が必須になる.
Keyword
テストベンチ,構造化,タスク,プロシージャ,task,procedure,クロック・エッジ,タイミング制御,イベン
ト,repeat,バス動作
Design Wave Magazine 2008 April 119
task count_updown;
引き数宣言
内部信号宣言
input dir;
仮引き数
UP = dir;
#(STEP*20);
処理の記述
end
endtask
引き数宣言
処理の記述
タスク名(引き数,引き数,...);
…
begin
begin
initial begin
…
task タスク名;
end
(c)taskの呼び出しの書式
end
endtask
(a)task定義の書式
(b)task定義の記述例
module
印加する信号のreg宣言
initial begin
…
実引き数
…
end
(d)taskの呼び出しの記述例
タスクの中で参照する
テスト対象呼び出し
output
タスクの中で代入する
task
inout
タスクの中で参照/代入する
input型の引き数は,定数,ネット型(wire),
レジスタ型(reg)を実引き数にできる.
output,inout型の引き数は,レジスタ型(reg)
だけしか実引き数にできない
(e)引き数宣言
taskの定義
…
count_updown(1'b1);
input
endtask
initial begin
・テスト入力作成
・taskの呼び出し
end
endmodule
(f)テストベンチの構成
図2
タスクの書式と記述例
テストベンチを構造化するには,Verilog HDL であればタスクを使う.
● タスクの文法
Verilog HDL
入されます.
図 2(e)は,引き数が取り得る型(方向)を表しています.
図 2(a)はタスク定義の書式です.内部信号宣言は,タ
input 型で宣言される引き数には,呼び出し時の引き数と
スク内部だけで使用する信号を宣言します.処理の記述に
してテストベンチの中の定数,ネット型(wire),レジス
は,図 1(a)の A,B,C の処理のように,構造化したい
タ型(reg)のどれが与えられてもかまいません.output,
(まとめたい)処理を記述します.引き数宣言は後述します.
inout 型で宣言される引き数には,呼び出し時の引き数と
図 2(b)にタスク定義の記述例を示します.仮引き数 dir
はタスクの中にしか現れない引き数です.タスクの呼び出
し時には,与えられた引き数と置き換えられます.
処理の記述内にある信号 UP は,タスクを呼び出してい
して,レジスタ型の信号しか与えてはなりません.
図 2(f)は,テストベンチの構成を示しています.タスク
の定義は,タスク内で印可する信号の reg 宣言よりも下,
タスクを呼び出す initial 文よりも上に書きます.
るテストベンチの階層に存在する信号です.タスクが呼び
出されたのと同じ階層に存在する信号を参照したり,その
信号に代入するのに,その信号を引き数として宣言する必
要はありません.また,タスクの中には遅延などのタイミ
ング記述を行うことができます.
● プロシージャの文法
VHDL
図 3(a)に,プロシージャ定義の書式を示します.引き
数には,引き数名と方向,データ・タイプが必要です.ク
図 2(c)はテスト入力を生成する initial 文の中で,タ
ラスは省略することもできます.その場合,入力であれば
スクを呼び出す書式を示しています.引き数が複数ある場
constant,出力か入出力(双方向)であれば variable と
合,定義部分で引き数として宣言する順番と,呼び出しの
して扱われます.呼び出し側で signal となっている出力,
際に与えられる引き数の順番が一致するものが参照・代入
入出力の引き数は,クラスを signal で宣言する必要があ
されます.
ります.入力についても,呼び出し側で signal となって
図 2(d)で与えられた実引き数 1'b1 は,図 2(b)のタス
いて,プロシージャの外の信号の変化をプロシージャ内に
クの中では dir と置き換えられるので,UP には 1'b1 が代
反映させたい場合は,signal で宣言しなければなりませ
120 Design Wave Magazine 2008 April