スタティック変数によるパイプライン処理の制限 - 2023.2 日本語

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

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 日本語

スタティック変数は、ループの反復間でデータを維持するために使用される変数で、最終的なインプリメンテーションでレジスタになることがよくあります。これがパイプライン処理された関数に使用されていると、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;
}