Main Content

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

UVM フレームワークのテストベンチ コンポーネントの生成と統合

この例では、UVM シーケンスおよび予測子の DPI コンポーネントを生成し、UVM フレームワーク (UVMF) テスト ベンチに統合する方法を示します。MATLAB® でテストベンチ コンポーネントを設計し、シーケンス コンポーネントと予測子コンポーネントに対応する DPI コンポーネントと UVMF 準拠の YAML を生成します。次に、生成されたコンポーネントと互換性のある UVMF テストベンチ コードを生成し、Questa® シミュレータを使用してブロック レベルの RTL シミュレーションを実行します。

はじめに

UVMF は、Siemens® がリリースしたオープンソース パッケージであり、UVM ベースの検証テストベンチのインフラストラクチャを生成するコード ジェネレーターを提供します。詳細については、UVMF インストールに同梱されているドキュメントを参照してください。UVMF ソフトウェアは Siemens Verification Academy からダウンロードできます。

MATLAB からの YAML 生成は、Windows® と Linux® の両方のプラットフォームでサポートされています。この例では、Linux でのプロセスを段階的に説明します。サポート スクリプトと HDL ファイルは、yaml_gen_dpi_predictors_proj プロジェクトに含まれています。

サンプルの作業フォルダーを exampleWorkingFolder 変数に保存します。

exampleWorkingFolder = pwd;
project = openProject("yaml_gen_dpi_predictors_proj");

デザイン概要

次の図は、この例で使用する設計を示しています。

DigitalClockBlockDiagram.png

この設計は、現在の時刻を計算し、アラームやタイマーの設定などの追加機能を提供するデジタル時計チップです。入力/出力信号は次のとおりです。

  • increment — チップへの入力信号。この制御信号は、デジタル時計の時間、分、秒のブロックを増加します。

  • decrement — チップへの入力信号。この制御信号は、デジタル時計の時間、分、秒のブロックを減算します。

  • shift — チップへの入力信号。この制御信号は、デジタル時計の時間、分、秒のブロック間でアクティブなブロックをシフトします。

  • 完了 — チップへの入力信号。この制御信号は、incrementdecrement、および shift 信号を使用した時間設定操作が完了したことを示します。

  • モード—チップへの入力信号。この制御信号はデジタル時計のモードを設定します。

  • 有効—チップへの入力信号。この有効な信号は、mode 制御信号に対応します。

  • hours_out — チップからの出力信号。これは現在の時刻の時間ブロックを表示します。

  • min_out — チップからの出力信号。現在の時刻の分ブロックを表示します。

  • sec_out — チップからの出力信号。現在の時刻の秒ブロックを表示します。

  • alarm_out — チップからの出力信号。これは、アラーム条件が満たされたときのパルス応答を示します。

  • timer_out — チップからの出力信号。これは、タイマー条件が満たされたときのパルス応答を示します。

この図は、incrementdecrement、および shift 信号を使用して時間を設定する方法を示しています。

SET_TIME_CONTROL_SIGNALS.png

shift 信号はクロックを設定モードにします。上図に示すように、時間、分、秒の設定をこの順序で切り替えます。特定のブロックを設定すると、increment および decrement 制御信号を使用して、そのブロックの値をそれぞれ増加または減少させることができます。

ブロックレベルの検証

この図は、デジタル クロック チップ内の mode_set_controller と呼ばれるブロックの 1 つに対するブロック レベルの UVMF 検証環境のアーキテクチャを示しています。

BlockEnvironmentUsingDPIComponents.png

ブロックレベルの検証環境を構成するさまざまなコンポーネントは次のとおりです。

  • input_agent — テスト ベクトルをデザインの入力インターフェイスに送り込むアクティブ エージェント。このエージェントは、刺激 MATLAB ファイルの DPI コンポーネントをシーケンスとして使用します。

  • dpi_predictor — 設計サブシステムから生成された DPI コードを使用して出力を予測する コンポーネント。このコンポーネントは、予測された出力をスコアボード コンポーネントに送信します。

  • output_agent デザインの出力インターフェースを監視し、信号情報をスコアボード コンポーネントに転送するパッシブ エージェント。UVMF は、予測 DPI コンポーネントからこのエージェントのインターフェース情報を取得します。

  • スコアボード — 出力エージェントと予測子からそれぞれ受信した実際の設計出力と予想される設計出力を比較する コンポーネント。このコンポーネントは、比較の不一致を検出すると uvm_error を生成します。

ブロックレベルの検証環境を生成する

ブロックレベルの検証環境の生成には、このセクションで詳しく説明する複数の手順が含まれます。この図はエンドツーエンドのワークフローを示しています。

ExampleWorkflow.png

UVMFテストベンチコンポーネントの設計と構成

MATLAB の予測子とシーケンス コンポーネントの設計

前のセクションで示したブロックレベルの UVMF 検証環境で DPI コンポーネントが使用される MATLAB ファイルを開発します。この例のサポート スクリプトの一部であるデジタル クロック チップのいくつかのブロックに対して、予測子とシーケンス コンポーネントを使用できます。

edit(fullfile("dut_dpi","mode_set_controller","mode_set_controller.m"))
edit(fullfile("dut_dpi","mode_set_controller","mode_set_controller_test.m"))

