このページは機械翻訳を使用して翻訳されました。元の英語を参照するには、ここをクリックします。
テストベンチとコンポーネント機能の記述
HDLインスタンスオブジェクトを使用した関数の記述
このセクションでは、MATLAB® 関数 matlabcp
および matlabtb
の use_instance_obj
引数を使用する方法について説明します。この機能は、MATLAB 関数定義の iport
、oport
、tnext
、tnow
、および portinfo
引数を置き換えます。代わりに、HDL インスタンス オブジェクトが引数として関数に渡されます。この機能により、matlabcp
および matlabtb
関数コールバックは渡された HDL インスタンス オブジェクトを取得し、状態を保持し、信号の読み取り/書き込みアクセス保護を提供し、必要に応じて状態を追加できるようになります。
この機能を使用すると、次の利点が得られます。
同じ MATLAB 関数を使用して、1 回限りのラッパー関数を作成する必要なく、HDL で同じモジュールの異なるインスタンスの動作を表します。
最初の呼び出し時に特別な
portinfo
引数は必要ありません。永続変数やグローバル変数を使用する必要はありません。
信号の読み取り/書き込みに関するフィードバックと保護が向上しました。
オブジェクト フィールドを使用して、インスタンス パスを識別し、呼び出しがコンポーネントからのものかテスト ベンチ関数からのものかを判断します。
フィールド引数を使用して、HDL 側の
matlabcp
またはmatlabtb
インスタンス化から関数コールバックにユーザー定義の引数を渡します。
use_instance_obj
引数は matlabcp
と matlabtb
の両方で同一です。-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 | 書き込みのみ | 設定された時間値の間にコールバックをスケジュールするために使用されます。このフィールドは、古い hdl_instance_obj.tnext = hdl_instance_obj.tnow + 5e-9 このコード行は、 |
userdata | 読み取り/書き込み | 現在の matlabcp インスタンスの状態変数を格納します。このインスタンスのコールバックが次にスケジュールされたときに、変数を取得できます。 |
simstatus | 読み取り専用 | HDL シミュレータのステータスを保存します。HDL Verifier ソフトウェアは、この特定のインスタンスの最初のコールバック中にこのフィールドを >> 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 | 読み取り専用 |
matlabtb osc_top -mfunc oscfilter -use_instance_obj -argument foo -argument オプションを -use_instance_obj と一緒に使用する場合にのみサポートします。それ以外の場合、引数は無視されます。引数は読み取り専用プロパティです。 >> hdl_instance_obj.argument ans= foo |
portinfo | 読み取り専用 | このインスタンスに関連付けられている VHDL ポートと Verilog ポートに関する情報を保存します。このフィールド値は読み取り専用プロパティであり、関連付けられた HDL モジュールに対して定義されたポートを記述するフィールド構造を持ちます。各ポートについて、 hdl_instance_obj.portinfo.field1.field2.field3
メモ
|
tscale | 読み取り専用 | HDL シミュレータの解像度制限 (ティック) を秒単位で保存します。このフィールド値は読み取り専用プロパティです。 >> hdl_instance_obj.tscale ans= 1.0000e-009 メモ
|
tnow | 読み取り専用 | 現在の時刻を保存します。このフィールド値は読み取り専用プロパティです。 hdl_instance_obj.tnext = hld_instance_obj.tnow + fastestrate; |
portvalues | 読み取り/書き込み |
>> hdl_instance_obj.portvalues ans = Read Only Input ports: clk_enable: [] clk: [] reset: [] Read/Write Output ports: sine_out: [22x1 char] |
linkmode | 読み取り専用 | コールバックのステータスを保存します。HDL Verifier ソフトウェアは、コールバックが >> 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 モジュールの 入力 からデータを受信します。
シミュレーションのスケジュール設定に tnext
と tnow
を使用する方法の詳細については、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 信号をインポートすると、iport
、oport
、portinfo
の信号名はすべて大文字で返されます。
ポート情報を使用すると、起動時に提供されるポート情報に応じて異なる動作をする汎用の MATLAB 関数を作成できます。ポート データの詳細については、ポート情報へのアクセスと適用 を参照してください。
Oscfilter 関数の例
次のコードは、oscfilter
MATLAB コンポーネント関数の定義を示しています。
function [oport,tnext] = oscfilter(iport, tnow, portinfo)
関数名 oscfilter
は、エンティティ名 u_osc_filter
とは異なります。したがって、コンポーネント関数名は、-mfunc
パラメータを使用して関数を関連する HDL インスタンスに接続する matlabcp
コマンドに明示的に渡す必要があります。
関数定義では、次に示すように、必要なすべての入力パラメータと出力パラメータを指定します。
oport | エンティティの出力ポート filter1x_out 、filter4x_out 、および filter8x_out に接続された信号に値を強制的に (デポジットによって) 適用します。 |
tnext | HDL シミュレータが 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 ポート情報
分野... | 含まれるもの... | どれの... | そして適用対象... |
---|---|---|---|
field1 | in | ポートが入力ポートであることを示します | すべてのポートタイプ |
out | ポートが出力ポートであることを示します | すべてのポートタイプ | |
inout | ポートが双方向ポートであることを示します | すべてのポートタイプ | |
tscale | HDLシミュレータで指定されたシミュレータ解像度の制限を秒単位で示します。 | すべてのタイプ | |
field2 | portname | 港の名前は | すべてのポートタイプ |
field3 | type | ポートタイプを識別します VHDL の場合: Verilogの場合: | すべてのポートタイプ |
| VHDL | VHDL | |
| VHDL | VHDL | |
size | VHDL:データを含む行列のサイズ Verilog:データを含むビットベクトルのサイズ | すべてのポートタイプ | |
label | VHDL:文字リテラルまたはラベル Verilog: 文字ベクトル | VHDL:定義済み型 Verilog:すべてのポートタイプ |
ModelSim 関数の最初の呼び出しには、portinfo
構造体を含む 3 つの引数があります。引数の数を確認することは、portinfo
が渡されたことを確認する 1 つの方法です。次に例を示します。
if(nargin ==3) tscale = portinfo.tscale; end