Vitis Model Composer の BUFFER_DEPTH
プラグマは、インプリメンテーションでブロックに接続するバッファーのサイズを適切に設定するための情報を示します。これらのバッファーは、ハードウェアに FIFO としてインプリメントされます。デフォルトでは、Model Composer でバッファーの深さが 1 に設定されます。ただし、デザインに再収束パス (2 つのパスが同じノードに収束) があり、1 つのパスにあるブロックからのデータ処理がほかのパスからのデータ処理とロックステップでない場合、デッドロック状態が発生する可能性があります。デッドロック状態を回避するには、データを格納するため、パス上にある 1 つまたは複数のバッファーの深さを増加します。次の例にこの概念を示します。
次の図では、flip
ブロックの出力信号 (赤色のパス) と Shift Right
ブロックの出力 (青色のパス) が Sum
ブロックにより消費されます。flip
ブロックは xmcImportFunction
コマンドにより作成され、そのソース コードは先ほど説明した
flip
関数に示されています。
flip
ブロックのコードから、最初の出力を生成するには 2 つの行を読み出す必要があることがわかります。ブロックに BUFFER_DEPTH
プラグマが指定されていない場合、Model Composer により図の信号のバッファーの深さが 1 に設定されます。これにより flip
ブロックが最初の出力を生成する前に入力 FIFO から 257 ピクセルが読み出されるので、デッドロック状態が発生します。デフォルトでは、Sum
の 2 つ目の入力に供給される並列の青色のパスには 1 ピクセルのストレージしかありません。
flip
関数に示すように、ヘッダー ファイルの関数宣言の前にプラグマを追加します。#pragma XMC BUFFER_DEPTH <depth>
<depth> はバッファーの深さで、値または式で指定できます。
flip
関数で #pragma XMC BUFFER_DEPTH
4+2*WIDTH
を指定すると、Model Composer により再収束パスの処理に不均衡があることが検出され、この不均衡に対処するため Sum
ブロックの 2 つ目の入力 (青色のパス) のバッファー深さを flip
ブロックのバッファー深さに一致させます。
flip
関数の例では、BUFFER_DEPTH
は 256 (2*WIDTH
) では不十分で、260 (4+2*WIDTH
) にするとデッドロック状態が回避されます。