Article header library hdl first article header  4

はじめてみよう!テストベンチ ~Verilog-HDL 編~

モジュールの書式

Verilog-HDL の場合、テストベンチを作成する時もデザインを作成する時と同じように module <モジュール名> から始めます。しかし、一般的にテストベンチには入出力ポートが存在しないため、モジュール名の後にポート・リストを記述する必要はありません。また、入出力ポートの宣言も必要ありません。従って、各種宣言や機能記述のところには検証対象となるデザインへ入力する信号の入力条件を HDL で記述していきます。

Article header tb verilog fig 1  2

モジュールの書式(詳細) & 信号の宣言

Article header tb verilog fig 2  1

「各種宣言と機能記述」をもう少し細かくすると、「信号の宣言」と「下位階層(デザインのトップ階層)の呼び出し」、「下位階層(デザインのトップ階層)への入力条件の記述」に分けることができます。 「信号の宣言」のところは、先ほども触れたようにテストベンチには入出力ポートが存在しないので、input outputinout を使用したポートの属性を宣言する必要はありません。テストベンチではテスト入力として使う信号のデータ型を レジスタ宣言(reg 宣言)し、反対に検証対象の出力ポートに接続するテストベンチで値を与えない信号のデータ型は ワイヤー宣言(wire 宣言)します。

Article header tb verilog fig 3  1

下位階層(デザインのトップ階層)の呼び出し

Article header tb verilog fig 4  1

下位階層(デザインのトップ階層)の呼び出し」のところは、デザインで一般的に使用する下位階層の呼び出しの記述とまったく同じです。(ここでは、デザインのトップ階層のインスタンス名を仮に “u1” としています。)

Article header tb verilog fig 5  1

下位階層(デザインのトップ階層)への入力条件の記述

Article header tb verilog fig 6  1

次に「下位階層(デザインのトップ階層)への入力条件の記述」について解説します。 ここでは、主に、

  1. 常にレベルが固定している信号の記述
  2. 一定間隔で値がインクリメントする信号の記述
  3. 非定期的に ‘1’(H レベル)と ‘0’(L レベル)を繰り返す信号の記述
  4. 定期的に ‘1’(H レベル)と ‘0’(L レベル)を繰り返す信号の記述

について説明します。これらをマスターすれば、テストベンチを自分で書けるようになります。

なお、ここで紹介した以外の記述方法もありますので、後々勉強して習得してください。

1. 常にレベルが固定している信号の記述

シミュレーションの開始には、initial 文を記述します。記載した式が1度だけ実行されます。シミュレーション実行中にレベルの変化がない信号は、initial 文に続いて信号名とレベルを記述すれば良いです。

Article header tb verilog fig 7  1

2. 一定間隔で値がインクリメントする信号の記述

まず、initial begin の後に初期値を記述します。その後 always 文を使って一定間隔でインクリメンタルする式を記述します。

Article header tb verilog fig 8  1

3. 非定期的に ‘1’(H レベル)と ‘0’(L レベル)を繰り返す信号の記述

非定期的にレベルが変化する信号は、1つの initial 文begin ~ end を使って、その間に複数の式を記述します。

Article header tb verilog fig 9  1

バスなどの複数ビットがまとまった信号は、以下のように記述します。8ビットの信号であれば、8’b の後に各ビットのレベルを記述します。b2進数の意味です。h を使って 16進数表示も可能です。

Article header tb verilog fig 10  1

4. 定期的に ‘1’(H レベル)と ‘0’(L レベル)を繰り返す信号の記述

クロックのように定期的に ‘1’(H レベル)と ‘0’(L レベル)を繰り返す信号を記述する時は、先ほどのような方法で永遠に記述する必要はなく、以下のように記述します。ここでは、2つの記述方法を紹介します。どちらも同じ入力条件になります。
  • 方法1

Article header tb verilog fig 11  1

  • 方法2

Article header tb verilog fig 12  1

サンプル・デザイン

以下のページから、演習データを参考としてダウンロードできます。このサンプルではテストベンチの記述も使われているので、参考にしてください。


Article header coffeebreak 2  2

コーヒー・ブレイク:`timescale

テストベンチの冒頭に `timescale の記述を見かけたことはありませんか?これはシミュレーション時刻の単位を指定するための記述です。

単位(fs, ps, ns, us, ms, s)を添えて記述します。`timescale の記述は、通常はテストベンチにのみに記述します。

  `timescale <1タイムスケールあたりの実時間> / <丸めの精度>

Article header tb verilog fig 13  1

それから、式の中におけるシミュレーション時刻を記述する位置については、下記のどちらでも大丈夫です。

Article header tb verilog fig 14  1

Article header coffeebreak 2  3

コーヒー・ブレイク:$finish

テストベンチ中の式に $finish という記述を見かけます。これは、この行まで実行されるとシミュレーションが終了するというものです。この $finish がないと、シミュレーションが終了しません。時間指定してシミュレーションすれば $finish がなくても終わりますが、時間指定なしでシミュレーションを実行した場合は、この $finish を見付けてそこまで到達したら終了させます。どこか1か所で良いので、この $finish を入れましょう!

Article header tb verilog fig 15  1

おすすめの記事/資料はこちら

関連タグ