static
修飾子を使用してメモリとしてインプリメントされる配列を指定することをお勧めしています。これにより、Vitis HLS で RTL のメモリを使用して配列をインプリメントできるようになるほか、デフォルトの static 型初期化動作を使用できるようになります。次のコード例では、配列は値のセットを使用して初期化されます。関数が実行されるたびに、coeff
配列にこれらの値が代入されます。合成後、coeff
をインプリメントする RAM が実行されるたびに、これらの値が読み込まれます。シングル ポート RAM の場合は、8 クロック サイクルかかります。1024 の配列の場合、当然 1024 クロック サイクルかかります。この間、coeff
によっては演算は実行されません。
int coeff[8] = {-2, 8, -4, 10, 14, 10, -4, 8, -2};
次のコードでは、static
修飾子を使用して coeff
配列を定義しています。配列は実行開始時に指定した値で初期化されます。関数が実行されるたびに、coeff
配列には前の実行からの値が記録されます。C/C++ コードでは、static 配列はメモリが RTL で動作するように動作します。
static int coeff[8] = {-2, 8, -4, 10, 14, 10, -4, 8, -2};
また、変数に static
修飾子が含まれる場合、Vitis HLS は RTL デザインおよび FPGA ビットストリームの変数を初期化します。これにより、メモリを初期化するのに複数クロック サイクルも必要なくなり、大容量メモリの初期化が使用オーバーヘッドにならなくなります。GitHub で公開されている initialization_and_reset を例として参照してください。
リセットを適用した後に static 変数をその初期ステートに戻すかどうかは、RTL コンフィギュレーション コマンド syn.rtl.reset
で指定できます。これはデフォルトではありません。syn.rtl.reset=state
または all
が使用されると、すべての要素がブロック RAM としてインプリメントされ、リセット後に初期値に戻ります。これにより、RTL デザインでかなり不適切な条件が 2 つできてしまうことがあります。
- 電源投入時の初期化 (パワー オン リセット) とは異なり、明示的なリセットでは RTL デザインでブロック RAM 内の各アドレスに反復的に値を設定する必要あり。N が大きい場合は多数のクロック サイクルがかかることがあり、リセットをインプリメントするのにより多くのエリア リソースが必要。
- リセットがデザインのすべての配列に追加される。
このようなブロック RAM すべてにリセット ロジックが追加されて RAM のすべての要素をリセットするためのサイクル オーバーヘッドが発生しないようにするには、デフォルトの syn.rtl.reset=control
リセット モードを指定し、RESET プラグマまたは指示子でスタティックまたはグローバル変数をそれぞれ識別します。
または、syn.rtl.reset=state
リセット モードを使用し、RESET 指示子に off
オプションを使用して、リセットしないスタティックまたはグローバル変数を個別に指定します。
最後に、選択するハードウェア デバイスまたはプラットフォーム (UltraScale+、Versal など) により、ブロック RAM や URAM の初期化および/またはリセットの方法に違いがある場合があります。一般に、Vitis HLS では 2 種類のリセットがサポートされておりしています。1 つはデバイスに電源が投入されたとき (電源投入時の初期化またはパワー オン リセットとも呼ばれる)、もう 1 つはデバイスの実行中にハードウェア RESET 信号がアサートされたときです。次に、異なるメモリ リソースによる動作の違いを示します。
- 初期化動作: すべてのプラットフォームのすべてのブロック RAM に適用され、Versal URAM にのみ適用されます。電源投入時の初期化 (またはパワー オン リセット) 時の動作です。
- 配列が読み出し/書き込みされる場合、「初期値配列」と「実行時配列」を維持します。これはブロック RAM と URAM の両方に適用され、デバイス実行中のハードウェア RESET 信号に該当します。
write thru
、read first
、no change
です。URAM でサポートされるのは、no change
のみです。Vitis HLS は、URAM ポートで同じサイクルのメモリ操作をスケジュールできない場合、次の警告メッセージを表示します。Usage of URAM can potentially cause worse II as Vitis HLS does not exploit
read-first mode for URAMs. Consider using block RAMs instead.