説明
デフォルトでは、配列変数は RAM としてインプリメントされます。
- 最上位関数の配列パラメーターは、RAM インターフェイスのポートとしてインプリメントされます。
- 一般配列は、読み出しおよび書き込みアクセス用に RAM としてインプリメントされます。
- 下位関数、またはループ ベースのデータフロー最適化に関連する配列は、RAM のピンポン バッファー チャネルを使用してインプリメントされます。
配列に格納されたデータが順次消費または生成される場合、RAM ではなく FIFO を使用したストリーミング データの方が効率的です。最上位関数の引数を INTERFACE mode=ap_fifo と指定すると、その配列はストリーミングとしてインプリメントされます。詳細は、
『Vitis 高位合成ユーザー ガイド』 (UG1399) の「Vivado IP フローのインターフェイス」を参照してください。
volatile 修飾子を使用して (特定のデッド コード削除で) コンパイラ最適化がされないようにする必要があることもあります。詳細は、
『Vitis 高位合成ユーザー ガイド』 (UG1399) の「型修飾子」セクションを参照してください。構文
syn.directive.stream=[OPTIONS] <location> <variable>
-
<location>: 配列変数を含める場所をfunction[/label]の形式で指定します。 -
<variable>: FIFO としてインプリメントする配列変数を指定します。
オプション
-
depth=<integer> -
注記: DATAFLOW チャネルの配列ストリーミングにのみ適用されます。RTL にインプリメントされる FIFO の深さは、デフォルトでは C コードで指定した配列と同じサイズになります。このオプションを使用すると、FIFO のサイズを変更できます。
配列が DATAFLOW 領域にインプリメントされる場合は、
-depthオプションを使用して FIFO のサイズを縮小できます。たとえば、すべてのループや関数が II = 1 のレートでデータを処理するDATAFLOW領域では、大きな FIFO は不要です。データは各クロック サイクルで生成および消費されるため、-depthを 2 に設定して FIFO サイズを縮小することで、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
関数 func の loop_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