pragma HLS interface - 2019.2 Japanese

Vitis 統合ソフトウェア プラットフォームの資料: アプリケーション アクセラレーション開発 (UG1393)

Document ID
UG1393
Release Date
2020-02-28
Version
2019.2 Japanese

説明

C ベース デザインでは、すべての入力および出力操作がフォーマル関数引数を使用して 0 時間で実行されます。RTL デザインでは、同じ入力および出力操作をデザイン インターフェイスのポートを介して実行する必要があり、通常は特定の入力/出力 (I/O) プロトコルを使用して実行されます。詳細は、 『Vivado Design Suite ユーザー ガイド: 高位合成』 (UG902) の「インターフェイスの管理」を参照してください。

INTERFACE プラグマは、インターフェイス合成で関数定義からどのように RTL ポートが作成されるかを指定します。

RTL インプリメンテーションのポートは、次のものから導出されます。

  • 指定されている任意の関数レベルのプロトコル: 関数レベルのプロトコルは、ブロック レベルの I/O プロトコルとも呼ばれ、関数の演算が開始したときに制御する信号と、関数の演算が終了したこと、アイドル状態であること、新しい入力を受信できる状態であることを通知する信号を提供します。関数レベルのプロトコルのインプリメンテーションは、次のとおりです。
    • <mode> 値により ap_ctrl_noneap_ctrl_hs、または ap_ctrl_chain のいずれかに指定されます。デフォルトは ap_ctrl_hs ブロック レベル I/O プロトコルです。
    • 関数名に関連付けられています。
  • 関数引数: 各関数引数は、有効ハンドシェイク (ap_vld) や肯定応答ハンドシェイク (ap_ack) などの独自のポート レベル (I/O) インターフェイス プロトコルを持つように指定できます。ポート レベル インターフェイス プロトコルは、最上位関数の各引数および関数の戻り値 (関数が値を返す場合) に対して作成されます。作成されるデフォルトの I/O プロトコルは、C 引数のタイプによって異なります。ブロック レベルのプロトコルが使用されてブロックの演算が開始したら、ポート レベルの I/O プロトコルを使用して、データをブロック内外に順に送信できます。
  • 最上位関数によりアクセスされ、スコープ外部で定義されるグローバル変数:
    • グローバル変数がアクセスされても、すべての読み出しおよび書き込みが関数のローカルである場合は、リソースは RTL 内に作成されます。RTL に I/O ポートは必要ありません。グローバル変数が外部ソースまたはデスティネーションである場合は、インターフェイスは標準関数引数と同様の方法で指定します。次にを示します。

INTERFACE プラグマがサブ関数に使用されている場合は、register オプションのみを使用できます。サブ関数では、<mode> オプションはサポートされません。

ヒント: サブ関数で使用される I/O プロトコルは Vivado HLS ツールにより自動的に決定されます。ポートにレジスタを付けるかどうかを指定することを除き、これらのポートを制御することはできません。

バースト モードの指定

構文セクションに説明されているように max_read_burst_length または max_write_burst_length オプションを使用してインターフェイスのバースト モードを指定する場合は、AXI 規格に関連する制限と考慮事項があります。

  1. ARLEN および AWLEN は 8 ビットで、実際のバースト長は AxLEN+1 なので、トランザクションごとのバースト長は 256 ワード以下にする必要があります。
  2. バースト トランザクションごとに転送される量は合計 4 KB 未満です。
  3. 4 KB アドレス境界を超えないようにしてください。
  4. バス幅は、32 ~ 512 ビットの間の 2 のべき乗数 (32、64、128、512 ビット) または 4、8、16、32、64 バイトに指定します。

