Main Content

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

テストベンチとコンポーネント機能の記述

HDLインスタンスオブジェクトを使用した関数の記述

このセクションでは、MATLAB® 関数 matlabcp および matlabtbuse_instance_obj 引数を使用する方法について説明します。この機能は、MATLAB 関数定義の iportoporttnexttnow、および portinfo 引数を置き換えます。代わりに、HDL インスタンス オブジェクトが引数として関数に渡されます。この機能により、matlabcp および matlabtb 関数コールバックは渡された HDL インスタンス オブジェクトを取得し、状態を保持し、信号の読み取り/書き込みアクセス保護を提供し、必要に応じて状態を追加できるようになります。

この機能を使用すると、次の利点が得られます。

  • 同じ MATLAB 関数を使用して、1 回限りのラッパー関数を作成する必要なく、HDL で同じモジュールの異なるインスタンスの動作を表します。

  • 最初の呼び出し時に特別な portinfo 引数は必要ありません。

  • 永続変数やグローバル変数を使用する必要はありません。

  • 信号の読み取り/書き込みに関するフィードバックと保護が向上しました。

  • オブジェクト フィールドを使用して、インスタンス パスを識別し、呼び出しがコンポーネントからのものかテスト ベンチ関数からのものかを判断します。

  • フィールド引数を使用して、HDL 側の matlabcp または matlabtb インスタンス化から関数コールバックにユーザー定義の引数を渡します。

use_instance_obj 引数は matlabcpmatlabtb の両方で同一です。-use_instance_obj 引数を matlabcp または matlabtb とともに次の形式で含めます。

matlabcp modelname -mfunc funcname -use_instance_obj

use_instance_obj を使用すると、HDL Verifier™ は -mfunc 引数で指定された関数に HDL インスタンス オブジェクトを渡します。呼び出される関数のシグネチャは次のとおりです。

function MyFunctionName(hdl_instance_obj)

HDL インスタンス オブジェクト hdl_instance_obj には、次の表に示すフィールドがあります。

フィールド読み取り/書き込みアクセス説明
tnext書き込みのみ

設定された時間値の間にコールバックをスケジュールするために使用されます。このフィールドは、古い portinfo 構造の tnext と同じです。次に例を示します。

hdl_instance_obj.tnext = hdl_instance_obj.tnow + 5e-9

このコード行は、tnow から time = 5 ナノ秒でコールバックをスケジュールします。

userdata読み取り/書き込み現在の matlabcp インスタンスの状態変数を格納します。このインスタンスのコールバックが次にスケジュールされたときに、変数を取得できます。
simstatus読み取り専用

HDL シミュレータのステータスを保存します。HDL Verifier ソフトウェアは、この特定のインスタンスの最初のコールバック中にこのフィールドを 'Init' に設定し、その後は 'Running' に設定します。このフィールド値は読み取り専用プロパティです。

>> hdl_instance_obj.simstatus

ans=
      Init
instance読み取り専用

コールバックに関連付けられた Verilog®/VHDL® インスタンスの完全なパスを格納します。インスタンスは読み取り専用プロパティです。このフィールドの値は、関数呼び出しで指定されたモジュール インスタンスの値と同じです。次に例を示します。

HDL シミュレータの場合:

hdlsim> matlabcp osc_top -mfunc oscfilter use_instance_obj

MATLAB で、以下を実行します。

>> hdl_instance_obj.instance

ans=
		osc_top
argument読み取り専用

matlabcp-argument オプションによって設定された引数を格納します。次に例を示します。

matlabtb osc_top -mfunc oscfilter -use_instance_obj -argument foo
検証ソフトウェアは、-argument オプションを -use_instance_obj と一緒に使用する場合にのみサポートします。それ以外の場合、引数は無視されます。引数は読み取り専用プロパティです。
>> hdl_instance_obj.argument

ans= 
    	foo

portinfo読み取り専用

このインスタンスに関連付けられている VHDL ポートと Verilog ポートに関する情報を保存します。このフィールド値は読み取り専用プロパティであり、関連付けられた HDL モジュールに対して定義されたポートを記述するフィールド構造を持ちます。各ポートについて、portinfo 構造体はポートのタイプ、方向、サイズなどの情報を渡します。ポート データの詳細については、ポート情報へのアクセスと適用 を参照してください。

hdl_instance_obj.portinfo.field1.field2.field3

メモ

use_instance_obj を使用する場合は、HDL インスタンス オブジェクトを介して tscale にアクセスします。use_instance_obj を使用しない場合でも、portinfo を介して tscale にアクセスできます。

tscale読み取り専用

HDL シミュレータの解像度制限 (ティック) を秒単位で保存します。このフィールド値は読み取り専用プロパティです。

