説明
入れ子になっているループを 1 つのループ階層にフラット化します。
RTL インプリメンテーションでは、ループ階層にあるループ間の移動に 1 クロック サイクルかかります。入れ子のループをフラットにすると、それらを 1 つのループとして最適化できるので、クロック サイクル数を削減でき、ループ本文のロジックをさらに最適化することが可能です。
推奨: この指示子は、ループ階層の最内ループに適用する必要があります。完全または半完全ループのみをこの方法でフラット化できます。
- 完全ループの入れ子
-
- 最内ループのみにループ本体の内容が含まれます。
- ループ文の間に指定されるロジックはありません。
- すべてのループ範囲は定数です。
- 半完全ループの入れ子
-
- 最内ループのみにループ本体の内容が含まれます。
- ループ文の間に指定されるロジックはありません。
- 最外ループの範囲は変数にできます。
- 不完全ループの入れ子
-
内側のループの範囲が変数であったり、ループ本体が内側のループにのみ含まれているとは限らない場合、コードの構造を変更するか、ループ本体内のループを展開して、完全ループの入れ子を作成してみてください。
構文
syn.directive.loop_flatten=[OPTIONS] <location>
-
<location>
: 場所 (最内ループ) をfunction[/label]
の形式で指定します。
オプション
-
off
- フラット化が実行されないようにします。指定の場所の一部のループはフラット化せず、それ以外のループをフラット化することもできます。重要: LOOP_FLATTEN プラグマまたは指示子を使用すると、最適化がイネーブルになります。
off
を使用すると、ディスエーブルになります。
例
関数 foo
内の loop_1
と、ループ階層でこれより上にあるすべてのループ (完全または半完全) を 1 つのループにフラット化します。
set_directive_loop_flatten=foo/loop_1
関数 foo
の loop_2
でループがフラット化されないようにします。
set_directive_loop_flatten=off foo/loop_2