カスタマイズ パラメーターの定義 - 2021.2 日本語

Vitis Model Composer ユーザー ガイド (UG1483)

Document ID
UG1483
Release Date
2021-10-22
Version
2021.2 日本語

ポートの配列サイズとデータ型は、テンプレート パラメーターを使用して定義できます。これらのパラメーターは、ブロックの入力信号により定義されます。追加のカスタマイズ パラメーターも定義できます。これらは入力信号では定義されないので、シミュレーション実行時間前にユーザーが [Block Parameter] ダイアログ ボックスで定義する必要があります。

ライブラリ関数ブロックのカスタマイズ パラメーターを定義するには、2 つの方法があります。
  • C/C++ の関数テンプレートを使用する。
  • 関数引数に Model Composer (XMC) PARAMETER プラグマを割り当て、ブロックの入力または出力に接続するのではなく、カスタマイズ パラメーターとして定義する。

どちらの方法にも利点と欠点があります。それらを次に説明します。

関数テンプレート

最初の方法では、カスタマイズにテンプレート パラメーターを使用する関数テンプレートを定義します。テンプレート パラメーターは、その値が入力信号で決定されない (関数により出力として導出される) 場合は、Model Composer のカスタマイズ パラメーターを定義します。カスタマイズ パラメーターを使用すると、出力ポートの値、データ型、またはデータの次元、あるいは関数本体で使用するパラメーターを定義できます。
重要: テンプレート関数シグネチャおよび関数定義は、C/C++ ヘッダー ファイルで定義する必要があります。

関数引数のテンプレート パラメーターは、標準関数テンプレート構文を使用して定義されますが、テンプレート パラメーターは関数シグネチャの入力引数には割り当てられません。ブロックをモデルにインスタンシエートすると、Model Composer により値が入力信号で決定されないテンプレート パラメーターが識別され、これらのカスタマイズ パラメーターの値をユーザーが定義できるようになります。モデルのカスタマイズ パラメーターの値は、シミュレーションの前であればいつでも定義できます。

関数テンプレートでは、カスタマイズ パラメーターはデータ型のサイズまたは次元を定義する整数か、データ型を定義可能なスカラー変数にしかできません。Model Composer では、整数パラメーターのデフォルト値 0、データ型のデフォルト値 int32、または typename パラメーターが定義されます。

次に示す関数テンプレートの例では、テンプレート パラメーター M および B はパラメーター値が入力信号からブロックに継承されないので、カスタマイズ パラメーターを定義します。この場合、ブロックをモデルに追加したときか、シミュレーション前に、パラメーターをユーザーがカスタマイズする必要があります。
template <int M, int B>
double func1(double x) {
   return x * M + B;
}

カスタマイズ パラメーターは、次の func1 関数の例に示すように、インポートされたブロックの [Block Parameters] ダイアログ ボックスに表示されます。モデルでブロックをダブルクリックして Block Parameters ダイアログ ボックスを開き、次の図に示す [M] および [B] のように変更可能なパラメーターの値を入力します。

図 1. パラメーター値の入力
オプションで、カスタマイズ パラメーターのフィールドに MATLAB ワークスペース変数の名前を入力して、Model Composer で MATLAB 変数により値が決定されるようにすることも可能です。たとえば、変数 param1MATLAB ワークスペースで定義され、M の値を定義するのに使用されます。
図 2. ワークスペース変数を使用してパラメーターを定義

PARAMETER プラグマ

2 番目の方法では、Model Composer の PARAMETER プラグマを使用して関数引数をカスタマイズ パラメーターとして定義します。

関数引数をカスタマイズ パラメーターとして宣言するには、ヘッダー ファイルの関数シグネチャの前に PARAMETER プラグマを追加して、その後にパラメーター名を記述します。1 つのプラグマで複数のパラメーターを指定するか、各パラメーターに個別のプラグマを使用できます。
#pragma XMC PARAMETER <name1>, <name2>
#pragma XMC PARAMETER <name3>
function declaration(<name1>, <name2>, <name3>)

関数引数をプラグマを使用してカスタマイズ パラメーターと宣言した場合、xmcImportFunction コマンドでその引数に対してブロックに入力ポートまたは出力ポートは作成されません。関数の本体内でのみ使用されるよう定義されます。モデルにブロックを追加すると、[Block Parameter] ダイアログ ボックスにカスタマイズ フィールドが追加され、ユーザーが値を定義できるようになります。

