カーネルのリンク で説明したように、さまざまな --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.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 を挿入して、ストールが発生しないようにします。値は整数で指定します。
--connectivity.sc
カーネルがそれ自体を駆動すると、エラーが発生します。たとえば、計算ユニット 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 もインスタンシエートされます。
--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
オプションを使用してメモリ リソースに明示的にマップされていない引数は、ビルド プロセス中に自動的に使用可能なメモリ リソースに接続されます。
--connectivity.sp
オプションを使用する場合は、引数名を指定して接続に柔軟性を持たせることをお勧めしています。ただし、このオプションを使用してカーネル インタフェース ポートを指定することもできます。有効な値は、次のとおりです。
<cu_name>.<kernel_argument_name>:<sptag[min:max]>
説明:
-
<cu_name>
:--connectivity.nk
オプションで指定した計算ユニットの名前です。別の名前を指定しない場合、これは通常<kernel_name>_1
になります。 -
<kernel_argument_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.noc.connect
--connectivity.noc.connect <arg>
<arg>
は <compute_unit_name>.<kernel_interface_name>:<noc
interface>
の形式で、PL カーネル インタフェースと Versal NoC 間の接続を指定します。有効な値は、内部メモリ コントローラー、または Versal NoC セルのマスター インターフェイスです。
Vitis コンパイラは、ダイナミック領域全体の NoC 接続および M_AXI プロパティ (データ幅 * クロック周波数) に基づいてカーネル帯域幅要件を見積もり、使用可能な帯域幅を超えないように必要に応じてスケーリングして、読み出しおよび書き込み帯域幅の NoC コンフィギュレーションを自動的に設定します。
[connectivity]
noc.read_bw=mm2s.M_AXI:2000.16
noc.write_bw=mm2s.M_AXI:2010.16
noc.connect=mm2s.M_AXI:M00_INI
--connectivity.noc.read_bw
--connectivity.noc.read_bw <arg>
<arg>
は <compute_unit_name>.<kernel_interface_name>:<Bandwidth>.<Avg_burst_length>
形式で、接続の帯域幅とバースト長の両方を指定します。帯域幅は、達成された MB/s で指定されます。
このオプションは、M_AXI インターフェイスで想定される読み出しトラフィック特性を指定し、自動の Versal NoC コンフィギュレーションを上書きできるようにします。
--connectivity.noc.write_bw
--connectivity.noc.write_bw <arg>
<arg> は <compute_unit_name>.<kernel_interface_name>:<Bandwidth>.<Avg_burst_length>
形式で、接続の帯域幅とバースト長の両方を指定します。帯域幅は、達成された MB/s で指定されます。
このオプションは、M_AXI インターフェイスで想定される書き込みトラフィック特性を指定し、自動 Versal NoC コンフィギュレーションを上書きできるようにします。
--connectivity.connect
--connectivity.connect <X:Y>
このオプションは Vivado IP インテグレーターを使用して接続する場合に使用できますが、v++
は指定された接続でエラー チェックを実行しません。これを使用して、カーネルとターゲット プラットフォームの非 AXI エレメント間の一般的な接続 (GT ポートへの接続など) を指定します。
connect_bd_net
または connect_bd_intf_net
コマンドと互換性のある引数として指定する必要があります。<X:Y>
の形式は次のとおりです。src/hierarchy_name/cell_name/pin_name:dst/hierarchy_name/cell_name/pin_name
これらには、--conectivity.sc
の使用を必要とする AXI4-Stream インターフェイス間の接続、または上記のように --connectivity.sp
の使用を必要とする M_AXI インターフェイス間の接続は含まれません。
[connectivity]
セクション ヘッドの下で次のフォーマットを使用して指定できます。[connectivity]
connect=<X:Y>