このページは機械翻訳を使用して翻訳されました。元の英語を参照するには、ここをクリックします。
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 ファイルを出力します。
モデルは以下のとおりです。
モデルを開いてシミュレートします。アサーションが起動されないため、エラーしきい値違反は発生しません。
open_system('drv_and_mon_uvmtb'); r=sim('drv_and_mon_uvmtb');
シミュレーションでは、3 つの MAT ファイル (num.mat
、den.mat
、result_cordic.mat
) がディスクに書き込まれます。ファイルには、それぞれ、コーディック除算の分母、分子、および結果が含まれています。
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 ドライバーとモニターは別々のディレクトリに生成されます。
UVMテストベンチを実行する
生成された UVM テスト ベンチは、UVM テスト ベンチのトップ モジュール ディレクトリ drv_and_mon_uvmtb_uvmbuild\uvm_testbench\top
に移動し、生成された HDL シミュレータ スクリプトの 1 つを実行することによって実行できます。この例では、ModelSim/QuestaSim® が使用されます。実行するコマンドはこの図に示されています。
UVM シミュレーションが Simulink テスト ベンチと一致することを確認するには、この要件を確認します。
エラーしきい値違反はスローされません。これは、UVM シミュレーション ログを調べて UVM エラーが存在しないことを確認することによって検証されます。この図に UVM シミュレーション ログを示します。
UVM スコアボードは、UVM シミュレーションの終了時に 3 つの MAT ファイル (
num.mat
、den.mat
、およびresult_cordic.mat
) を出力します。視覚的には、Simulink 設計から生成された 3D 散布図は、UVM シミュレーションからのプロットと一致する必要があります。UVM シミュレーション MAT ファイルからのプロットは、次のコマンドを使用して生成できます。
結果として得られた UVM シミュレーション 3D 散布図がこの図に示されています。このプロットは、前のセクションで示した Simulink 設計プロットと一致します。
まとめ
Simulink と UVM フレームワークでフレームベースとスカラーベースの動作モデリングを分離しておくと、次のような利点が得られます。
ドメイン分離により、開発中のアルゴリズムに依存する低レベルの変換を導入することなく、フレームベースのトランザクション処理をより高い抽象レベルでモデル化できるようになります。
VectorGenerator サブシステムと DivideChecker サブシステムは、異なるアルゴリズムを持ちながら、同じ高レベルのトランザクション生成とチェックを必要とするさまざまな Simulink または UVM プロジェクトに再利用できます。
ドメイン分離により、DUT アルゴリズムをマルチレートにすることができます。
ドメイン分離により、高レベルのトランザクションは DUT とは異なるデータ型で動作できるようになります。この例では、DUT のポート データ型は
ufx10_en5
ですが、VectorGenerator および DivideChecker サブシステムのデータ型はdouble
です。Simulink Test ® をお持ちの場合は、オプションで Simulink Test ハーネスの変換ブロックを UVM ドライバーとモニターにマップできます。ドメイン分離により、UVM テストベンチ生成ワークフローがより合理化されます。
uvmbuild
関数を使用すると、UVM ドライバー、モニター、またはその両方にマップされる Simulink サブシステムを指定するための追加のオプションの名前と値のペアを提供することにより、フレームベースのドメインとスカラー ドメインを分離できます。