カーネルのリンク で説明したように、さまざまな --connectivity.XXX
オプションを使用して、CU 数を指定したり、それらを SLR に割り当てたり、カーネル ポートをグローバル メモリに接続したり、ストリーミング ポート接続を構築したりといった FPGA バイナリのトポロジを定義できます。これらのコマンドはビルド プロセスに含まれ、アプリケーションの定義および構築に重要です。
--connectivity.nk
--connectivity.nk <arg>
<arg>
は <kernel_name>:#:<cu_name1>.<cu_name2>...<cu_name#>
のように指定します。
これで、リンク プロセスで生成された FPGA バイナリ (.xclbin
) ファイルで指定されているカーネル (kernel_name
) に、指定した数の CU (#
) がインスタンシエートされます。cu_name
はオプションです。cu_name
を指定しない場合、カーネルのインスタンス名は 1 つ目が kernel_name_1
、2 つ目が kernel_name_2
のようになります。デフォルトでは、Vitis コンパイラで各カーネルごとに計算ユニット 1 つがインスタンシエートされます。
次に例を示します。
v++ --link --connectivity.nk vadd:3:vadd_A.vadd_B.vadd_C
[connectivity]
セクション ヘッドの下で次のフォーマットを使用して指定できます。[connectivity]
nk=vadd:3:vadd_A.vadd_B.vadd_C
--connectivity.slr
--connectivity.slr <arg>
CU をデバイス上の特定の SLR に割り当てます。このオプションは、SLR に割り当てられる各カーネルまたは CU ごとに指定する必要があります。
--connectivity.slr
を使用する場合は、--connectivity.sp
も使用してカーネルのメモリ アクセスを割り当てる必要があります。有効な値は、次のとおりです。
<cu_name>:<SLR_NUM>
説明:
-
<cu_name>
:--connectivity.nk
オプションで指定した計算ユニットの名前です。別の名前を指定しない場合、これは通常<kernel_name>_1
になります。 -
<SLR_NUM>
: CU を割り当てる SLR 番号です。SLR0、SLR1 などです。
たとえば、CU vadd_2
を SLR2、CU fft_1
を SLR1 に割り当てるには、次を使用します。
v++ --link --connectivity.slr vadd_2:SLR2 --connectivity.slr fft_1:SLR1
[connectivity]
セクション ヘッドの下で次のフォーマットを使用して指定できます。[connectivity]
slr=vadd_2:SLR2
slr=fft_1:SLR1
--connectivity.sp
--connectivity.sp <arg>
カーネル インターフェイスのプラットフォーム内のシステム ポートへの割り当てを指定します。このオプションは、主にカーネル ポートを特定のメモリ リソースへの割り当てる際に使用されます。カーネルの各インターフェイスを特定のメモリ リソースにマップするには、--connectivity.sp
オプションを個別に指定する必要があります。--connectivity.sp
オプションを使用してメモリ リソースに明示的にマップされていないカーネル インターフェイスは、ビルド プロセス中に自動的に使用可能なメモリ リソースに接続されます。
有効な値は、次のとおりです。
<cu_name>.<kernel_interface_name>:<sptag[min:max]>
説明:
-
<cu_name>
:--connectivity.nk
オプションで指定した計算ユニットの名前です。別の名前を指定しない場合、これは通常<kernel_name>_1
になります。 -
<kernel_interface_name>
: カーネルの関数引数または計算ユニット ポートの名前です。 -
<sptag>
: ターゲット プラットフォームからのメモリ コントローラー インターフェイス名など、システム ポート タグを示します。有効な<sptag>
名は、DDR、PLRAM、および HBM などです。 -
[min:max]
で、DDR[0:2] のようなメモリ範囲の使用をイネーブルにします。DDR[2] のように、インデックスを 1 つだけ指定することもできます。
<sptag>
およびターゲット プラットフォームのメモリ リソースの範囲は、platforminfo
コマンドで取得できます。詳細は、platforminfo ユーティリティを参照してください。次の例では、VADD カーネルの指定した CU の入力引数 (A) を DDR[0:3B] に、入力引数 (B) を HBM[0:31] にマップし、出力引数 (C) を PLRAM[2] に書き込みます。
v++ --link --connectivity.sp vadd_1.A:DDR[0:3] --connectivity.sp vadd_1.B:HBM[0:31] \
--connectivity.sp vadd_1.C:PLRAM[2]
[connectivity]
セクション ヘッドの下で次のフォーマットを使用して指定できます。[connectivity]
sp=vadd_1.A:DDR[0:3]
sp=vadd_1.B:HBM[0:31]
sp=vadd_1.C:PLRAM[2]
--connectivity.sc
--connectivity.sc <arg>
2 つの計算ユニット間に AXI4-Stream インターフェイスを介したストリーミング接続を作成します。ストリーミング インターフェイス接続ごとに個別の --connectivity.sc
を指定してください。接続は、最初のカーネルのストリーミング出力ポートから 2 つ目のカーネルのストリーミング入力ポートの順になります。有効な値は、次のとおりです。
<cu_name>.<streaming_output_port>:<cu_name>.<streaming_input_port>[:<fifo_depth>]
説明:
-
<cu_name>
:--connectivity.nk
オプションで指定した計算ユニットの名前です。別の名前を指定しない場合、これは通常<kernel_name>_1
になります。 -
<streaming_output_port>/<streaming_input_port>
: AXI4-Stream として宣言された計算ユニット ポートの関数引数です。 -
[:<fifo_depth>]
: 2 つのストリーミング ポート間に指定した深さの FIFO を挿入して、ストールが発生しないようにします。値は整数で指定します。
たとえば、計算ユニット mem_read_1
の AXI4-Stream ポート s_out
を計算ユニット increment_1
の AXI4-Stream ポート s_in
に接続するには、次を使用します。
--connectivity.sc mem_read_1.s_out:increment_1.s_in
[connectivity]
セクション ヘッドの下で次のフォーマットを使用して指定できます。[connectivity]
sc=mem_read_1.s_out:increment_1.s_in
オプションの <fifo_depth> 値を含めると、v++
リンカーで 2 つのカーネル間に FIFO が追加され、ストールが発生しないようにできます。指定すると、デバイスからの BRAM リソースが使用されますが、FIFO を含めるように HLS カーネルをアップデートする必要はありません。接続に 2 つの異なるクロックが使用されたり、バス幅が異なっている場合は、Clock Converter (CDC) や Datawidth Converter (DWC) IP もインスタンシエートされます。