このページは機械翻訳を使用して翻訳されました。元の英語を参照するには、ここをクリックします。
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");
デザイン概要
次の図は、この例で使用する設計を示しています。
この設計は、現在の時刻を計算し、アラームやタイマーの設定などの追加機能を提供するデジタル時計チップです。入力/出力信号は次のとおりです。
increment — チップへの入力信号。この制御信号は、デジタル時計の時間、分、秒のブロックを増加します。
decrement — チップへの入力信号。この制御信号は、デジタル時計の時間、分、秒のブロックを減算します。
shift — チップへの入力信号。この制御信号は、デジタル時計の時間、分、秒のブロック間でアクティブなブロックをシフトします。
完了 — チップへの入力信号。この制御信号は、
increment
、decrement
、およびshift
信号を使用した時間設定操作が完了したことを示します。モード—チップへの入力信号。この制御信号はデジタル時計のモードを設定します。
有効—チップへの入力信号。この有効な信号は、
mode
制御信号に対応します。hours_out — チップからの出力信号。これは現在の時刻の時間ブロックを表示します。
min_out — チップからの出力信号。現在の時刻の分ブロックを表示します。
sec_out — チップからの出力信号。現在の時刻の秒ブロックを表示します。
alarm_out — チップからの出力信号。これは、アラーム条件が満たされたときのパルス応答を示します。
timer_out — チップからの出力信号。これは、タイマー条件が満たされたときのパルス応答を示します。
この図は、increment
、decrement
、および shift
信号を使用して時間を設定する方法を示しています。
shift
信号はクロックを設定モードにします。上図に示すように、時間、分、秒の設定をこの順序で切り替えます。特定のブロックを設定すると、increment
および decrement
制御信号を使用して、そのブロックの値をそれぞれ増加または減少させることができます。
ブロックレベルの検証
この図は、デジタル クロック チップ内の mode_set_controller
と呼ばれるブロックの 1 つに対するブロック レベルの UVMF 検証環境のアーキテクチャを示しています。
ブロックレベルの検証環境を構成するさまざまなコンポーネントは次のとおりです。
input_agent — テスト ベクトルをデザインの入力インターフェイスに送り込むアクティブ エージェント。このエージェントは、刺激 MATLAB ファイルの DPI コンポーネントをシーケンスとして使用します。
dpi_predictor — 設計サブシステムから生成された DPI コードを使用して出力を予測する コンポーネント。このコンポーネントは、予測された出力をスコアボード コンポーネントに送信します。
output_agent — デザインの出力インターフェースを監視し、信号情報をスコアボード コンポーネントに転送するパッシブ エージェント。UVMF は、予測 DPI コンポーネントからこのエージェントのインターフェース情報を取得します。
スコアボード — 出力エージェントと予測子からそれぞれ受信した実際の設計出力と予想される設計出力を比較する コンポーネント。このコンポーネントは、比較の不一致を検出すると uvm_error を生成します。
ブロックレベルの検証環境を生成する
ブロックレベルの検証環境の生成には、このセクションで詳しく説明する複数の手順が含まれます。この図はエンドツーエンドのワークフローを示しています。
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 ComponentKind の svdpiConfiguration
オブジェクトを作成して設定します。
seq = svdpiConfiguration("uvmf-sequence"); seq.MATLABFunctionName = "mode_set_controller_test";
3. uvmf-predictor ComponentKind の svdpiConfiguration
オブジェクトを作成して設定します。
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
この図は生成されたフォルダーの内容を示しています。
環境の設定と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でのシミュレーション結果を示しています。
サンプルの作業フォルダーに戻ります。
cd(exampleWorkingFolder);
結論
この例では、MATLAB から必要な DPI コンポーネントとともに UVMF 準拠の YAML を生成し、yaml2uvmf ワークフローを使用してそれを UVMF に統合する方法を示します。この例では、ブロックレベルの検証環境を生成し、RTL シミュレーションを実行するためのプロセスを段階的に説明します。このアプローチに従って、デジタル クロック設計内の他のブロックの UVMF 環境を生成できます。
参考
uvmfTestBenchConfiguration
| svdpiConfiguration