Main Content

このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。

UVM テストベンチにドライバーとモニターを含める

この例では、関数uvmbuildを使用して、 Simulink®デザインとテスト ベンチからの UVM ドライバーとモニターを含む Universal Verification Methodology (UVM) テスト ベンチを生成します。

はじめに

Simulinkでフレームベースの動作モデリングからスカラー モデリングに移行するには、信号のサンプル時間とサイズを変換する変換ブロックが必要です。変換ブロックは、 Simulinkテストベンチをこれら 2 つのドメインに分割します。

  • フレームベースのドメイン:データをフレームとして操作および操作するテストベンチの部分。

  • スカラーベースのドメイン:データをスカラーとして操作および操作するテストベンチの部分。

UVM フレームワークは、トランザクション レベル モデリングを使用して、シーケンスからのトランザクションを処理し (スティミュラス ジェネレーター)、結果のトランザクションをスコアボードで検証します (チェッカー)。

Simulinkテストベンチを UVM テストベンチに変換する場合、これらのドメインを分離しておくことが重要です。ドメインの分離により、テストベンチ コンポーネントのコンポーネント化と再利用性が向上します。

Simulinkでの設計とテスト

スカラーベースのアルゴリズムを作成し、変換サブシステム (バッファーとアンバッファー、レート遷移、またはこれらのブロックの組み合わせなど) を使用してフレームベースのドメインとスカラー ドメインを分離するテストベンチをその周りに追加します。このモデルは、スティミュラス生成サブシステム、スカラーベースのテスト対象設計 (DUT)、および応答チェック サブシステムで構成されます。追加の変換サブシステムがスティミュラス生成と DUT の間に導入され、データをフレームからスカラーに変換します。また、DUT と応答チェッカーの間に導入されて、データをスカラーからフレームに変換します。

この例では、Simulinkを使用してパイプライン除算コーディック アルゴリズムを設計およびテストし、指定されたパイプライン ステージ数の最大エラーしきい値を決定します。この設計では、7 つのパイプライン ステージがテストされます。

設計にはSimulinkの 2 つのサンプル時間が含まれています。

  • 遅いサンプル時間 (緑色) は、DUT でテストされている下位レベルのアルゴリズムに依存しない高レベルのトランザクションとして動作します。この例では、トランザクションは 3 つのベクトル、分子、分母、および Cordic アルゴリズムからの除算の結果で構成されます。

  • 高速サンプル時間 (赤) はスカラーで計算されます。パイプライン DUT は赤色のサンプル時間で 2 つのスカラーをサンプリングし、結果として得られるコーディック除算の結果は、有効な出力信号がアサートされたときに赤色のサンプル時間が 7 回ヒットした後に出力されます。

VectorGenerator サブシステムは、さまざまな分子および分母のベクトル シーケンスを生成します。ベクトルのサイズと範囲は、 Simulinkモデル エクスプローラーInitFcnコールバックで定義されます。

VectorToScalar サブシステムは、高レベルのトランザクション (ベクトル) を DUT が理解できるスカラー シーケンスに変換します。

ScalarToVector サブシステムは、DUT から受け取ったスカラー シーケンスから結果のベクトルを組み立てます。

DivideChecker サブシステムは、結果として得られるベクトルに、特定の誤差しきい値内の正しい除算結果が含まれていることを検証します。誤差がしきい値より大きい場合、シミュレーションは警告を出力します。さらに、DivideChecker サブシステムは、結果を視覚化するためにプロットできる 3 つの MAT ファイルを出力します。

モデルを以下に示します。

DemoModelPicture.png

モデルを開いてシミュレーションします。アサーションが起動されないため、エラーしきい値違反は存在しません。

open_system('drv_and_mon_uvmtb');
r=sim('drv_and_mon_uvmtb');

シミュレーションでは、3 つの MAT ファイル ( num.matden.mat、およびresult_cordic.mat )がディスクに書き込まれます。ファイルには、それぞれコルディック除算の分母、分子、結果が含まれています。

SimMatFiles.png

MAT ファイルから 3 次元散布図を生成するMATLAB関数が提供されています。結果のグラフはエラーを視覚化するのに役立ち、エラーがしきい値未満であることをさらに確認できます。