UVMF シーケンスと予測コンポーネントの作成と構成

svdpiConfiguration および uvmfTestBenchConfiguration オブジェクトを作成して構成するには、次の手順を実行します。

1. dut_dpi/mode_set_controller フォルダに移動します。

cd(fullfile("dut_dpi","mode_set_controller"))

2. uvmf-sequence ComponentKindsvdpiConfiguration オブジェクトを作成して設定します。

seq = svdpiConfiguration("uvmf-sequence");
seq.MATLABFunctionName = "mode_set_controller_test";

3. uvmf-predictor ComponentKindsvdpiConfiguration オブジェクトを作成して設定します。

pred = svdpiConfiguration("uvmf-predictor");
pred.MATLABFunctionName = "mode_set_controller";

mode = fi(0, 0, 2, 0);
valid = false;
stc_ack = false;
hms_ack = false;
alarm_ack = false;
timer_ack = false;

pred.InputArgs = {mode, valid, stc_ack, hms_ack, alarm_ack, timer_ack};

4. uvmfTestBenchConfiguration オブジェクトを作成して構成し、必要な DPI コンポーネント ファイルとともに UVMF テスト ベンチ YAML を生成します。

uvmfObject = uvmfTestBenchConfiguration({pred, seq});

DPI コンポーネントと UVMF 準拠の YAML を生成する

予測子およびシーケンス ファイルと対応する UVMF テスト ベンチ YAML の DPI コンポーネントを生成するには、generateYAMLforUVMFTestBench 関数を実行します。

generateYAMLforUVMFTestBench(uvmfObject);

UVMF テストベンチ コードの生成

次の環境変数を設定します。

  • UVMF_HOME – この環境変数を UVMF 2023.1 インストール パスに設定します。

  • MTI_VCO_MODE – UVMF テストベンチシミュレーションに 64 ビット Questa 実行可能ファイルを使用するには、この環境変数を 64 に設定します。他のシミュレーターも互換性がある必要がありますが、この例ではワークフローは示されていません。

setenv("UVMF_HOME","/home/Documents/UVMF_2023.1")
setenv("MTI_VCO_MODE","64")

uvmfbuild/uvmf_testbench フォルダに移動します。

cd(fullfile("uvmfbuild","uvmf_testbench"))

UVMF テストベンチ YAML ファイルを yaml2uvmf スクリプトの引数として指定して、yaml2uvmf コマンドを実行します。

!$UVMF_HOME/scripts/yaml2uvmf.py uvmftb.yaml

この図は生成されたフォルダーの内容を示しています。

FinalFolderContentsAfterUVMF.png

環境の設定とRTLシミュレーションの実行

SHスクリプトを実行する

UVMF は、DPI コンポーネントを統合するための SystemVerilog ファイル (mode_set_controller_predictor_mtlb.svh など) と、ベース UVMF テストベンチ ファイルを DPI コンポーネント用に生成された SystemVerilog ファイルに置き換える対応する SH スクリプト (txn_conv_to_src_predictor_mtlb_prep.sh) を生成します。これらのスクリプトの実行を自動化するには、ヘルパー関数 hExecuteUVMFShellScripts を使用し、uvmf_template_output フォルダーへのパスを入力引数として渡します。

hExecuteUVMFShellScripts("uvmf_template_output")

プロジェクト フォルダーに戻ります。

cd(project.ProjectStartupFolder)

生成されたセットアップ スクリプトで環境変数を設定する

uvmf_template_output/project_benches/mode_set_controller/sim フォルダーで、.source 拡張子を持つ setup_mode_set_controller_environment_variables スクリプトを見つけます。hUpdateEnvironmentVariables 関数を使用して、そのファイル内の環境変数を更新します。この関数は、MATLAB からの環境変数も設定します。

hUpdateEnvironmentVariables(fullfile("dut_dpi","mode_set_controller"));

このセットアップ スクリプトの詳細については、SystemVerilog DPI を UVM フレームワーク ワークフローに統合する の例の「生成されたセットアップ スクリプトで環境変数を設定する」セクションを参照してください。

RTL シミュレーションを使用してブロック機能を検証する

次の手順に従って、Questa シミュレータでブロックレベルのシミュレーションを実行します。

1. uvmf_template_output/project_benches/mode_set_controller/sim フォルダに移動します。

cd(fullfile("dut_dpi","mode_set_controller","uvmfbuild","uvmf_testbench","uvmf_template_output","project_benches","mode_set_controller","sim"))

2. make コマンドを実行します。

!make debug TEST_NAME=DPI_stimgen_test

Questa ウィンドウのトランスクリプト ウィンドウに「run -all 」と入力します。この図はQuestaでのシミュレーション結果を示しています。

QuestaSimBlockSimulation.png

サンプルの作業フォルダーに戻ります。

cd(exampleWorkingFolder);

結論

この例では、MATLAB から必要な DPI コンポーネントとともに UVMF 準拠の YAML を生成し、yaml2uvmf ワークフローを使用してそれを UVMF に統合する方法を示します。この例では、ブロックレベルの検証環境を生成し、RTL シミュレーションを実行するためのプロセスを段階的に説明します。このアプローチに従って、デジタル クロック設計内の他のブロックの UVMF 環境を生成できます。

参考

|

関連するトピック