初歩からの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
© Copyright 2024 ExpyDoc