Tclベースのインタラクティブテストベンチでハードウェア検証を強化
インタラクティブテストベンチとは、シミュレーション実行中にオペレータがデバイス・アンダー・テスト(DUT)へ入力を与えるシミュレータセットアップです。通常、シミュレータコンソールでコマンドを入力し、DUTに刺激を与えます。
自己検証型テストベンチを常に作成すべきですが、インタラクティブテストベンチは有用な補完となります。アドホックなテストをインタラクティブテストベンチで行う方が、自己検証テストベンチのコードを修正するより容易です。
ラボで発見した問題をテストベンチで再現したい場合、観察された入力シーケンスをシミュレータにタイプするだけで、望ましくない動作を再現できます。
TclとVHDLの連携
ほとんどのVHDLシミュレータはコンソール言語としてTclを採用しています。シミュレータ固有のコマンド群がありますが、それらは他のTclコマンドと同様に扱えます。Tclを用いて、VHDLテストベンチの管理・支援のための複雑で移植性の高いスクリプトを作成できます。
TclからVHDL信号を変更する
VHDLと対話するには、信号値を変更するコマンドを見つける必要があります。ModelSimではforceコマンドです。コマンドリファレンスによると、シンタックスは以下の通り。
force {<object_name> <value> [[@]<time_info>][, <value> [@]<time_info>]... [-deposit | -drive | -freeze] [-cancel [@]<time_info>] [-repeat [@]<time_info>]
使用すべきスイッチは-depositフラグです。これによりVHDL信号の値を即座に変更し、後で別のVHDLまたはTclドライバが別の値に変更できるようにします。
未使用オプションを省略した簡略シンタックス:
force -deposit <signal_name> <value>
VHDLトリガー
TclからVHDL信号を制御する方法が分かったので、VHDLテストベンチ側に受信プロセスを作成します。以下は最小限のテストベンチ例です。
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity interactive is
end interactive;
architecture sim of interactive is
-- Tclで制御される信号
signal trigger : std_logic := '0';
begin
process is
begin
wait until trigger = '1';
report "Triggered!";
end process;
end architecture;
このプロセスはtrigger信号が'1'に変化するとウェイクアップし、コンソールに「Triggered!」と出力します。これによりTclからVHDLプロセスを制御する概念をテストできます。
ModelSimコンソールで実行したコマンドと出力は以下の通り。
VSIM 1> run 10 ns; VSIM 2> force -deposit /trigger '1' VSIM 3> run 0 ns; # ** Note: Triggered! # Time: 10 ns Iteration: 0 Instance: /interactive VSIM 4> force -deposit /trigger '0' VSIM 5> run 10 ns;
シミュレーション開始後10ns実行。triggerを'1'にフォース。次にrun 0 nsでデルタサイクルを発生させ、シミュレーション時間を進めずにプロセスをトリガー。最後にtriggerを'0'に戻して継続。プロセスがウェイクアップし「Triggered!」が出力されたことが確認できます。
TclでVHDL信号値を読み取る
ModelSimで信号値を読むにはexamineコマンドを使用。例えばtrigger信号:
VSIM 6> examine /trigger # 0
スクリプトで使用する場合はTcl変数に代入:
VSIM 7> set triggerVal [examine /trigger] # 0
変数を出力:
VSIM 8> puts "triggerVal: $triggerVal" # triggerVal: 0
各テスト後にシミュレータを停止
DUTが反応するまで十分な時間シミュレーションを実行する最も簡単な方法は、固定時間でrunコマンドを実行することです。例えばDUTが2クロックサイクル後に反応し、クロック周期が10nsならrun 20 nsとします。
DUTの反応時間が固定でない場合、VHDLアサーションでシミュレーションを停止し、Tclコールバック関数に制御を渡せます。ModelSimではTclスクリプトからwhenコマンドでブレークポイントを設定:
when [[-fast] [-id <id#>] [-label <label>] {<when_condition_expression>} {<command>}]
また、ブレークポイントヒット時に実行されるonBreakコールバック関数をTclで定義する必要があります(ModelSimコマンドリファレンスに仕様あり)。
Tcl駆動テストの欠点
Tclスクリプトに大きく依存するテストベンチには欠点があります。最も顕著なのは速度と移植性の問題です。
- 速度:Tcl駆動テストベンチはシミュレータを繰り返し起動・停止してVHDLコードと対話します。シミュレーションを停止してTcl関数を実行し、再開するのは、VHDLテストベンチを連続実行するより時間がかかります。Tclはインタプリタ言語、VHDLはシミュレータ内でコンパイルされ、はるかに高速に動作します。
- 移植性:Tcl自体は他シミュレータへ移植可能ですが、使用せざるを得ないシミュレータ固有コマンドは移植できません。同等コマンドが見つかっても動作が異なる場合があります。ベンダー各社が独自のコマンドルールを定めているため、Tcl駆動テストベンチは純粋なVHDLテストベンチより移植性が低いと見なされます。
新しいVHDLとFPGAコース
* テストベンチを深く掘り下げた新しいVHDLとFPGAコースを作成中です。FPGA設計をゼロから作成し、自己検証テストベンチの作成方法、コード再利用によるインタラクティブテストベンチ作成を学べます。
* 2020年10月12日更新: コースを完了しました。下記画像をクリックで詳細。
作成する製品はドットマトリクスLEDコントローラモジュール。$49のLattice iCEstick開発ボードを使用。最終的にはブレッドボード上で実装。PCキーボードでタイプした文字がFPGA制御のドットマトリクスLED画面に表示されます。
ドットマトリクスVHDL/FPGAコースの詳細はこちら!
開講:
未定。
VHDL
- ZigbeeセンサーとGravioエッジプラットフォームでインタラクティブレーザープロジェクターを構築
- フライス盤を旋盤に転用:金属加工者のための簡単ステップ
- C# usingステートメント完全ガイド:名前空間インポート、エイリアス、静的ディレクティブ
- VHDL入門:最初のANDゲートを作る
- VHDL型変換完全ガイド:Numeric_StdとStd_Logic_Arithパッケージ活用
- VHDLプロシージャ例:std_logic_vectorのインクリメント
- VHDLレコードでクリーンかつ再利用可能なFIFOインターフェースを実現
- VHDLにおけるSignedとUnsigned型の使い分け:実践的洞察
- VHDL変数の解説:実践例と信頼性設計のためのルール
- VHDLで文字列リストを作成する: ベスト・プラクティスと実装例
- VHDLで自己検証テストベンチを構築する実践ガイド