非展開ループからは、少なくとも 1 つのステートを持つ有限ステート マシン (FSM) が作成されます。複数のシーケンシャル ループがある場合、余分なクロック サイクルが追加されるので、これ以上の最適化ができなくなります。
次の図は、簡潔に見えるコーディング スタイルが RTL デザインのパフォーマンスに悪影響を与えている例を示しています。
図 1. ループ指示子
前の図の (A) は、デザインの非展開ループそれぞれで少なくとも FSM の 1 ステートが作成されるところを示しています。このようなステート間の移行では、クロック サイクルが浪費されます。各ループの反復に 1 クロック サイクルかかるとすると、両方のループを実行するのに 11 サイクルかかります。
- Add ループに入るのに 1 クロック サイクル。
- Add ループを実行するのに 4 クロック サイクル。
- Add ループを抜けて Sub ループに入るのに 1 クロック サイクル。
- Sub ループを実行するのに 4 クロック サイクル。
- Sub ループを抜けるのに 1 クロック サイクル。
- 合計 11 クロック サイクル。
この単純な例の場合は、Add ループの else 分岐でも問題を解決できることは明らかですが、より複雑なコードでは簡単にはわからないことありるので、よりわかりやすいコーディング スタイルを使用した方が有益です。
LOOP_MERGE 最適化指示子を使用すると、ループが自動的に結合されるようにできます。ループ結合最適化指示子は、適用されたスコープ内のループすべてを結合しようとします。上記の例の場合、ループの結合により、終了するのに 6 クロックしか必要のない前の図の (B) のような制御構造が作成されます。
ループを結合すると、ループ内のロジックが一緒に最適化されるようになります。ループ結合の変更には制限があり、常に正常に結合できるとは限りません。ただし、コードをリファクタリングすることで、手動でループを結合できます。上記の例の場合、デュアル ポート ブロック RAM を使用すると、加算および乗算が並列で実行できるようになります。