スタティック変数は、ループの反復間でデータを維持するために使用される変数で、最終的なインプリメンテーションでレジスタになることがよくあります。これがパイプライン処理された関数に使用されていると、Vitis HLS でデザインを十分に最適化できず、開始間隔 (II) が要件を超えることがあります。
次に、この状況の典型的な例を示します。
function_foo()
{
static bool change = 0
if (condition_xyz){
change = x; // store
}
y = change; // load
}
Vitis HLS でこのコードを最適化できない場合、ストア操作に 1 サイクル、ロード操作に 1 サイクル必要となります。この関数がパイプラインの一部である場合は、スタティック変更変数によりループ運搬依存が作成されるので、パイプラインを最小限の開始間隔である 2 を使用してインプリメントする必要があります。
これを回避する方法の 1 つは、コードを次のように書き直すことです。これにより、ループの反復ごとに read または write のみが存在するようになるので、デザインが II=1 でスケジュールできるようになります。
function_readstream()
{
static bool change = 0
bool change_temp = 0;
if (condition_xyz)
{
change = x; // store
change_temp = x;
}
else
{
change_temp = change; // load
}
y = change_temp;
}