syn.directive.loop_merge - 2024.1 日本語

Vitis 高位合成ユーザー ガイド (UG1399)

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

説明

すべてのループを 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