Verilog テストベンチ

Verilog テストベンチとは?

VerilogまたはVHDLのテストベンチ(test bench)とは、FPGAやLSI/ASIC開発において、VerilogまたはVHDLで記述した回路が期待通りの動作をしているか確認するための、一連のファイルのことです。テストベンチファイルには、入力信号、クロック、リセット信号などを記述し、それらの信号を回路記述したデザインファイルに送り、出力を期待値と照合することで設計の検証を行います。

図1. テストベンチとHDLシミュレーター、デザインファイル

図1. テストベンチとHDLシミュレーター、デザインファイル

通常は回路のデザインファイルと同じ言語で記述されます。デザインファイルは、論理合成・配置配線を行い、回路としてFPGAやASICに実装されるのに対し、テストベンチファイルはシミュレーションでのみ使用されます。テストベンチは通常、実機に実装する前に実行して、設計の欠陥を発見するのに役立て、回路の品質と信頼性を向上させることができます。

VerilogやVHDLで記述するデジタル回路においては、回路を動作させるためにクロック、リセット、クロックイネーブルなどの信号を入力する必要があります。入力信号は、時系列のベクトルデータとして定義します。テストベンチにおいて、クロック、リセット、クロックイネーブルに加えて、デザインファイル用の入力信号のことをスティミュラス(Stimulus)、入力信号と出力信号の期待値をテストベクタ(Test vector)と呼びます。また、動作を検証するためには、デザインファイルの出力を期待値のデータと照合して合否を判定する条件を記述します。条件には、出力信号の期待される値、許容誤差、タイミングチェックなどが含まれます。

図2. テストベンチのファイル構成

図2. テストベンチのファイル構成

デザインファイルはFPGA/ASIC実装が前提で、論理合成を行う必要があるので、論理合成可能な記述を行う必要があります。他方、テストベンチファイルは論理合成を行わずに、シミュレーションのみで使用されるファイルのため、論理合成できない様々な記述、例えばファイルI/Oや文字列表示などの記述を行うことができます。

テストベンチで扱うことができる記述スタイル(ファイルI/Oや標準入出力)

テストベンチはシミュレーションのみで使用されるため、論理合成出来ない記述をすることも可能です。例えばテストベクタは、別ファイルに記述したデータをファイルI/O記述を使って読み込みます。

Verilog HDLではシステムタスクによる標準入出力、ファイルI/O、三角関数などの数学関数を扱う関数が用意されています。$fopen, $fclose, $fscanf, $display, $monitorなどがあります。ファイルからデータを読み込むには次のように記述します。

fp = $fopen("data_in0.dat", "r");
outputData = $fscanf(fp, "%h", dataFormat);

エラーや合否判定結果は次のように$displayを使って記述し、シミュレータに文字列を出力します。

