説明
デフォルトでは、配列変数は RAM としてインプリメントされます。
- 最上位関数の配列パラメーターは、RAM インターフェイスのポートとしてインプリメントされます。
- 一般配列は、読み出しおよび書き込みアクセス用に RAM としてインプリメントされます。
- 下位関数、またはループ ベースのデータフロー最適化に関連する配列は、RAM のピンポン バッファー チャネルを使用してインプリメントされます。
配列に格納されているデータが順次に消費または生成される場合は、RAM ではなく FIFO を使用し、ストリーミング データを使用するほうが効率的です。最上位関数の引数の INTERFACE が mode=ap_fifo
に指定されている場合は、配列は自動的にストリーミングとしてインプリメントされます。詳細は、『Vitis 高位合成ユーザー ガイド』 (UG1399) の「Vivado IP フロー」を参照してください。
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
関数 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