4 KB の制限があるので、各バス幅での最大バースト長は次のようになります。

  • 32 ビット幅では、1 つのバースト トランザクションで 256 ワード転送されます。この場合、トランザクションごとに転送される合計バイト数は 1024 です。
  • 64 ビット幅では、1 つのバースト トランザクションで 256 ワード転送されます。トランザクションごとに転送される合計バイト数は 2048 です。
  • 128 ビット幅では、1 つのバースト トランザクションで 256 ワード転送されます。トランザクションごとに転送される合計バイト数は 4096 です。
  • 256 ビット幅では、1 つのバースト トランザクションで 128 ワード転送されます。トランザクションごとに転送される合計バイト数は 4096 です。
  • 512 ビット幅では、1 つのバースト トランザクションで 64 ワード転送されます。トランザクションごとに転送される合計バイト数は 4096 です。
注記: これはデザインによるので、HLS ツールで生成された IP では実際には最大バースト長が実行されないことがあります。たとえば、max_read_burst_length または max_write_burst_length を 128 に設定している場合、100 回反復される for ループからのパイプライン アクセスでは最大バースト長は達成されません。

ただし、指定されたバースト長よりも長いアクセスがソース コード内で実行される場合は、アクセスは小さいバーストに分割されます。たとえば、100 回アクセスされるパイプライン for ループで max_read_burst_length または max_write_burst_length を 64 に設定すると、最大バースト長 (64) のトランザクションと残りのデータのトランザクション (36 ワードのバースト) に分割されます。

構文

関数内に配置します。

#pragma HLS interface <mode> port=<name> bundle=<string> \
register register_mode=<mode> depth=<int> offset=<string> \
clock=<string> name=<string> \
num_read_outstanding=<int> num_write_outstanding=<int> \
max_read_burst_length=<int> max_write_burst_length=<int>

説明:

