説明
DISAGGREGATE プラグマを使用すると、struct
変数を個別の要素に分割できます。作成される要素の数とタイプは、その構造体の内容によって決まります。
重要: 最上位関数への引数として使用される構造体は、デフォルトでは集約されますが、このプラグマまたは指示子を使用して分割できます。ストリームに関連付けられている構造体の分割に関する重要な情報は、AXI4-Stream インターフェイスを参照してください。
構文
C ソースの領域、関数、またはループ内に配置します。
#pragma HLS disaggregate variable=<variable>
オプション
説明:
-
variable=<variable>
: 分割する構造体変数名を指定します。
例 1
次の例は、関数 top
の構造体変数 a
を分割します。
#pragma HLS disaggregate variable=a
例 2
分割された構造体は、次に示すように、標準の C/C++ コーディング スタイルを使用して、コード内でアドレス指定できます。ポインター要素 (a) とリファレンス要素 (c) にアクセスする方法の違いに注意してください。
struct SS
{
int x[N];
int y[N];
};
int top(SS *a, int b[4][6], SS &c) {
#pragma HLS disaggregate variable = a
#pragma HLS interface s_axilite port = a->x
#pragma HLS interface s_axilite port = a->y
// Following is now supported
#pragma HLS disaggregate variable = c
#pragma HLS interface ap_memory port = c.x
#pragma HLS interface ap_memory port = c.y
例 3
次の例は、RGB
構造体を要素として含む Dot
構造体を示しています。DISAGGREGATE プラグマを Arr
変数に適用すると、最上位の Dot
構造体のみが集約解除されます。
struct Pixel {
char R;
char G;
char B;
};
struct Dot {
Pixel RGB;
unsigned Size;
};
#define N 1086
void DUT(Dot Arr[N]) {
#pragma HLS disaggregate variable=Arr
...
}
構造体全体 (Dot
および RGB
) を集約解除する場合は、次のように DISAGGREGATE プラグマを割り当てます。
void DUT(Dot Arr[N]) {
#pragma HLS disaggregate variable=Arr->RGB
...
}
この場合、結果は次のようになります。
void DUT(char Arr_RGB_R[N], char Arr_RGB_G[N], char Arr_RGB_B[N], unsigned Arr_Size[N]) {
#pragma HLS disaggregate variable=Arr->RGB
...
}