関数テンプレートを使用したブロックの定義 - 2021.2 日本語

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

Document ID
UG1483
Release Date
2021-10-22
Version
2021.2 日本語
重要: テンプレート構文を使用するには、xmcImportFunction を実行したときに、関数シグネチャおよび定義がヘッダー ファイルで指定されている必要があります。

int32 のように定義したデータ型のみをサポートする関数を記述するのが一般的ですが、異なるサイズの入力または異なるデータ型をサポートするブロックや、固定小数点長および小数部の長さが異なる信号をサポートするブロックを作成することが必要な場合もあります。これには、関数テンプレートを使用してさまざまな信号サイズ、データ型、またはデータ次元をサポートするブロックを作成します。

ブロックは、次の例のように関数テンプレートを使用して定義できます。

#include <stdint.h>
template <int ROWS, int COLS>
void simple_matrix_add(const int16_t in1[ROWS][COLS],
                       const int16_t in2[ROWS][COLS],
                       int16_t out[ROWS][COLS]) {
   for (int i = 0; i<ROWS; i++) { 
      for (int j = 0; j<COLS; j++) { 
         out[i][j] = in1[i][j] + in2[i][j]; 
      }   
   } 
}

この例では、テンプレート パラメーター ROWS および COLS を使用しています。たとえば、入力配列および出力配列の実際の次元 in1[ROWS][COLS] は、ブロックへの入力信号の次元によりシミュレーション時に決定されます。ROWS および COLS は関数引数の次元を定義するのに使用されるテンプレート パラメーターで、i<ROWS のように関数の本体でも使用されます。

関数を Model Composer にインポートするには、次のコマンドを使用します。
xmcImportFunction('SimpleLib',{'simple_matrix_add'},...
'template_example.h',{},{},'unlock')
ヒント: この例の省略記号 (...) は、コマンドが次の行に続いていることを示しています。詳細は、MATLAB 資料の「複数行での長いステートメントの継続」を参照してください。

テンプレート パラメーターを使用して、単純な算術演算を実行できます。たとえば、次のコードでは入力行列の ROWS と COLS を乗算して出力を定義しています。

#include <stdint.h>
#pragma XMC INPORT in
#pragma XMC OUTPORT out
template<int ROWS,int COLS>
void columnize(const int16_t in[ROWS][COLS], int16_t out[ROWS*COLS]) {
   for (int i = 0; i<ROWS; i++) {
      for (int j = 0; j<COLS; j++) { 
         out[i*COLS+j] = in[i][j];
      }
   }
}
図 1. columnize 関数

ほかにも、テンプレート パラメーターおよび整数定数の両方を使用した +、-、*、/、%、<<、>> などの単純な演算がサポートされています。次に例を示します。

template<int M, int N>
void func(const int in[M][N], int out[M*2][M*N]);

template<int ROWS, int COLS>
void func(array[2 * (ROWS + 1) + COLS + 3]);

また、次に示すような関数テンプレートを使用し、可変ワード長および整数長の固定小数点データ型を使用する関数テンプレートを定義することもできます。

#include <stdint.h>
#include <ap_fixed.h>
#pragma XMC OUTPORT out
template <int WordLen, int IntLen>
void fixed_add(const ap_fixed<WordLen,IntLen> in1, 
                      const ap_fixed<WordLen,IntLen> in2, 
                      ap_fixed<WordLen+1,IntLen> &out) {
   out = in1+in2;
}
上記の例では、Vitis HLS からの固定小数点表記が使用され、ワード長および整数長が指定されています。Model Composer では、データ型の使用 に説明するように、ユーザーがワード長と小数部の長さを指定します。この場合、Model Composer の固定小数点データ型をインポートされた fixed_add ブロックに接続する際に注意が必要です。たとえば、上記の関数で WordLen が 16、IntLen が 11 の場合、Model Composer の固定小数点型ではワード長が 16、小数部の長さが 5 になります。Vitis HLS での固定小数点の表記については、 『Vitis 高位合成ユーザー ガイド』 (UG1399) を参照してください。
ヒント: 上記の例に示すように、固定小数点のテンプレート パラメーターでは単純な算術演算もサポートされています。
fixed_add 関数をインポートして Model Composer でブロックを作成するには、次のコマンドを使用します。
xmcImportFunction('SimpleLib',{'fixed_add'},fixed_example.h',{},...
{'$XILINX_VIVADO/include'})