<mode>
関数引数、関数で使用されるグローバル変数、またはブロック レベルの制御プロトコルのインターフェイス プロトコル モードを指定します。これらのモードの詳細な説明は、 『Vivado Design Suite ユーザー ガイド: 高位合成』 (UG902) の「インターフェイス合成リファレンス」を参照してください。モードは次のいずれかに指定できます。
ap_none
プロトコルなし。インターフェイスはデータ ポートです。
ap_stable
プロトコルなし。インターフェイスはデータ ポートです。HLS ツールでは、リセット後はデータ ポートが常に安定していると想定され、内部最適化により不要なレジスタが削除されます。
ap_vld
データ ポートと、データが読み出しまたは書き込みに対して有効になったことを示す valid ポートがインプリメントされます。
ap_ack
データ ポートと、データが読み出された/書き込まれたことを肯定応答する acknowledge ポートがインプリメントされます。
ap_hs
データ ポートと、データが読み出しおよび書き込みに対して有効になったことを示す valid ポートおよびデータが読み出された/書き込まれたことを肯定応答する acknowledge ポートがインプリメントされます。
ap_ovld
出力データ ポートと、データが読み出しまたは書き込みに対して有効になったことを示す valid ポートがインプリメントされます。
重要: HLS ツールでは、入力引数または読み出し/書き込み引数の入力部分は ap_none モードを使用してインプリメントされます。
ap_fifo
標準 FIFO インターフェイスのポートが、アクティブ Low FIFO の empty および full ポートが関連付けられたデータ入力および出力ポートを使用してインプリメントされます。
注記: このインターフェイスは、読み出し引数または書き込み引数のみに使用できます。ap_fifo モードでは双方向の読み出し/書き込み引数はサポートされません。
ap_bus
ポインターおよび参照渡しポートがバス インターフェイスとしてインプリメントされます。
ap_memory
配列引数が標準 RAM インターフェイスとしてインプリメントされます。Vivado IP インテグレーターで RTL デザインを使用する場合は、メモリ インターフェイスは個別のポートととして表示されます。
bram
配列引数が標準 RAM インターフェイスとしてインプリメントされます。IP インテグレーターで RTL デザインを使用する場合は、メモリ インターフェイスはシングル ポートとして表示されます。
axis
すべてのポートが AXI4-Stream インターフェイスとしてインプリメントされます。
s_axilite
すべてのポートが AXI4-Lite インターフェイスとしてインプリメントされます。HLS ツールでは、RTL のエクスポート中に C ドライバー ファイルの関連セットが生成されます。
m_axi
すべてのポートが AXI4 インターフェイスとしてインプリメントされます。32 ビット (デフォルト) または 64 ビットのアドレス ポートを指定し、アドレス オフセットを制御するには、config_interface コマンドを使用できます。
ap_ctrl_none
ブロック レベル I/O プロトコルなし。
注記: ap_ctrl_none を使用すると、C/RTL の協調シミュレーション機能を使用してデザインを検証できなくなることがあります。
ap_ctrl_hs
デザインの演算を start し、デザインが idledone、および新しい入力データに対して ready になっていることを示すブロック レベルの制御ポート セットをインプリメントします。
注記: ap_ctrl_hs モードはデフォルトのブロック レベル I/O プロトコルです。
ap_ctrl_chain
デザインの演算を start および continue し、デザインが idledone、および新しい入力データに対して ready になっていることを示すブロック レベルの制御ポート セットをインプリメントします。
注記: ap_ctrl_chain インターフェイス モードは ap_ctrl_hs と似ていますが、バック プレッシャーを適用するために入力信号 ap_continue が追加されている点が異なります。ザイリンクスでは、HLS ツール ブロックをチェーン接続する場合は ap_ctrl_chain ブロックレベル I/O プロトコルを使用することをお勧めします。
port=<name>
INTERFACE プラグマを適用する関数引数、関数戻り値、またはグローバル変数の名前を指定します。
ヒント: 関数の return 値のポートには、ブロックレベル I/O プロトコル (ap_ctrl_noneap_ctrl_hs、または ap_ctrl_chain) を割り当てることができます。
bundle=<string>
  • 関数引数を AXI ポートにまとめます。デフォルトでは、HLS ツールで AXI4-Lite (s_axilite) インターフェイスとして指定されたすべての関数引数は 1 つの AXI4-Lite ポートにまとめられます。同様に、AXI4 (m_axi) インターフェイスとして指定されたすべての関数引数は 1 つの AXI4 ポートにまとめられます。このオプションでは、同じ bundle=<string> が指定されたすべてのインターフェイス ポートが 1 つの AXI インターフェイス ポートにまとめられ、RTL ポートの名前が <string> になります。
    重要: bundle= で名前を指定する場合は、すべて小文字にする必要があります。
  • register: 信号および関連プロトコル信号にレジスタを付けるオプションのキーワードで、信号が少なくとも関数実行の最終サイクルまで保持されます。このオプションは、次のインターフェイス モードに適用されます。
    • ap_none
    • ap_ack
    • ap_vld
    • ap_ovld
    • ap_hs
    • ap_stable
    • axis
    • s_axilite
    ヒント: config_interface コマンドの -register_io オプションは、最上位関数のすべての入力/出力にレジスタを付けるかどうかをグローバルに制御します。詳細は、 『Vivado Design Suite ユーザー ガイド: 高位合成』 (UG902) を参照してください。
register_mode= <forward|reverse|both|off>
register キーワードと共に使用し、forward パス (TDATA および TVALID)、reverse パス (TREADY)、またはその両方 (both) のパス (TDATA、TVALID、および TREADY) にレジスタを配置するか、どのポート信号にもレジスタを配置しないか (off) を指定します。デフォルトの register_modeboth です。AXI4-Stream (axis) サイドチャネル信号はデータ信号と考慮され、TDATA にレジスタが付けられるとレジスタが付けられます。
depth=<int>
テストベンチで処理されるサンプルの最大数を指定します。この設定は、HLS ツールで RTL 協調シミュレーション用に作成される検証アダプターに必要な FIFO の最大サイズを示します。
ヒント: depth は通常はオプションですが、m_axi インターフェイスでは必須です。
offset=<string>
AXI4-Lite (s_axilite) および AXI4 (m_axi) インターフェイスのアドレス オフセットを指定します。
  • s_axilite インターフェイスでは、<string> はレジスタ マップのアドレスを指定します。
  • m_axi インターフェイスでは、<string> は次の値を指定します。
    • direct: スカラー入力ポートを生成します。
    • slave: オフセット ポートを生成し、AXI4-Lite スレーブ インターフェイスに自動的にマップします。
    • off: オフセット ポートは生成しません。
    ヒント: config_interface コマンドの -m_axi_offset オプションは、デザインのすべての M_AXI インターフェイスのオフセット ポートをグローバルに制御します。
