説明
syn.directive.interface 指示子は最上位関数でのみサポートされます。HLS コンポーネントのサブ関数では指示子を使用できません。INTERFACE プラグマまたは指示子は、インターフェイス合成時に関数引数がどのように RTL ポートを生成するかを指定します。詳細は、
『Vitis 高位合成ユーザー ガイド』 (UG1399) の「インターフェイスの定義」セクションを参照してください。下位関数で使用される I/O プロトコルは Vitis HLS ツールにより自動的に決定されます。
RTL インプリメンテーションのポートは、次の要素から入力されます。
- 最上位関数の引数と戻り値のデータ型および方向
- HLS コンポーネントの
flow_target -
syn.interface.xxxコマンドで指定されたデフォルトのインターフェイス設定 (詳細は インターフェイス コンフィギュレーション を参照) -
syn.directive.interface
各関数引数には、独自の I/O プロトコル (例: valid ハンドシェイクや acknowledge ハンドシェイク) を設定できます。
インターフェイスは、HLS コンポーネントの実行制御プロトコルも定義します。詳細は、 『Vitis 高位合成ユーザー ガイド』 (UG1399) の「ブロック レベルの制御プロトコル」を参照してください。制御プロトコルは、HLS コンポーネント (またはブロック) が実行を開始するタイミングを制御し、ブロックが動作を完了すると、アイドル状態になって新しい入力に対応できるようにします。
構文
syn.directive.interface=[OPTIONS] <location> <port>
-
<location>: 関数インターフェイスまたはレジスタを指定する場所をfunction[/labelの形式で指定できます。 -
<port>は、インターフェイスを合成するためのパラメーター (関数引数) です。ap_ctrl_chain、ap_ctrl_hs、またはap_ctrl_noneブロック制御モードではポート名は不要です。
オプション
syn.interface.xxx コマンドで定義されたデフォルト値があります。ここで定義したインターフェイスにローカル値を定義すると、デフォルト値をオーバーライドできます。-
mode=<mode> -
次の 3 つのカテゴリは、モードとツールが RTL でそれを実装する方法を示します。
- ポート レベルのプロトコル:
-
ap_none - ポート プロトコルなし。インターフェイスはシンプルなデータ ポートです。
-
ap_stable - プロトコルなし。インターフェイスはシンプルなデータ ポートです。Vitis HLS ツールは、データ ポートがリセット後に常に安定していると想定します。不要なレジスタを削除する最適化が可能です。
-
ap_vld - データが読み出しまたは書き込みに対して有効になったことを示す
valid信号を含めたデータ ポートがインプリメントされます。 -
ap_ack - データ ポートを、読み書きの確認用の
acknowledge信号を使用してインプリメントします。 -
ap_hs -
validとacknowledgeの両信号を含むデータ ポートをインプリメントし、いつデータの読み出しおよび書き込みが有効になるかと、データの読み出しおよび書き込みを肯定応答する双方向のハンドシェイクを提供します。 -
ap_ovld - データが読み出しまたは書き込みに対して有効になったことを示す
valid信号を含めた出力データ ポートがインプリメントされます。ヒント:ap_ovldの場合、Vitis HLS では、入力引数または読み出し/書き込み引数の入力部分はap_noneモードを使用してインプリメントされます。 -
ap_memory - 配列引数が標準 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 ビットのアドレス ポートを指定し、アドレス オフセットを制御するには、
syn.interface.m_axi_addr64コマンドを使用できます。 -
axis - ポートが AXI4-Stream インターフェイスとしてインプリメントされます。
-
- ブロック レベルの制御プロトコル:
-
ap_ctrl_chain - ブロック レベルの制御ポートをインプリメントし、次を実行します。
-
start: デザインの動作を開始 -
idle: デザインが完了したことを示す -
done: デザインが完了したことを示す -
ready: 新しい入力データを受け入れる準備ができたことを示す
-
-
ap_ctrl_hs -
startでデザイン動作を開始するためのブロック レベル制御ポートのセットをインプリメントします。また、デザインがidle、done、新しい入力データに対してreadyの状態を示します。
-
ap_ctrl_none - ブロック レベル I/O プロトコルなし。注記:
ap_ctrl_noneを使用すると、C/RTL の協調シミュレーションを使用してデザインを検証できなくなることがあります。
-
- ポート レベルのプロトコル:
-
bundle=<string> -
デフォルトでは、HLS ツールで互換性のある関数引数が RTL コードの単一のインターフェイス ポートにグループ化 (またはバンドル化) されます。
mode、offset、bundleなどのオプションに互換性があるすべてのインターフェイスは、1 つのインターフェイス ポートにまとめられます。ヒント: このデフォルトはsyn.interface.m_axi_auto_max_portsコマンドを使用すると変更できます。この
bundle=<string>オプションを使用すると、デフォルトの動作を上書きして、ポートをグループ化するバンドルを定義できます。<string>は、バンドル名を指定します。modeとbundleの組み合わせによって、生成される RTL のポート名が決まります。nameを指定してポート名を明示することもできます。重要:bundle名は必ず小文字で指定してください。 -
clock=<string> - デフォルトでは、AXI4-Lite インターフェイス クロックはシステム クロックと同じです。このオプションを使用すると、AXI4-Lite インターフェイスに別のクロックを指定できます。
bundleオプションで複数の最上位関数の引数を 1 つの AXI4-Lite インターフェイスにまとめる場合、クロック オプションはバンドル メンバーのうち 1 つに指定する必要だけがあります。 -
channel=<string> -
m_axiインターフェイスで複数のチャネルを有効にするには、チャネル ID を指定します。複数のm_axiインターフェイスを、別々のチャネル ID を使用して 1 つのm_axiアダプターに統合できます。 -
depth=<int> - テストベンチで処理されるサンプルの最大数を指定します。この設定は、HLS ツールで RTL 協調シミュレーション用に作成される検証アダプターに必要な FIFO の最大サイズを示します。ヒント: 通常、
depthはオプションですが、RTL 協調シミュレーションではポインター引数のサイズを指定する必要があります。 -
interrupt=<int> - このオプションは
ap_vld/ap_hsのみで使用されます。このオプションを有効にすると、割り込みでの I/O 管理が可能になります。s_axiliteレジスタ ファイル内のISRおよびIERに対応するビットが作成されます。整数値 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インターフェイスで使用し、バースト転送で読み出されるデータ値の最大数を指定します。詳細は、 『Vitis 高位合成ユーザー ガイド』 (UG1399) の「AXI バースト転送」セクションを参照してください。 -
max_write_burst_length=<int> -
m_axiインターフェイスで使用し、バースト転送で書き込まれるデータ値の最大数を指定します。 -
max_widen_bitwidth=<int> - インターフェイスの自動幅拡張に使用可能な最大ビット幅を指定します。これにより、
syn.interface.m_axi_max_bitwidthコマンドで指定されたデフォルト値がオーバーライドされます。詳細は、『Vitis 高位合成ユーザー ガイド』 (UG1399) の「ポート幅の自動変更」を参照してください。 -
name=<string> - 生成される RTL で使用するポート名を指定します。
modeとbundleの組み合わせによってポート名が決まりますが、nameを指定した場合はその名前が使用されます。 -
num_read_outstanding=<int> -
m_axiインターフェイスと使用して、デザインが停止するまでに、AXI4 バスに対して応答なしで送信できる読み出し要求の数を指定します。これによって、デザイン内の内部ストレージで、つまり FIFO のサイズが変わります。num_read_outstanding*max_read_burst_length*word_size -
num_write_outstanding=<int> -
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 - 信号および関連プロトコル信号にレジスタを付け、少なくとも関数実行の最終サイクルまで信号が保持されるように指示します。
syn.interface.register_ioコマンドは、最上位関数のすべてのインターフェイスのデフォルトのレジスタ入力を制御しますが、このオプションを使用すると、現在のインターフェイスのデフォルトをオーバーライドできます。このオプションは、次のインターフェイス モードに適用されます。-
s_axilite -
ap_fifo -
ap_none -
ap_stable -
ap_hs -
ap_ack -
ap_vld -
ap_ovld
ヒント:registerオプションは、関数のリターン ポート (port=return) では使用できません。代わりにsyn.directive.latencyを使用してください。 -
-
register_mode=(both|forward|reverse|off) - このオプションは AXI4-Stream インターフェイスに適用され、レジスタを次の場所に配置するかどうかを指定します。
- フォワード パス (
TDATAとTVALID) - リバース パス (
TREADY)、または両方のパス - いずれのポート信号にも配置しない (
off)
register_mode=bothです。ヒント: AXI4-Stream サイドチャネル信号はデータ信号であり、TDATAがレジスタに入力されるときに信号もレジスタに入力されます。 - フォワード パス (
-
storage_impl=<impl> - このオプションは、
mode=s_axiliteにのみ使用する場合、インターフェイスに割り当てるストレージ インプリメンテーションを定義します。サポートされる<impl>値はauto、bram、およびuramです。デフォルトはautoです。ヒント:uramは、特定のデバイスでのみ使用できる 2 つのポートに対して 1 つのクロックのみを持つ同期メモリです。このため、uramは、2 つのクロックを持つs_axiliteアダプターには指定できません。指定したパーツがuramをサポートしていない場合も指定できません。 -
storage_type=<type> -
このオプションは、
mode=ap_memoryまたはmode=bramにのみ使用する場合、変数に割り当てるストレージ タイプ (RAM_T2P など) を定義します。サポートされるタイプは、
ram_1p、ram_1wnr、ram_2p、ram_s2p、ram_t2p、rom_1p、rom_2p、rom_npです。ヒント: 最上位関数のインターフェイス上のオブジェクトに対して、このオプションはsyn.directive.bind_storageを使用して定義できます。
例 1
この例では、関数 func の関数レベルのハンドシェイクをオフにします。
syn.directive.interface=mode=ap_ctrl_none func return
例 2
func 関数の InData 引数には、ap_vld インターフェイスが含まれます。入力は、レジスタに入力される必要があります。
syn.directive.interface=func InData mode=ap_vld register