plot_cordic_results('num.mat','den.mat','result_cordic.mat');

Figure contains an axes object. The axes object with title 7 pipeline stage cordic divide error, xlabel denominator, ylabel numerator contains an object of type scatter.

ドライバーとモニターを使用して UVM テストベンチを生成する

uvmbuildを使用して、設計を UVM 環境にエクスポートし、UVM ドライバー、モニター、またはその両方にマップするSimulinkサブシステムを指定します。

UVM ドライバーとモニターを使用すると、フレームベースのドメインとスカラーベースのドメインを分離できます。UVM フレームワークに変換されると、フレームベースのドメインは UVM トランザクションにマッピングされ、スカラーベースのドメインは時間対応 UVM コンポーネント (ドライバー、dut、およびモニター) にマッピングされます。標準コンポーネント定義は、シミュレーションにおける役割ごとに環境の部分を分離します。この例の場合:

  • VectorGenerator サブシステムは UVM シーケンスにマッピングされます。

  • VectorToScalar サブシステムは UVM ドライバーにマップされます。

  • Pipelined_Cordic_Divide サブシステムは、DPI DUT SystemVerilog モジュールにマップされます。

  • ScalarToVector サブシステムは UVM モニターにマップされます。

  • DivideChecker サブシステムは UVM スコアボードにマップされます。

Simulinkデザインから UVM テストベンチを生成するには、次のコードを実行します。

sequence = 'drv_and_mon_uvmtb/VectorGenerator';
driver = 'drv_and_mon_uvmtb/VectorToScalar';
dpi_dut = 'drv_and_mon_uvmtb/Pipelined_Cordic_Divide';
monitor = 'drv_and_mon_uvmtb/ScalarToVector';
scoreboard = 'drv_and_mon_uvmtb/DivideChecker';
uvmbuild(dpi_dut,sequence,scoreboard,'Driver',driver,'Monitor',monitor);
### Starting DPI subsystem generation for UVM test bench
### Starting build procedure for model: Pipelined_Cordic_Divide
### Starting SystemVerilog DPI Component Generation
### Generating DPI H Wrapper /tmp/Bdoc23b_2492649_1044276/tpd2444e94/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/Pipelined_Cordic_Divide_build/Pipelined_Cordic_Divide_dpi.h
### Generating DPI C Wrapper /tmp/Bdoc23b_2492649_1044276/tpd2444e94/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/Pipelined_Cordic_Divide_build/Pipelined_Cordic_Divide_dpi.c
### Generating UVM module package /tmp/Bdoc23b_2492649_1044276/tpd2444e94/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/Pipelined_Cordic_Divide_build/Pipelined_Cordic_Divide_dpi_pkg.sv
### Generating SystemVerilog module /tmp/Bdoc23b_2492649_1044276/tpd2444e94/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/Pipelined_Cordic_Divide_build/Pipelined_Cordic_Divide_dpi.sv
### Generating makefiles for: Pipelined_Cordic_Divide_dpi
### Invoking make to build the DPI Shared Library
### Successful completion of build procedure for model: Pipelined_Cordic_Divide

Build Summary

Top model targets built:

Model                    Action                        Rebuild Reason                                    
=========================================================================================================
Pipelined_Cordic_Divide  Code generated and compiled.  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 30.584s
### Starting build procedure for model: VectorGenerator
### Starting SystemVerilog DPI Component Generation
### Generating DPI H Wrapper /tmp/Bdoc23b_2492649_1044276/tpd2444e94/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/VectorGenerator_build/VectorGenerator_dpi.h
### Generating DPI C Wrapper /tmp/Bdoc23b_2492649_1044276/tpd2444e94/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/VectorGenerator_build/VectorGenerator_dpi.c
### Generating UVM module package /tmp/Bdoc23b_2492649_1044276/tpd2444e94/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/VectorGenerator_build/VectorGenerator_dpi_pkg.sv
### Generating SystemVerilog module /tmp/Bdoc23b_2492649_1044276/tpd2444e94/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/VectorGenerator_build/VectorGenerator_dpi.sv
### Generating makefiles for: VectorGenerator_dpi
### Invoking make to build the DPI Shared Library
### Successful completion of build procedure for model: VectorGenerator

Build Summary

Top model targets built:

