重要: ここで説明するポート レベルのプロトコルは、Vivado IP フローのインターフェイス で説明した Vivado IP フローで使用できます。これらのプロトコルは、Vitis カーネル フローではサポートされません。
デフォルトでは、入力ポインターおよび値渡し引数は、ハンドシェイク信号のない単純なワイヤ ポートとしてインプリメントされます。たとえば、Vivado IP フローのインターフェイス で説明した vadd
関数では、入力ポートは I/O プロトコルなしのデータ ポートとしてインプリメントされます。ポートに I/O プロトコルがない場合 (デフォルトまたはそのように設計されている場合)、入力データは読み出されるまで安定させる必要があります。
デフォルトでは、出力ポインターは関連する出力 Valid 信号を使用してインプリメントされ、出力データが有効になるタイミングを示します。
vadd
関数の例では、出力ポートは、ポートのデータがいつ有効になって読み出し可能になったかを示す出力 Valid ポート (out_r_o_ap_vld
) を関連付けてインプリメントされます。出力ポートに関連付けられた I/O ポートがない場合は、データを読み出すタイミングを判断するのは困難です。 ヒント: 出力には常に I/O プロトコルを使用するようにすることをお勧めします。
読み出しおよび書き込みの両方が実行される関数引数は、入力ポートと出力ポートに分割されます。vadd
関数の例では、out_r
引数は入力ポート out_r_i
および出力ポート out_r_o
の両方としてインプリメントされ、I/O プロトコル ポート out_r_o_ap_vld
が関連付けられます。
関数に戻り値がある場合、その戻り値を示す出力ポート ap_return
がインプリメントされます。RTL デザインが 1 つのトランザクション (C/C++ 関数の 1 回の実行) で終了する場合、ブロック レベルのプロトコルで ap_done
信号を使用して関数が終了したことが示されます。これは、ap_return
ポートのデータが有効で読み出し可能になったことも示します。
注記: 最上位関数の戻り値をポインターにすることはできません。
たとえば、次のコード例はタイミング ビヘイビアーを示しています (そのターゲット テクノロジとクロック周波数でクロック サイクルごとに 1 つの加算が可能)。
図 1. デフォルト合成での RTL ポートのタイミング
- デザインは
ap_start
が High にアサートされると開始します。 -
ap_idle
信号が Low にアサートされ、デザインが動作していることを示します。 - 入力データは最初のサイクル後のクロックで読み出されます。読み出されるタイミングは Vitis HLS で自動的にスケジューリングされます。すべての入力が読み出されると、
ap_ready
信号が High にアサートされます。 - 出力
sum
が計算されると、関連する出力ハンドシェイク (sum_o_ap_vld
) でデータが有効なことが示されます。 - 関数が終了すると、
ap_done
がアサートされます。これは、ap_return
のデータが有効であることも示します。 -
ap_idle
ポートが High にアサートされ、デザインが再開を待機していることを示します。