説明
C ベース デザインでは、すべての入力および出力操作がフォーマル関数引数を使用して 0 時間で実行されます。RTL デザインでは、同じ入力および出力操作をデザイン インターフェイスのポートを介して実行する必要があり、通常は特定の入力/出力 (I/O) プロトコルを使用して実行されます。詳細は、 『Vivado Design Suite ユーザー ガイド: 高位合成』 (UG902) の「インターフェイスの管理」を参照してください。
INTERFACE
プラグマは、インターフェイス合成で関数定義からどのように RTL ポートが作成されるかを指定します。
RTL インプリメンテーションのポートは、次のものから導出されます。
- 指定されている任意の関数レベルのプロトコル: 関数レベルのプロトコルは、ブロック レベルの I/O プロトコルとも呼ばれ、関数の演算が開始したときに制御する信号と、関数の演算が終了したこと、アイドル状態であること、新しい入力を受信できる状態であることを通知する信号を提供します。関数レベルのプロトコルのインプリメンテーションは、次のとおりです。
-
<mode>
値によりap_ctrl_none
、ap_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> オプションはサポートされません。
バースト モードの指定
構文セクションに説明されているように max_read_burst_length
または max_write_burst_length
オプションを使用してインターフェイスのバースト モードを指定する場合は、AXI 規格に関連する制限と考慮事項があります。
- ARLEN および AWLEN は 8 ビットで、実際のバースト長は AxLEN+1 なので、トランザクションごとのバースト長は 256 ワード以下にする必要があります。
- バースト トランザクションごとに転送される量は合計 4 KB 未満です。
- 4 KB アドレス境界を超えないようにしてください。
- バス幅は、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 です。
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
し、デザインがidle
、done
、および新しい入力データに対してready
になっていることを示すブロック レベルの制御ポート セットをインプリメントします。注記:ap_ctrl_hs
モードはデフォルトのブロック レベル I/O プロトコルです。 -
ap_ctrl_chain
- デザインの演算を
start
およびcontinue
し、デザインがidle
、done
、および新しい入力データに対してready
になっていることを示すブロック レベルの制御ポート セットをインプリメントします。注記:ap_ctrl_chain
インターフェイス モードはap_ctrl_hs
と似ていますが、バック プレッシャーを適用するために入力信号ap_continue
が追加されている点が異なります。ザイリンクスでは、HLS ツール ブロックをチェーン接続する場合はap_ctrl_chain
ブロックレベル I/O プロトコルを使用することをお勧めします。
-
-
port=<name>
-
INTERFACE
プラグマを適用する関数引数、関数戻り値、またはグローバル変数の名前を指定します。ヒント: 関数のreturn
値のポートには、ブロックレベル I/O プロトコル (ap_ctrl_none
、ap_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) を参照してください。 -
- 関数引数を AXI ポートにまとめます。デフォルトでは、HLS ツールで AXI4-Lite (
-
register_mode= <forward|reverse|both|off>
-
register
キーワードと共に使用し、forward
パス (TDATA および TVALID)、reverse
パス (TREADY)、またはその両方 (both
) のパス (TDATA、TVALID、および TREADY) にレジスタを配置するか、どのポート信号にもレジスタを配置しないか (off
) を指定します。デフォルトのregister_mode
はboth
です。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
を設定します。
-
AXI4 (
-
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
関数引数 InData
は ap_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