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 でテストされている低レベルのアルゴリズムに関係なく、高レベルのトランザクションに基づいて動作します。この例では、トランザクションは分子、分母、および CORDIC アルゴリズムによる除算の結果の 3 つのベクトルで構成されます。

  • 高速サンプル時間 (赤) はスカラー単位で動作します。パイプライン化された DUT は、赤色のサンプル時間に 2 つのスカラーをサンプリングし、有効な出力信号がアサートされると、結果として得られる CORDIC 除算結果が 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.matresult_cordic.mat) がディスクに書き込まれます。ファイルには、それぞれ、コーディック除算の分母、分子、および結果が含まれています。

SimMatFiles.png

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

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

ドライバーとモニターを備えた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/Bdoc24a_2589924_894856/tpcc27045f/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/Pipelined_Cordic_Divide_build/Pipelined_Cordic_Divide_dpi.h
### Generating DPI C Wrapper /tmp/Bdoc24a_2589924_894856/tpcc27045f/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/Pipelined_Cordic_Divide_build/Pipelined_Cordic_Divide_dpi.c
### Generating UVM module package /tmp/Bdoc24a_2589924_894856/tpcc27045f/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/Pipelined_Cordic_Divide_build/Pipelined_Cordic_Divide_dpi_pkg.sv
### Generating SystemVerilog module /tmp/Bdoc24a_2589924_894856/tpcc27045f/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 22.79s
### Starting build procedure for model: VectorGenerator
### Starting SystemVerilog DPI Component Generation
### Generating DPI H Wrapper /tmp/Bdoc24a_2589924_894856/tpcc27045f/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/VectorGenerator_build/VectorGenerator_dpi.h
### Generating DPI C Wrapper /tmp/Bdoc24a_2589924_894856/tpcc27045f/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/VectorGenerator_build/VectorGenerator_dpi.c
### Generating UVM module package /tmp/Bdoc24a_2589924_894856/tpcc27045f/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/VectorGenerator_build/VectorGenerator_dpi_pkg.sv
### Generating SystemVerilog module /tmp/Bdoc24a_2589924_894856/tpcc27045f/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 13.039s
### Starting build procedure for model: VectorToScalar
### Starting SystemVerilog DPI Component Generation
### Generating DPI H Wrapper /tmp/Bdoc24a_2589924_894856/tpcc27045f/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/VectorToScalar_build/VectorToScalar_dpi.h
### Generating DPI C Wrapper /tmp/Bdoc24a_2589924_894856/tpcc27045f/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/VectorToScalar_build/VectorToScalar_dpi.c
### Generating UVM module package /tmp/Bdoc24a_2589924_894856/tpcc27045f/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/VectorToScalar_build/VectorToScalar_dpi_pkg.sv
### Generating SystemVerilog module /tmp/Bdoc24a_2589924_894856/tpcc27045f/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 11.08s
### Starting build procedure for model: ScalarToVector
### Starting SystemVerilog DPI Component Generation
### Generating DPI H Wrapper /tmp/Bdoc24a_2589924_894856/tpcc27045f/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/ScalarToVector_build/ScalarToVector_dpi.h
### Generating DPI C Wrapper /tmp/Bdoc24a_2589924_894856/tpcc27045f/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/ScalarToVector_build/ScalarToVector_dpi.c
### Generating UVM module package /tmp/Bdoc24a_2589924_894856/tpcc27045f/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/ScalarToVector_build/ScalarToVector_dpi_pkg.sv
### Generating SystemVerilog module /tmp/Bdoc24a_2589924_894856/tpcc27045f/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 9.0503s
### Starting build procedure for model: DivideChecker
### Starting SystemVerilog DPI Component Generation
### Generating DPI H Wrapper /tmp/Bdoc24a_2589924_894856/tpcc27045f/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/DivideChecker_build/DivideChecker_dpi.h
### Generating DPI C Wrapper /tmp/Bdoc24a_2589924_894856/tpcc27045f/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/DivideChecker_build/DivideChecker_dpi.c
### Generating UVM module package /tmp/Bdoc24a_2589924_894856/tpcc27045f/hdlverifier-ex46125948/uvm_build/drv_and_mon_uvmtb_dpi_components/DivideChecker_build/DivideChecker_dpi_pkg.sv
### Generating SystemVerilog module /tmp/Bdoc24a_2589924_894856/tpcc27045f/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 11.334s
### 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 設計から生成された 3D 散布図は、UVM シミュレーションからのプロットと一致する必要があります。UVM シミュレーション MAT ファイルからのプロットは、次のコマンドを使用して生成できます。

PlotUVMMatfiles.PNG

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

PlotR.PNG

まとめ

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

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

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

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

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

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

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