Model            Action                        Rebuild Reason                                    
=================================================================================================
VectorGenerator  Code generated and compiled.  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 18.506s
### Starting build procedure for model: VectorToScalar
### Starting SystemVerilog DPI Component Generation
### Generating DPI H Wrapper /tmp/Bdoc23b_2492649_1044276/tpd2444e94/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/VectorToScalar_build/VectorToScalar_dpi.h
### Generating DPI C Wrapper /tmp/Bdoc23b_2492649_1044276/tpd2444e94/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/VectorToScalar_build/VectorToScalar_dpi.c
### Generating UVM module package /tmp/Bdoc23b_2492649_1044276/tpd2444e94/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/VectorToScalar_build/VectorToScalar_dpi_pkg.sv
### Generating SystemVerilog module /tmp/Bdoc23b_2492649_1044276/tpd2444e94/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/VectorToScalar_build/VectorToScalar_dpi.sv
### Generating makefiles for: VectorToScalar_dpi
### Invoking make to build the DPI Shared Library
### Successful completion of build procedure for model: VectorToScalar

Build Summary

Top model targets built:

Model           Action                        Rebuild Reason                                    
================================================================================================
VectorToScalar  Code generated and compiled.  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 15.14s
### Starting build procedure for model: ScalarToVector
### Starting SystemVerilog DPI Component Generation
### Generating DPI H Wrapper /tmp/Bdoc23b_2492649_1044276/tpd2444e94/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/ScalarToVector_build/ScalarToVector_dpi.h
### Generating DPI C Wrapper /tmp/Bdoc23b_2492649_1044276/tpd2444e94/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/ScalarToVector_build/ScalarToVector_dpi.c
### Generating UVM module package /tmp/Bdoc23b_2492649_1044276/tpd2444e94/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/ScalarToVector_build/ScalarToVector_dpi_pkg.sv
### Generating SystemVerilog module /tmp/Bdoc23b_2492649_1044276/tpd2444e94/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/ScalarToVector_build/ScalarToVector_dpi.sv
### Generating makefiles for: ScalarToVector_dpi
### Invoking make to build the DPI Shared Library
### Successful completion of build procedure for model: ScalarToVector

Build Summary

Top model targets built:

Model           Action                        Rebuild Reason                                    
================================================================================================
ScalarToVector  Code generated and compiled.  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 14.048s
### Starting build procedure for model: DivideChecker
### Starting SystemVerilog DPI Component Generation
### Generating DPI H Wrapper /tmp/Bdoc23b_2492649_1044276/tpd2444e94/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/DivideChecker_build/DivideChecker_dpi.h
### Generating DPI C Wrapper /tmp/Bdoc23b_2492649_1044276/tpd2444e94/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/DivideChecker_build/DivideChecker_dpi.c
### Generating UVM module package /tmp/Bdoc23b_2492649_1044276/tpd2444e94/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/DivideChecker_build/DivideChecker_dpi_pkg.sv
### Generating SystemVerilog module /tmp/Bdoc23b_2492649_1044276/tpd2444e94/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/DivideChecker_build/DivideChecker_dpi.sv
### Generating makefiles for: DivideChecker_dpi
### Invoking make to build the DPI Shared Library
### Successful completion of build procedure for model: DivideChecker

Build Summary

Top model targets built:

