説明
すべてのループを 1 つのループに結合します。ループを結合すると、次が可能になります。
- RTL でループ本文のインプリメンテーション間の移行に必要なクロック サイクル数を削減できます。
- ループを並列にインプリメントできます (可能な場合)。
ループ結合の規則は、次のとおりです。
- ループの境界が変数の場合、同じ値 (反復回数) である必要があります。
- ループの境界が定数の場合、最大定数値が結合されたループの境界として使用されます。
- 境界が変数のループと定数のループを結合することはできません。
- 結合するループ間のコードが、結合により悪影響を受けないようにします。このコードを複数回実行しても常に同じ結果になるようにする必要があります。
-
a=b
は使用可能。 -
a=a+1
は使用不可。
-
- ループに FIFO 読み出しが含まれる場合は、ループは結合できません。結合により読み出しの順序が変更されてしまうためです。FIFO または FIFO インターフェイスからの読み出しは、常に順序どおりに実行される必要があります。
構文
syn.directive.loop_merge=[options] <location>
-
<location>
: ループの場所をfunction[/label]
というフォーマットで指定します。
オプション
-
force
- Vitis HLS で警告が出力されても、ループが結合されます。結合したループが問題なく動作するかどうかは、ユーザーが確認する必要があります。
例
次の例では、関数 foo
の連続するすべてのループを 1 つのループに結合しています。
syn.directive.loop_merge=foo
次の例では、関数 foo
内のループ loop_2
に含まれるすべてのループ (loop_2
自体を除く) を force
オプションを使用して結合しています。
syn.directive.loop_merge=force foo/loop_2