配列の初期化およびリセット - 2023.2 日本語

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

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

次のコード例では、配列は値のセットを使用して初期化されます。関数が実行されるたびに、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 信号に該当します。
ヒント: URAM は、同じアドレスへの読み出しと書き込みが同じメモリ ポートにマップされる場合、ブロック RAM とは異なり、read first 出力の write_mode モードをサポートしません。ブロック RAM でサポートされる書き込みモードは、write thruread firstno 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.