clock=<name>
s_axilite インターフェイス モードのみでオプションで指定します。インターフェイスで使用するクロック信号を定義します。デフォルトでは、AXI4-Lite インターフェイス クロックはシステム クロックと同じです。このオプションを使用すると、AXI4-Lite インターフェイス (s_axilite) に別のクロックを指定できます。
ヒント: bundle オプションを使用して複数の最上位関数引数を 1 つの AXI4-Lite インターフェイスにている場合は、clock オプションはバンドル メンバーの 1 つにのみ指定します。
latency=<value>
<mode> が m_axi の場合、AXI4 インターフェイスのレイテンシを指定し、読み出しまたは書き込みの指定サイクル (レイテンシ) 前にバス要求を開始できるようにします。このレイテンシ値が小さすぎると、デザインが準備完了になるのが早すぎ、バスを待つために停止する可能性があります。レイテンシ値が大きすぎると、バス アクセスは承認されても、デザインがアクセスを開始するのを待つためにバスが停止する可能性があります。
num_read_outstanding=<int>
AXI4 (m_axi) インターフェイスで、デザインが停止するまでに、AXI4 バスに対して応答なしで読み込み要求を送信できる回数を指定します。これにより、デザインの内部ストレージである FIFO のサイズ (num_read_outstanding*max_read_burst_length*word_size) が決まります。
num_write_outstanding=<int>
AXI4 (m_axi) インターフェイスで、デザインが停止するまでに、AXI4 バスに対して応答なしで書き込み要求を送信できる回数を指定します。これにより、デザインの内部ストレージである FIFO のサイズ (num_write_outstanding*max_write_burst_length*word_size) が決まります。
max_read_burst_length=<int>
  • AXI4 (m_axi) インターフェイスでのバースト転送で読み出されるデータの最大数を指定します。
  • max_write_burst_length=<int>: AXI4 (m_axi) インターフェイスでのバースト転送で書き込まれるデータの最大数を指定します。
    ヒント: ポートが読み出し専用ポートの場合は、メモリ リソースを節約するため num_write_outstanding=1 および max_write_burst_length=2 を設定してください。ポートが書き込み専用の場合は、num_read_outstanding=1 および max_read_burst_length=2 を設定します。
name=<string>
ポートの名前を変更します。生成された RTL ポートでこの名前が使用されます。

例 1

次の例では、両方の関数引数が AXI4-Stream インターフェイスを使用してインプリメントされます。

void example(int A[50], int B[50]) {
  //Set the HLS native interface types
  #pragma HLS INTERFACE axis port=A
  #pragma HLS INTERFACE axis port=B
  int i;
  for(i = 0; i < 50; i++){
    B[i] = A[i] + 5;
  }
}

例 2

次の例では、ブロック レベル I/O プロトコルをオフにし、関数戻り値に割り当てています。

#pragma HLS interface ap_ctrl_none port=return

関数引数 InDataap_vld インターフェイスを使用し、入力にレジスタが付けられます。

#pragma HLS interface ap_vld register port=InData

これにより、グローバル変数 lookup_table が RTL デザインでポートとして処理され、インターフェイスは ap_memory に指定されます。

pragma HLS interface ap_memory port=lookup_table

例 3

次の例では、最上位 transpose 関数のポートに INTERFACE 規格を定義しています。bundle= オプションを使用して信号をグループ化しています。

// TOP LEVEL - TRANSPOSE
void transpose(int* input, int* output) {
	#pragma HLS INTERFACE m_axi port=input offset=slave bundle=gmem0
	#pragma HLS INTERFACE m_axi port=output offset=slave bundle=gmem1

	#pragma HLS INTERFACE s_axilite port=input bundle=control
	#pragma HLS INTERFACE s_axilite port=output bundle=control
	#pragma HLS INTERFACE s_axilite port=return bundle=control

	#pragma HLS dataflow