説明
INTERFACE プラグマや指示子は最上位関数にのみ使用でき、HLS コンポーネントの下位関数には使用できません。インターフェイスの定義 で説明するように、インターフェイス合成で関数引数からどのように RTL ポートが作成されるかを指定します。下位関数で使用される I/O プロトコルは Vitis HLS ツールにより自動的に決定されます。
RTL インプリメンテーションのポートは、最上位関数と関数リターンの引数のデータ型と方向、HLS コンポーネントの flow_target、config_interface で指定されたデフォルトのインターフェイス構成設定、および INTERFACE プラグマまたは指示子によって決まります。各関数引数は、有効ハンドシェイクや承認ハンドシェイクなどの独自の I/O プロトコルを持つように指定できます。
また、このインターフェイスは、ブロック レベルの制御プロトコル で説明されるように、HLS コンポーネントの実行制御プロトコルも定義します。制御プロトコルは、HLS コンポーネント (またはブロック) が実行を開始するタイミングを制御し、ブロックが動作を完了すると、アイドル状態になって新しい入力に対応できるようにします。
構文
関数内に配置します。
#pragma HLS interface mode=<mode> port=<name> direct_io=<value>[OPTIONS]
説明:
-
mode=<mode> -
サポートされているモードと、それをツールが RTL でどのようにインプリメントするかは、次のように 3 つのカテゴリに分類されます。
-
ポート レベルのプロトコル:
-
ap_none: ポート プロトコルなし。インターフェイスはシンプルなデータ ポートです。 -
ap_vld: データが読み出しまたは書き込みに対して有効になったことを示すvalid信号を含めたデータ ポートがインプリメントされます。 -
ap_ack: データが読み出された/書き込まれたこと肯定応答するacknowledge信号を含めたデータ ポートがインプリメントされます。 -
ap_hs:validとacknowledgeの両信号を含むデータ ポートをインプリメントし、いつデータの読み出しおよび書き込みが有効になるかと、データの読み出しおよび書き込みを肯定応答する双方向のハンドシェイクを提供します。 -
ap_ovld: データが読み出しまたは書き込みに対して有効になったことを示すvalid信号を含めた出力データ ポートがインプリメントされます。ヒント:ap_ovldの場合、Vitis HLS では、入力引数または読み出し/書き込み引数の入力部分はap_noneモードを使用してインプリメントされます。 -
direct_io=<true/false>: INTERFACE が適用される関数の引数に true を指定します。このオプションのユース ケースについては、ダイレクト I/O ストリームの SAXI Lite インターフェイスへのマッピング を参照してください。 -
ap_memory: 配列引数が標準 RAM インターフェイスとしてインプリメントされますVivado IP インテグレーターで RTL デザインを使用する場合、インターフェイスが別々のポートで構成されます。 -
bram: 配列引数が標準 RAM インターフェイスとしてインプリメントされますVivado IP インテグレーターで RTL デザインを使用する場合、メモリ インターフェイスはシングル ポートで構成されます。 -
ap_fifo: 標準 FIFO インターフェイスのポートが、アクティブ Low FIFO のemptyおよびfullポートが関連付けられたデータ入力および出力ポートを使用してインプリメントされます。注記:ap_fifoインターフェイスは、読み出し引数または書き込み引数のみに使用できます。ap_fifoモードでは双方向の読み出し/書き込み引数はサポートされません。
-
-
AXI インターフェイス プロトコル:
-
s_axilite: ポートが AXI4-Lite インターフェイスとしてインプリメントされます。ツールは、HLS コンポーネントの生成された RT をエクスポートする際に、関連する C ドライバー ファイルのセットを生成します。 -
m_axi: ポートが AXI4 インターフェイスとしてインプリメントされます。32 ビット (デフォルト) または 64 ビットのアドレス ポートを指定し、アドレス オフセットを制御するには、config_interface -m_axi_addr64コマンドを使用できます。 -
axis: ポートが AXI4-Stream インターフェイスとしてインプリメントされます。
-
-
ブロック レベルの制御プロトコル:
-
ap_ctrl_chain: デザインの演算をstartおよびcontinueし、デザインがidle、done、および新しい入力データに対してreadyになっていることを示すブロック レベルの制御ポート セットをインプリメントします。 -
ap_ctrl_hs: デザインの演算をstartし、デザインがidle、done、および新しい入力データに対してreadyになっていることを示すブロック レベルの制御ポート セットをインプリメントします。 -
ap_ctrl_none: ブロック レベル I/O プロトコルなし。注記:ap_ctrl_noneを使用すると、C/RTL の協調シミュレーションを使用してデザインを検証できなくなることがあります。
-
-
ポート レベルのプロトコル:
-
port=<name> - INTERFACE プラグマを適用する関数引数または関数戻りの名前を指定します。ヒント: 関数の
return値のポートには、ブロックレベル I/O プロトコル (ap_ctrl_none、ap_ctrl_hs、またはap_ctrl_chain) を割り当てることができます。
オプション
-
bundle=<string> - デフォルトでは、HLS ツールで互換性のあるオプションが指定された関数引数が RTL コードでインターフェイス ポートにグループ化されます。すべての AXI4-Lite (
s_axilite) インターフェイスは、できる限り 1 つの AXI4-Lite ポートにまとめられます。同様に、AXI4 (m_axi) インターフェイスとして指定されたすべての関数引数は、デフォルトで 1 つの AXI4 ポートにまとめられます。 -
channel=<string> -
m_axiインターフェイスで複数のチャネルを有効にするには、チャネル ID を指定します。複数のm_axiインターフェイスを、別々のチャネル ID を使用して 1 つのm_axiアダプターに統合できます。 -
clock=<name> - デフォルトでは、AXI4-Lite インターフェイス クロックはシステム クロックと同じです。このオプションを使用すると、AXI4-Lite インターフェイスに別のクロックを指定できます。
-bundleオプションを使用して複数の最上位関数引数を 1 つの AXI4-Lite インターフェイスにまとめている場合は、-clock オプションはバンドル メンバーの 1 つにのみ指定します。 -
depth=<int> - テストベンチで処理されるサンプルの最大数を指定します。この設定は、HLS ツールで RTL 協調シミュレーション用に作成される検証アダプターに必要な FIFO の最大サイズを示します。このオプションでは、最上位ポートの引数に基づいて単純な表現を使用できます。次に、例を示します。
int dut(int *arr, int height, int width) { #pragma HLS interface m_axi port=arr depth=height*width ...ヒント: 通常、depthはオプションですが、RTL 協調シミュレーションではポインター引数のサイズを指定する必要があります。 -
interrupt=<int> -
ap_vld/ap_hsのみで使用します。このオプションは、s_axiliteレジスタ ファイルのISRとIERに対応するビットを作成することで、割り込みで管理される I/O を有効にします。整数値 N=16...31 は、両レジスタのビット位置を指定します (デフォルトでは 16 から連続して割り当てられます)。 -
latency=<value> - このオプションは、
ap_memoryおよび M_AXI インターフェイスで使用できます。-
ap_memoryインターフェイスでは、インターフェイス オプションでインターフェイスを起動する RAM リソースの読み出しレイテンシを指定します。デフォルトでは、1 クロック サイクルの読み出し演算が使用されます。このオプションでは、複数クロック サイクルの読み出しレイテンシを使用した外部 RAM を記述できます。 - M_AXI インターフェイスでは、AXI4 インターフェイスのレイテンシを指定し、読み出しまたは書き込みの指定サイクル (レイテンシ) 前にバス要求を開始できるようにします。このレイテンシ値が小さすぎると、デザインが準備完了になるのが早すぎ、バスを待つために停止する可能性があります。レイテンシ値が大きすぎると、バス アクセスはデザインがアクセスを開始するのを待つためにアイドル状態になる可能性があります。
-
-
max_read_burst_length=<int> - M_AXI インターフェイスで使用し、バースト転送で読み出されるデータ値の最大数を指定します。詳細は、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を設定します。
-
AXI4 (
-
max_widen_bitwidth=<int> - インターフェイスの自動幅拡張に使用可能な最大ビット幅を指定します。これにより、
config_interface -m_axi_max_bitwidthコマンドで指定されたグローバル値が上書きされます。 -
name=<string> - 生成された RTL で使用されるポートの名前を指定します。
-
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 -
offset=<string> - 指定されたポートの AXI4-Lite (
s_axilite) および AXI4 メモリ マップド (m_axi) のアドレス オフセットを制御します。-
s_axiliteインターフェイスの場合、<string>でレジスタ マップのアドレスを指定します。 -
m_axiインターフェイスの場合は、このオプションがconfig_interface -m_axi_offsetオプションで指定されたグローバル オプションよりも優先されます。<string>は次のように指定します。-
off: オフセット ポートは生成しません。 -
direct: スカラー入力のオフセット ポートを生成します。 -
slave: オフセット ポートを生成し、AXI4-Lite スレーブ インターフェイスに自動的にマップします。これはデフォルトのオフセットです。
-
-
-
register - 信号および関連プロトコル信号にレジスタを付けるオプションのキーワードで、信号が少なくとも関数実行の最終サイクルまで保持されます。
config_interfaceコマンドの-register_ioオプションは、最上位関数のすべての入力/出力にレジスタを付けるかどうかをグローバルに制御します。このオプションは、次のインターフェイス モードに適用されます。-
s_axilite -
ap_fifo -
ap_none -
ap_hs -
ap_ack -
ap_vld -
ap_ovld
-
-
register_mode=<forward|reverse|both|off> -
AXI4-Stream インターフェイスに適用され、レジスタをフォワード パス (
TDATAおよびTVALID)、リバース パス (TREADY)、またはその両方のパス (TDATA、TVALID、およびTREADY) に配置するか、レジスタをどの信号にも配置しないか (off) を指定します。デフォルトはbothです。AXI4-Stream サイドチャネル信号はデータ信号と認識され、TDATAにレジスタが付けられると、レジスタが付けられます。 -
storage_impl=<impl> -
s_axiliteでのみ使用します。このオプションは、インターフェイスに割り当てるストレージ インプリメンテーションを定義します。 -
storage_type=<value> -
ap_memoryインターフェイスにのみ使用します。このオプションは、変数に割り当てるストレージ タイプ (RAM_T2P) を指定します。
例 1
次の例では、両方の関数引数が AXI4-Stream インターフェイスを使用してインプリメントされます。
void example(int A[50], int B[50]) {
//Set the HLS native interface types
#pragma HLS INTERFACE mode=axis port=A
#pragma HLS INTERFACE mode=axis port=B
int i;
for(i = 0; i < 50; i++){
B[i] = A[i] + 5;
}
}
例 2
次の例では、ブロック レベル I/O プロトコルをオフにし、関数戻り値に割り当てています。
#pragma HLS interface mode=ap_ctrl_none port=return
関数引数 InData は ap_vld インターフェイスを使用し、入力にレジスタが付けられます。
#pragma HLS interface mode=ap_vld register port=InData
例 3
次の例では、最上位 transpose 関数のポートに INTERFACE 規格を定義しています。bundle= オプションを使用して信号をグループ化しています。
// TOP LEVEL - TRANSPOSE
void transpose(int* input, int* output) {
#pragma HLS INTERFACE mode=m_axi port=input offset=slave bundle=gmem0
#pragma HLS INTERFACE mode=m_axi port=output offset=slave bundle=gmem1
#pragma HLS INTERFACE mode=s_axilite port=input bundle=control
#pragma HLS INTERFACE mode=s_axilite port=output bundle=control
#pragma HLS INTERFACE mode=s_axilite port=return bundle=control
#pragma HLS dataflow