syn.directive.stream - 2024.1 日本語

Vitis 統合ソフトウェア プラットフォームの資料: アプリケーション アクセラレーション開発 (UG1393)

Document ID
UG1393
Release Date
2024-07-03
Version
2024.1 日本語

説明

デフォルトでは、配列変数は RAM としてインプリメントされます。

  • 最上位関数の配列パラメーターは、RAM インターフェイスのポートとしてインプリメントされます。
  • 一般配列は、読み出しおよび書き込みアクセス用に RAM としてインプリメントされます。
  • 下位関数、またはループ ベースのデータフロー最適化に関連する配列は、RAM のピンポン バッファー チャネルを使用してインプリメントされます。

配列に格納されているデータが順次に消費または生成される場合は、RAM ではなく FIFO を使用し、ストリーミング データを使用するほうが効率的です。最上位関数の引数の INTERFACE が mode=ap_fifo に指定されている場合は、配列は自動的にストリーミングとしてインプリメントされます。詳細は、『Vitis 高位合成ユーザー ガイド』 (UG1399) の「Vivado IP フロー」を参照してください。

重要: アクセスを保持するには、『Vitis 高位合成ユーザー ガイド』 (UG1399) の「型修飾子」に示すように、特定のデッド コード削除で volatile 修飾子を使用してコンパイラ最適化がされないようにする必要があることもあります。

構文

syn.directive.stream=[OPTIONS] <location> <variable>
  • <location>: 配列変数を含める場所を function[/label] の形式で指定します。
  • <variable>: FIFO としてインプリメントする配列変数を指定します。

オプション

depth=<integer>
注記: DATAFLOW チャネルの配列ストリーミングにのみ適用されます。
RTL にインプリメントされる FIFO の深さは、デフォルトでは C コードで指定した配列と同じサイズになります。このオプションを使用すると、FIFO のサイズを変更できます。

配列が DATAFLOW 領域にインプリメントされる場合は、-depth オプションで FIFO のサイズを削減する方法がよく使用されます。たとえば、DATAFLOW 領域ですべてのループおよび関数がデータを II=2 のレートで処理する場合、データはクロック サイクルごとに生成および消費されるので、大型 FIFO は必要ありません。この場合、-depth オプションを使用して FIFO サイズを 2 に削減すると、RTL デザインのエリアを大幅に削減できます。

これと同じ機能は、config_dataflow コマンドで -depth オプションを指定すると、DATAFLOW 領域のすべての配列に使用できます。set_directive_stream-depth オプションを使用すると、config_dataflow を使用して指定したデフォルト設定を上書きできます。

type=<arg>
FIFO、PIPO、同期共有 (shared)、非同期共有 (unsync) のいずれかを選択するメカニズムを指定します。サポートされるタイプは、次のとおりです。
  • fifo: 指定した depth の FIFO バッファー。
  • pipo: 指定された深さ (デフォルトは 2) の「バンク」数を持つ通常のピンポン バッファー。
  • shared: 通常のピンポン バッファーのように、深さあり、配列データの複製なしで同期される共有チャネル。プロデューサーとコンシューマー間の同期化の距離として使用される深さを十分に小さくすることで、一貫性を確実なものにできます。
    ヒント: shared のデフォルトの深さは 1 です。
  • unsync: 個々のメモリ読み出しおよび書き込みを除き、同期化はありません。一貫性 (読み出し-書き込み、書き込み-読み出しの順) は、デザイン自体で確実なものにする必要があります。

関数 func の配列 A[10] をストリーミングにし、FIFO としてインプリメントします。

syn.directive.stream=func A type=fifo

関数 funcloop_1 というループにある配列 B が深さ 12 の FIFO でストリーミングされるように設定します。この場合、プラグマは loop_1 内に挿入する必要があります。

syn.directive.stream=depth=12 type=fifo func/loop_1 B

配列 C は、PIPO としてストリーミングをインプリメントしています。

syn.directive.stream=type=pipo func C