>> hdl_instance_obj.tscale

ans=
	1.0000e-009

メモ

use_instance_obj を使用する場合は、HDL インスタンス オブジェクトを介して tscale にアクセスします。use_instance_obj を使用しない場合でも、portinfo を介して tscale にアクセスできます。

tnow読み取り専用

現在の時刻を保存します。このフィールド値は読み取り専用プロパティです。

hdl_instance_obj.tnext = hld_instance_obj.tnow + fastestrate;

portvalues読み取り/書き込み

matlabcp インスタンスの出力ポートと入力ポートの現在の値を保存し、新しい値を設定します。次に例を示します。

>> hdl_instance_obj.portvalues

ans =
Read Only Input ports:
	clk_enable: []
	clk: []
	reset: []
Read/Write Output ports:
	sine_out: [22x1 char]

linkmode読み取り専用

コールバックのステータスを保存します。HDL Verifier ソフトウェアは、コールバックが matlabtb に関連付けられている場合はこのフィールドを 'testbench' に設定し、コールバックが matlabcp に関連付けられている場合はこのフィールドを 'component' に設定します。このフィールド値は読み取り専用プロパティです。

>> hdl_instance_obj.linkmode

ans=
	component

次に例を示します。matlabcp と HDL インスタンス オブジェクトの使用

この例では、HDL シミュレーターは matlabcp を繰り返し呼び出して、複数の HDL インスタンスを同じ MATLAB 関数にバインドします。各呼び出しには、動作を区別するためのコンストラクター パラメーターとして -argument が含まれます。

> matlabcp u1_filter1x -mfunc osc_filter -use_instance_obj -argument "oversample=1"
> matlabcp u1_filter8x -mfunc osc_filter -use_instance_obj -argument "oversample=8"
> matlabcp u2_filter8x -mfunc osc_filter -use_instance_obj -argument "oversample=8"

MATLAB 関数コールバック osc_filter.m は、obj.userdata を使用してユーザー インスタンス ベースの状態を設定し、他の obj フィールドを使用してポートとシミュレーション コンテキストを照会し、渡された obj.argument を使用して動作を区別します。