Model          Action                        Rebuild Reason                                    
===============================================================================================
DivideChecker  Code generated and compiled.  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 17.301s
### Starting UVM test bench generation for model: drv_and_mon_uvmtb
### Generating UVM transaction object ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/scoreboard/mw_Pipelined_Cordic_Divide_scoreboard_trans.sv
### Generating UVM interface ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/uvm_artifacts/mw_Pipelined_Cordic_Divide_if.sv
### Generating UVM sequence ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/sequence/mw_Pipelined_Cordic_Divide_sequence.sv
### Generating UVM sequencer ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/sequence/mw_Pipelined_Cordic_Divide_sequencer.sv
### Generating UVM sequence transaction ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/sequence/mw_Pipelined_Cordic_Divide_sequence_trans.sv
### Generating UVM driver ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/driver/mw_Pipelined_Cordic_Divide_driver.sv
### Generating UVM monitor ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/monitor/mw_Pipelined_Cordic_Divide_monitor.sv
### Generating UVM input monitor ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/uvm_artifacts/mw_Pipelined_Cordic_Divide_monitor_input.sv
### Generating UVM agent ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/uvm_artifacts/mw_Pipelined_Cordic_Divide_agent.sv
### Generating UVM scoreboard ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/scoreboard/mw_Pipelined_Cordic_Divide_scoreboard.sv
### Generating UVM scoreboard configuration object ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/scoreboard/mw_Pipelined_Cordic_Divide_scoreboard_cfg_obj.sv
### Generating UVM environment ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/uvm_artifacts/mw_Pipelined_Cordic_Divide_environment.sv
### Generating UVM test ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/uvm_artifacts/mw_Pipelined_Cordic_Divide_test.sv
### Generating UVM top ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/top/mw_Pipelined_Cordic_Divide_top.sv
### Generating UVM test package ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/top/drv_and_mon_uvmtb_pkg.sv
### Generating UVM test bench simulation script for Mentor Graphics QuestaSim/Modelsim ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/top/run_tb_mq.do
### Generating UVM test bench simulation script for Cadence Xcelium ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/top/run_tb_xcelium.sh
### Generating UVM test bench simulation script for Synopsys VCS ./uvm_build/drv_and_mon_uvmtb_uvm_testbench/top/run_tb_vcs.sh

この図に示すように、UVM ドライバーとモニターは別のディレクトリに生成されます。

DrvAndMonDirs.png

UVM テストベンチを実行する

生成された UVM テストベンチは、UVM テストベンチのトップ モジュール ディレクトリ drv_and_mon_uvmtb_uvmbuild\uvm_testbench\top に移動し、生成された HDL シミュレータ スクリプトの 1 つを実行することで実行できます。この例では、ModelSim/QuestaSim® が使用されます。実行するコマンドをこの図に示します。

runUVMTb.PNG

UVM シミュレーションがSimulinkテストベンチと一致することを確認するには、この要件を確認してください。

  • エラーしきい値違反はスローされません。これは、UVM シミュレーション ログを調べ、UVM エラーが存在しないことを確認することで検証されます。UVM シミュレーション ログをこの図に示します。

VerifyNoUVMError.png

  • UVM スコアボードは、UVM シミュレーションの終了時に 3 つの MAT ファイル (num.matden.mat、およびresult_cordic.mat) を出力します。視覚的には、 Simulinkデザインから生成された 3 次元散布図は、UVM シミュレーションからのプロットと一致する必要があります。UVM シミュレーション MAT ファイルからのプロットは、次のコマンドを使用して生成できます。

PlotUVMMatfiles.PNG

結果として得られる UVM シミュレーションの 3 次元散布図をこの図に示します。このプロットは、前のセクションで示したSimulink設計プロットと一致します。

PlotR.PNG

結論

Simulinkおよび UVM フレームワークでフレームベースとスカラーベースの動作モデリングを分離しておくと、これらの利点が得られます。

  • ドメイン分離により、開発中のアルゴリズムに依存する低レベルの変換を導入することなく、より高い抽象レベルでのフレームベースのトランザクション処理のモデリングが可能になります。

  • VectorGenerator および DivideChecker サブシステムは、アルゴリズムは異なるものの、同じ高レベルのトランザクション生成とチェックを必要とするさまざまなSimulinkまたは UVM プロジェクトで再利用できます。

  • ドメイン分離により、DUT アルゴリズムをマルチレートにすることができます。

  • ドメインを分離すると、高レベルのトランザクションが DUT とは異なるデータ型で動作できるようになります。この例では、DUT のポート データ型はufx10_en5ですが、VectorGenerator サブシステムと DivideChecker サブシステムのデータ型はdoubleです。

  • Simulink Test® をお持ちの場合は、オプションでSimulink Test Harness の変換ブロックを UVM ドライバーおよびモニターにマップできます。ドメインの分離により、より合理化された UVM テストベンチ生成ワークフローが可能になります。

uvmbuild関数を使用すると、UVM ドライバー、モニター、またはその両方にマップされるSimulinkシステムを指定する追加のオプションの名前と値のペアを提供することで、フレームベースのドメインとスカラー ドメインを分離できます。