XMC BUFFER_DEPTH - 2022.1 日本語

Vitis Model Composer ユーザー ガイド (UG1483)

Document ID
UG1483
Release Date
2022-05-26
Version
2022.1 日本語

Model Composer の BUFFER_DEPTH プラグマは、インプリメンテーションでブロックに接続するバッファーのサイズを適切に設定するための情報を示します。これらのバッファーは、ハードウェアに FIFO としてインプリメントされます。デフォルトでは、Model Composer でバッファーの深さが 1 に設定されます。ただし、デザインに再収束パス (2 つのパスが同じノードに収束) があり、1 つのパスにあるブロックからのデータ処理がほかのパスからのデータ処理とロックステップでない場合、デッドロック状態が発生する可能性があります。デッドロック状態を回避するには、データを格納するため、パス上にある 1 つまたは複数のバッファーの深さを増加します。次の例にこの概念を示します。

次の図では、flip ブロックの出力信号 (赤色のパス) と Shift Right ブロックの出力 (青色のパス) が Sum ブロックにより消費されます。flip ブロックは xmcImportFunction コマンドにより作成され、そのソース コードは先ほど説明した flip 関数に示されています。

図 1. バッファーの深さ

flip ブロックのコードから、最初の出力を生成するには 2 つの行を読み出す必要があることがわかります。ブロックに BUFFER_DEPTH プラグマが指定されていない場合、Model Composer により図の信号のバッファーの深さが 1 に設定されます。これにより flip ブロックが最初の出力を生成する前に入力 FIFO から 257 ピクセルが読み出されるので、デッドロック状態が発生します。デフォルトでは、Sum の 2 つ目の入力に供給される並列の青色のパスには 1 ピクセルのストレージしかありません。

ヒント: Vitis HLS には、C/RTL 協調シミュレーション中にデッドロック状態を検出する機能があります。デッドロック状態が検出されると、ツールによりデッドロック状態にどの FIFO が関係しているかを示すメッセージが表示されるので、BUFFER_DEPTH を 1 より大きくする必要のある FIFO を特定するのに役立ちます。
BUFFER_DEPTH のデフォルト値を変更するには、flip 関数に示すように、ヘッダー ファイルの関数宣言の前にプラグマを追加します。
#pragma XMC BUFFER_DEPTH <depth>

<depth> はバッファーの深さで、値または式で指定できます。

flip 関数で #pragma XMC BUFFER_DEPTH 4+2*WIDTH を指定すると、Model Composer により再収束パスの処理に不均衡があることが検出され、この不均衡に対処するため Sum ブロックの 2 つ目の入力 (青色のパス) のバッファー深さを flip ブロックのバッファー深さに一致させます。

ヒント: 最低限のバッファー深さは、RTL コードの読み出しと FIFO への書き込みのタイミングにも左右されるので、多少の試行錯誤が必要であることもあります。flip 関数の例では、BUFFER_DEPTH は 256 (2*WIDTH) では不十分で、260 (4+2*WIDTH) にするとデッドロック状態が回避されます。