syn.directive.array_partition - 2025.2 日本語 - UG1399

Vitis 高位合成ユーザー ガイド (UG1399)

Document ID
UG1399
Release Date
2026-01-22
Version
2025.2 日本語

説明

重要: syn.directive.array_partition および syn.directive.array_reshape は、最上位関数の M_AXI インターフェイスではサポートされません。代わりに、 『Vitis 高位合成ユーザー ガイド』 (UG1399) の「ベクター データ型」で説明するように、hls::vector データ型を使用できます。

syn.directive.array_partition は、配列をより小型の配列または個々の要素に分割します。

この分割では、次の操作を実行できます。

  • 1 つの大型メモリではなく、複数の小型メモリまたは複数のレジスタを含む RTL が生成されます。
  • ストレージの読み出しおよび書き込みポートの数が増加します。
  • デザインのスループットが向上する可能性があります。
  • より多くのメモリ インスタンスまたはレジスタが必要となります。

構文

syn.directive.array_partition=[OPTIONS] <location> <array>
  • <location>: 配列変数を含める場所を function[/label] の形式で指定します。
  • <array>: パーティションする配列変数を指定します。

オプション

dim=<integer>
分割する配列の次元を指定します。デフォルトは 1 です。
  • 次元は、多次元配列にのみ使用します。
  • 値を 0 にすると、指定したオプションですべての次元が分割されます。
  • その他の値を指定すると、その次元のみが分割されます。たとえば、値が 1 の場合、最初の次元のみが分割さます。
type=(block|cyclic|complete)
  • block タイプの分割では、元の配列の連続したブロックから小型配列が作成されます。N-factor オプションで定義される整数だとすると、1 つの配列が N 個のブロックに分割されます。
  • cyclic 分割では、元の配列の要素をインターリーブすることにより小型配列が作成されます。たとえば、-factor 3 が使用されると、結果は次のようになります。
    • 要素 0 は 1 つ目の新しい配列に割り当てられます。
    • 要素 1 は 2 つ目の新しい配列に割り当てられます。
    • 要素 2 は 3 つ目の新しい配列に割り当てられます。
    • 要素 3 は再び 1 つ目の新しい配列に戻ります。
  • complete 分割では、配列を個々の要素に分割します。1 次元配列の場合は、メモリが個々のレジスタに分割されます。複数次元の配列の場合は、各次元の分割を指定するか、または -dim 0 を使用してすべての次元を分割します。
デフォルトは complete です。
factor=<integer>
block または cyclic 分割のみに使用され、作成する小さい配列の数を指定します。
off=true
指定した変数に対して、(必要に応じて) 指定した dim の ARRAY_PARTITION 機能を無効にします。

例 1

関数 func の配列 AB[13] を 4 つの配列に分割します。4 は 13 の因数ではないので、次のように分割されます。

  • 3 つの配列に要素が 3 個ずつ含まれます。
  • 1 つの配列に 4 つのエレメント (AB[9:12]) が含まれます。
syn.directive.array_partition=func AB type=block factor=4

関数 func の配列 AB[6][4] を各次元が [6][2] の 2 つの配列に分割します。

syn.directive.array_partition=func AB type=block factor=2 dim=2

関数 func の AB[4][10][6] のすべての次元を個々の要素に分割します。

syn.directive.array_partition=func AB type=complete dim=0

例 2

コード内で分割された配列を扱う場合は、分割後の新しい配列構造を使用します。次は、指定した指示子を使用した場合のコード例です。
syn.directive.array_partition=top b type=complete dim=1

このコードは、次のように構成できます。

struct SS
{
  int x[N];
  int y[N];
};
  
int top(SS *a, int b[4][6], SS &c) {...}

syn.directive.interface mode=ap_memory top b[0]
syn.directive.interface mode=ap_memory top b[1]
syn.directive.interface mode=ap_memory top b[2]
syn.directive.interface mode=ap_memory top b[3]