function osc_filter(obj)
  if (strcmp(obj.simstatus,'Init'))
    ud = struct('Nbits', 22, 'Norder', 31, 'clockperiod', 80e-9, 'phase', 1));
    eval(obj.argument);
    if (~exist('oversample','var'))
        error('HdlLinkDemo:UseInstanceObj:BadCtorArg', ...
        'Bad constructor arg to osc_filter callback. Expecting 
					''oversample=value''.');
    end
    ud.oversample        = oversample;
    ud.oversampleperiod  = ud.clockperiod/ud.oversample;
    ud.InDelayLine       = zeros(1,ud.Norder+1);

    centerfreq = 70/256;
    passband   = [centerfreq-0.01, centerfreq+0.01];
    b          = fir1((ud.Norder+1)*ud.oversample-1, passband./ud.oversample);
    ud.Hresp             = ud.oversample .* b;

    obj.userdata = ud;
  end

...

ポート情報を使用した関数の記述

MATLAB 関数の構文と関数の引数の定義

MATLABコンポーネント関数の構文は

function [oport, tnext] = MyFunctionName(iport, tnow, portinfo)

MATLABテストベンチ関数の構文は

function [iport, tnext] = MyFunctionName(oport, tnow, portinfo)

MATLAB コンポーネント関数の入力/出力引数 (iport および oport) は、MATLAB テストベンチ関数のポート引数の逆になります。つまり、MATLAB コンポーネント関数は、信号データを 出力 に返し、関連する HDL モジュールの 入力 からデータを受信します。

シミュレーションのスケジュール設定に tnexttnow を使用する方法の詳細については、tnext パラメータを使用してコンポーネント関数をスケジュールする を参照してください。

次の表では、各テストベンチおよびコンポーネント機能パラメータと、各機能で果たす役割について説明します。

パラメーターテスト ベンチコンポーネント
iport出力
関連する HDL モジュールの入力ポートに接続された信号に値を強制的に (デポジットによって) 配置する構造。
入力
tnow で指定された時間に、関連付けられた HDL モジュールに対して定義された入力ポートから信号値を受信する構造。
tnext出力、オプション
HDL シミュレータが MATLAB への次のコールバックをスケジュールする時間を指定します。tnext は空の値 ([]) に初期化する必要があります。tnext が後で更新されない場合、シミュレーション スケジュールに新しいエントリは追加されません。
出力、オプション
テストベンチと同じです。
oport入力
tnow で指定された時間に、関連付けられた HDL モジュールに対して定義された出力ポートから信号値を受信する構造。
出力
関連する HDL モジュールの出力ポートに接続された信号に値を強制的に (デポジットによって) 配置する構造。
tnow入力
は、MATLAB関数が呼び出されるシミュレーション時間を受け取ります。デフォルトでは、時間は秒単位で表されます。詳細については、tnext パラメータを使用してコンポーネント関数をスケジュールするを参照してください。
テストベンチと同じです。
portinfo入力
関数の最初の呼び出しのみ(シミュレーションの開始時)、portinfo は、関連する HDL モジュールに定義されたポートを記述するフィールドを持つ構造体を受け取ります。各ポートについて、portinfo 構造体はポートのタイプ、方向、サイズなどの情報を渡します。
テストベンチと同じです。

matlabcp を使用している場合は、次の例のように、関数の先頭で関数出力を空の値に初期化します。

tnext = [];
oport = struct();

メモ

VHDL 信号をインポートすると、iportoportportinfo の信号名はすべて大文字で返されます。

ポート情報を使用すると、起動時に提供されるポート情報に応じて異なる動作をする汎用の MATLAB 関数を作成できます。ポート データの詳細については、ポート情報へのアクセスと適用 を参照してください。

Oscfilter 関数の例

次のコードは、oscfilter MATLAB コンポーネント関数の定義を示しています。

function [oport,tnext] = oscfilter(iport, tnow, portinfo)

関数名 oscfilter は、エンティティ名 u_osc_filter とは異なります。したがって、コンポーネント関数名は、-mfunc パラメータを使用して関数を関連する HDL インスタンスに接続する matlabcp コマンドに明示的に渡す必要があります。

関数定義では、次に示すように、必要なすべての入力パラメータと出力パラメータを指定します。

oportエンティティの出力ポート filter1x_outfilter4x_out、および filter8x_out に接続された信号に値を強制的に (デポジットによって) 適用します。
tnextHDL シミュレータが MATLAB 関数への次のコールバックをいつ実行するかを示す時間値を指定します。
iportエンティティの入力ポート osc_in から HDL 信号値を受信します。
tnow現在のシミュレーション時間を受け取ります。
portinfo関数の最初の呼び出しでは、エンティティに対して定義されたポートを記述する構造体を受け取ります。

次の図は、HDL エンティティのポートと MATLAB 関数の iport および oport パラメータの関係を示しています (示されている例は ModelSim® での使用です)。

ポート情報へのアクセスと適用

HDL Verifier ソフトウェアは、テスト対象のエンティティまたはモジュールに関する情報を portinfo 構造で渡します。portinfo 構造体は関数の 3 番目の引数として渡されます。これは、ModelSim 関数への最初の呼び出しでのみ渡されます。portinfo 構造体で渡された情報を使用して、シミュレーション中のエンティティまたはモジュールを検証できます。次のサンプルに示すように、3 つのフィールドで情報が提供されます。これらのフィールドの内容は、VHDL エンティティまたは Verilog モジュールに定義されたポートのタイプによって異なります。

portinfo.field1.field2.field3

次の表は、各フィールドの可能な値と、その値が適用されるポート タイプを示しています。

HDL ポート情報

分野...含まれるもの...どれの...そして適用対象...
field1inポートが入力ポートであることを示しますすべてのポートタイプ
outポートが出力ポートであることを示しますすべてのポートタイプ
inoutポートが双方向ポートであることを示します すべてのポートタイプ
tscaleHDLシミュレータで指定されたシミュレータ解像度の制限を秒単位で示します。すべてのタイプ
field2portname港の名前はすべてのポートタイプ
field3type

ポートタイプを識別します

VHDL の場合: integerrealtime、または enum

Verilogの場合: 'verilog_logic' はポートタイプregwireintegerを識別します

すべてのポートタイプ

right (VHDL のみ)

VHDL RIGHT 属性

VHDL integernatural、または positive ポート タイプ

left (VHDL のみ)

VHDL LEFT 属性

VHDL integernatural、または positive ポート タイプ

 size

VHDL:データを含む行列のサイズ

Verilog:データを含むビットベクトルのサイズ

すべてのポートタイプ
label

VHDL:文字リテラルまたはラベル

Verilog: 文字ベクトル '01ZX'

VHDL:定義済み型 BITSTD_LOGICSTD_ULOGICBIT_VECTORSTD_LOGIC_VECTOR を含む列挙型

Verilog:すべてのポートタイプ

ModelSim 関数の最初の呼び出しには、portinfo 構造体を含む 3 つの引数があります。引数の数を確認することは、portinfo が渡されたことを確認する 1 つの方法です。次に例を示します。

if(nargin ==3)
 tscale  = portinfo.tscale;
end