if (ce_out == 1'b1 && Out1 !== Out1_ref) begin
      Out1_testFailure <= 1'b1;
      $display("ERROR at time %t : Expected '%h' Actual '%h'", $time, expextedData, outputData);
end

VHDLには同様の機能として、TEXT I/O機能があります。これを利用するためには、パッケージを呼び出す必要があります。

LIBRARY IEEE;
USE IEEE.std_logic_textio.ALL;
LIBRARY STD;
USE STD.textio.ALL;

次にファイルを呼び出して、ファイルから1行ずつデータを取得します。

VARIABLE l: LINE;
FILE fp: TEXT open READ_MODE is "data_in0.dat";
READLINE(fp, l);  -- 1行読み出す
HREAD(l, outputData);  -- 読み出した16進数値を変数に代入

エラーや合否判定は次のようにREPORTを使って記述し、シミュレータに文字列を出力します。

IF ce_out = '1' AND Out1_signed /= Out1_ref THEN
      Out1_testFailure <= '1';
      ASSERT FALSE
      REPORT "Error : Expected " & to_hex(expectedData) & (" Actual " & to_hex(outputData))
      SEVERITY ERROR;
END IF;

テストベンチの肝はスティミュラスと期待値

テストベンチを作成する際には、まずクロック、リセット、クロックイネーブルなどの回路を制御する信号を定義します。次に、回路を駆動するためのスティミュラスを考え、その処理結果となる期待値を作成して行きます。

スティミュラスを作る際に重要なこととして、次のことを考慮します。

  • 実際のユースケースに沿った信号となっていること
  • 設計対象の回路をできるだけ網羅的にテストする信号となっていること
    • HDLシミュレータの中には網羅性=カバレッジ率を測定できるものもがあります。
    • 100%のカバレッジを満たすのは現実的に難しいので、妥協やツールの手助けも必要です。
  • 実行時間がかかりすぎないこと
    • 網羅的なテストをするために長尺の信号を作成して、シミュレーションに1年かかってしまうようでは、現実的に使用することができないので、実行時間を考慮する必要があります。

期待値との比較を行う際に重要なこととして、次のことを考慮します。

  • クロックサイクル、ビット精度を正確に表現した値となっていること
    • クロックサイクルで動作する設計対象内のパイプライン処理を考慮したレイテンシが正確に反映されている必要があります。でないと設計対象の出力と期待値のタイミングがずれてしまい、照合結果が合わなくなります。
    • 丸め誤差を含めたビット精度を正確に表現していないと、期待値と出力の間に誤差が発生する可能性があります。
  • 結果の合格、不合格を判断できる内容となっていること
    • 期待値と出力を照合して、合格、不合格を判断し、文字列を出力するなどして合否結果を示します。

コード例

always @(posedge clk)
   begin : completed_msg
     if (check1_done == 1'b1) begin
       if (testFailure == 1'b0) begin
         $display("**************TEST COMPLETED (PASSED)**************");
       end
        else begin
         $display("**************TEST COMPLETED (FAILED)**************");
       end
      end
    end
図3. 結果を文字列で示すHDLシミュレータ実行画面

図3. 結果を文字列で示すHDLシミュレータ実行画面

テストベンチを実行するHDLシミュレータ

テストベンチの実行には、VHDL/Verilogコードを実行するHDLシミュレータを利用します。ASICやFPGA開発用にEDAソフトウェアベンダー各社からHDLシミュレータが販売されています。

  • SIEMENS社(旧Mentor社) ModelSim, Questa advanced simulator
  • Cadence社 Xcelium(旧Incisive)
  • Synopsys社 VCS®
  • Aldec社 Rivera-PRO™, Active-HDL™

フリーのHDLシミュレータも入手できます。

AMD社はFPGA設計ツールVivado®にHDLシミュレータを同梱しており、追加料金無しで使用できます。

図4. AMD Vivado SimulatorでHDLシミュレーションを行った結果

図4. AMD Vivado SimulatorでHDLシミュレーションを行った結果

テストベンチの重要性

Wilson research Groupによる調査では、FPGAプロジェクトで検証に使われた時間の中央値は40-50%という結果が出ています。設計を効率化するCベース高位合成やモデルベースデザイン (モデルベース開発、MBD)などの新しい手法だけでなく、検証においても効率化手法に対する関心が高まっています。アサーション・ベース検証、UVM、モデルベースデザインについての詳細は後述します。

図5. 検証に割かれるFPGAプロジェクト時間の割合

図5. 検証に割かれるFPGAプロジェクト時間の割合

テストを効率化する新しい検証手法

テストを効率化するために、次のような新しい検証手法が使用されています。

  • アサーション・ベース検証 (ABV):設計対象やそのインターフェイスに期待される内部動作を定義しておき、自動的にそれを監視しながらシミュレーションを実行する検証手法です。SVA (SystemVerilog Assertions)やPSL (Property Specification Language)が代表的な言語です。
  • UVM (Universal Verification Methodology):再利用性による効率化を目的に、検証分野で推奨されている技術、ルール、慣習、規律等をコードとして具体化したSystemVerilogのクラス・ライブラリーです。
  • モデルベースデザイン (モデルベース開発、MBD):設計対象および影響を与える周辺環境も含めたシステムレベルでモデリングしたものを、シミュレーション~自動コード生成・テストベンチ生成を行って設計する手法です。ブロック線図状態遷移図で描いたモデルから、等価なVHDL/Verilogコードの回路記述およびテストベンチを自動生成します。

テストベンチの作成例

いくつかのフォーマットで作成されたテストベンチの作成例を見てみましょう。

VHDL/Verilogテストベンチ

このテストベンチはテストベンチ本体、スティミュラスと期待値のデータ、合計3種類のファイルで構成しています。これらのファイルと設計対象のファイルをHDLシミュレータで実行して、期待通りの動作をしているかどうかの検証を行います。

※Simulinkモデルから自動生成されたテストベンチです。

VHDL/Verilogテストベンチ

Simulinkモデルで作成されたHDLテストベンチです。上側に置かれているブロック線図モデル(DUT)と、下側に置かれているHDLコードをシミュレーションするブロック(DUT_vs)に対して、ダイナミックに等価性検証を行う仕組みになっています。HDLコードの実行はHDLシミュレータで行われ、HDLシミュレータとSimulinkが連携(Co-simulation)して動作します。入力信号の種類や特性は、ブロックパラメータで変更できるため、スティミュラスの変更が容易というメリットがあります。

図6. コシミュレーションモデル外観

図6. コシミュレーションモデル外観

System Verilog DPI コンポーネント生成およびUVMテストベンチ

テストベンチをスティミュラス/期待値のデータセットではなく、Simulinkモデルと等価なビヘイビア記述として生成する機能がSystem Verilog DPIです。もともとSystem VerilogにはDPI-C(Direct Programming Interface)と呼ばれるCコードの関数を、簡単な記述で呼び出す非常に便利な機能があります。System Verilog DPI コンポーネント生成機能は、この機能を用いてHDLシミュレーション可能な、MATLABやSimulinkモデルから生成したビヘイビア記述のCコードと、ラッパーとなるSystem Verilogコードを自動生成します。

大規模ASICの開発では、System Verilogで記述されるUVM(Universal Verification Methodology)を使用して、フレームワーク化したテストベンチにおいて、そこで使用されるコンポーネントを再利用しやすいようにライブラリ化しています。MATLAB/Simulinkモデルから、このUVMのフレームワークで使用できるコンポーネントを生成することができます。

System Verilog DPI コンポーネント生成について:HDL Verifier > Verification with UVM and SystemVerilog Components

FPGA実機のテストベンチ

HDLコードでのシミュレーションの利点は、クロックサイクルで手軽に回路記述をテストできる点です。その際、任意のポイントで波形をモニターでき、詳細なレベルまで回路動作を確認することができます。欠点は、回路規模やスティミュラスのデータ量の増大によって、テストベンチ作成やシミュレーション実行の時間が増大してしまうことです。FPGA実機でのテストは、モニターできるポイントやサンプル数には物理的な成約があるものの、そのような問題を解決してくれる側面があります。

ロジック アナライザー実機をFPGAボードに接続

オシロスコープよりも、たくさんのチャンネルを同時に測定できるデジタル信号の解析に特化した測定器です。FPGAのピンにプローブを接続して波形をモニターしてデバッグします。実機で生じている問題をリアルタイムで解析できる利点がある一方、不具合の再現性に難がある点や、プローブを接続して波形表示の設定をするなどの手間がかかる点が欠点です。キーサイト テクノロジー社、テクトロニクス社など測定機器メーカーが販売しています。

インサーキットテスタ

FPGAの内部信号を取得してPC上で表示する機能です。追加でFPGAのI/Oピンを設定したり、高価な測定器を接続したりすることなく、動作中のデバイスの内部信号を、FPGA内部のRAMにロギングし、取得後データをPCにアップロードしてモニターします。HDLコードを論理合成する前に、予め取得ポイントの設定を行っておく必要があります。この機能はFPGAメーカーおよび関係各社が提供しています。

  • AMD社 Integrated Logic Analyzer
  • Intel社 Signal Tap Logic Analyzer
  • Microchip社 SmartDebug
  • MathWorks社 FPGA Data Capture
図7. FPGA Data Capture

図7. FPGA Data Capture

FPGA-In-the-Loop(FIL)

モデルベースデザイン (モデルベース開発、MBD)で利用されるモデルとFPGA間の等価性検証手法の一つです。この機能では、USB-JTAG/Ethernet/PCI Expressなどのインターフェイスにより通信を行い、MATLAB/Simulinkで作成したテストベンチを使用してFPGAを動作させて検証を行います。HDLコシミュレーションよりも大幅に高速に動作するため、膨大な量のスティミュラスを使用したり、検証時間を短縮したりする効果があります。

図8. FPGA-In-the-Loop

図8. FPGA-In-the-Loop

PC上で動作するMATLABおよびSimulinkはFPGAと比較すると実行速度が遅いので、FPGAはスティミュラスを待ちながら動作することになります。そのため、リアルタイムでのタイミングやペリフェラルを含めた動作検証というよりも、論理の正しさを検証するための機能となっています。

AXI Manager

AXI ManagerもFPGA-In-the-Loopと同様にPCからFPGAにアクセスする機能ですが、リアルタイムで動作するオンボードFPGA内のレジスタや接続されているDDRメモリに対してRead/Writeを行ってデバッグをするために利用します。

本機能のインターフェイスもUSB-JTAG/Ethernet/PCI Expressを選択できます。

図9. AXI Manager

図9. AXI Manager

参考: FPGA、ASIC、および SoC 開発向け MATLAB, HDL Coder, HDL Verifier, Vision HDL Toolbox, MATLAB Coder, Simulink Coder