入力信号により駆動されている関数引数に PARAMETER プラグマを使用すると、エラーまたは警告となります。この場合、関数の信号入力伝搬の方がカスタマイズ パラメーターよりも優先されます。

関数テンプレートではスカラーおよび整数パラメーターしかサポートされませんが、PARAMETER プラグマではパラメーターに整数、浮動小数点型または固定小数点型がサポートされます。カスタマイズ パラメーターをスカラー、ベクター、または 2 次元行列にすることもできます。さらに、関数テンプレートでは整数型のデフォルト値は 0、データ型のデフォルト値は int32 に定義されていますが、PARAMETER プラグマではユーザーがパラメーターのデフォルト値を定義できます。ユーザーがデフォルト値を定義しない場合は、すべてのパラメーターのデフォルト値が 0 に定義されます。

次の例では、Model Composer の PARAMETER プラグマを使用してカスタマイズ パラメーター M と B を定義しています。

#pragma XMC PARAMETER M, B
double func2(double x, double M = 1.2, double B = 3) {
return x * M + B;
}

M および B カスタマイズ パラメーターには、デフォルト値 M=1.2 および B=3 も指定されています。カスタマイズ パラメーターのデフォルト値は、関数シグネチャの引数に割り当てられ、Block Parameters ダイアログ ボックスにも次のように表示されます。

図 3. デフォルト値が指定されたカスタマイズ パラメーター
重要: 引数のカスタマイズ パラメーターにデフォルト値を割り当てた場合、引数のデフォルト値なしで関数が呼び出される可能性があるので、C/C++ でその後のすべての引数にもデフォルト値を割り当てる必要があります。そのため、デフォルト値を指定するカスタマイズ パラメーターは関数引数リストの最後に追加してください。

ベクターおよび行列カスタマイズ パラメーター

PARAMETER プラグマは、ベクターと行列、または値を持つカスタマイズ パラメーターを指定するのに使用することもできます。次の例では、coef ベクターがプラグマによりカスタマイズ パラメーターとして定義されています。
#pragma XMC PARAMETER coef
#pragma XMC INPORT din
#pragma XMC OUTPORT dout 
#pragma XMC SUPPORTS_STREAMING
void FIR(ap_fixed<17, 3> din[100], ap_fixed<17, 3> dout[100], 
ap_fixed<16, 2> coef[52]);
カスタマイズ パラメーターの定数配列値は、MATLAB 論理式形式で入力されます。カンマはオプションです。
  • ベクター パラメーター: [val1, val2, val3, ...]
  • 行列パラメーター (行優先順): [val11, val12, val13, ...; val21, val22, val23, ...; ...]

インターフェイス出力のデータ型とサイズ

カスタマイズ パラメーターは、関数への入力で値が決定されない出力ポートのデータ型および次元サイズを直接設定するためにも使用できます。次の関数では、テンプレート変数で ap_fixed のデータ型のワード長と小数部の長さ、および配列サイズを定義しています。

template <typename T1, int N1, int W2, int I2, int N2>
void func(const T1 in[N1], ap_fixed<W2, I2> out[N2]) {
...
}

テンプレート変数 W2、I2、および N2 は、値が入力引数により決定されず、ユーザーが設定する必要があるので、カスタマイズ パラメーターを定義します。テンプレート変数 T1 および N1 は、Model Composer により入力ポートで指定されることが認識されるので、データ型 (typename) および入力ベクターのサイズはカスタマイズ パラメーターではなく、ブロックの入力信号により定義されます。

出力ポートのデータ型または関数の本体で使用される引数を設定するには、指定された typename が Model Composer でサポートされるデータ型 (符号付きおよび符号なしの固定データ型を含む) の 1 つである必要があります。

表 1. Model Composer でサポートされるデータ型
サポートされる typename
'int8'
'uint8'
'int16'
'uint16'
'int32'
'uint32'
'double'
'single'
'x_half'
'boolean'
'x_sfix<n1>_En<n2>'
'x_ufix<n1>_En<n2>'

次の関数例では、T1 の typename は入力信号により決定されますが、T2 の typename はブロックをモデルに追加したときかシミュレーションの前に Block Parameters ダイアログ ボックスで設定します。

template <typename T1, int N1, typename T2, int N2>
void func(const T1 in[N1], T2 out[N2]) {
...
}