次に、Vitis HLS で関数の戻り値を含む複数の引数が s_axilite
インターフェイスとしてインプリメントされる例を示します。各プラグマで bundle
オプションに同じ名前が使用されているので、各ポートが 1 つのインターフェイスにまとめられます。
void example(char *a, char *b, char *c)
{
#pragma HLS INTERFACE mode=s_axilite port=return bundle=BUS_A
#pragma HLS INTERFACE mode=s_axilite port=a bundle=BUS_A
#pragma HLS INTERFACE mode=s_axilite port=b bundle=BUS_A
#pragma HLS INTERFACE mode=s_axilite port=c bundle=BUS_A
#pragma HLS INTERFACE mode=ap_vld port=b
*c += *a + *b;
}
bundle
オプションを指定していない場合、Vitis HLS ですべての引数が 1 つの s_axilite
バンドルにまとめられ、自動的にポートに名前が付けられます。合成済みの例は、次の図に示す 3 つの要素を含むシステムの一部です。
- IP またはカーネルと通信する x86 上で実行されているホスト アプリケーションまたはエンベデッド プロセッサ
- SAXI Lite アダプター: INTERFACE プラグマは、
s_axilite
アダプターをインプリメントします。アダプターには、ホストと通信するインターフェイス プロトコルのインプリメントと、IP またはカーネルへの制御レジスタ マップの供給という 2 つの機能があります。 - デザイン ロジックをインプリメントする HLS エンジンまたは関数
デフォルトでは、Vitis HLS で s_axilite
インターフェイスにまとめられる各ポートのアドレスが自動的に割り当てられます。ポートに割り当てられるサイズ (アドレス範囲) は、次に説明されているように、引数のデータ型および使用されるポート プロトコルにより決定されます。アドレスは、S_AXILITE オフセット オプション に説明されているように、offset
オプションを使用して明示的に定義できます。
- ポート a: デフォルトでは、
ap_none
としてインプリメントされます。データ信号の 1 ワードが割り当てられ、引数のデータ型がchar
であるため、アドレス指定には 3 ビットのみが使用されます。残りのビットは使用されません。 - ポート b: INTERFACE プラグマで定義されている
ap_vld
としてインプリメントされます。対応する制御レジスタのサイズは 2 バイト (16 ビット) で、次のように 2 つのセクションに分割されます。- (0x1c) 制御信号: 制御信号用に 1 ワード割り当てられます。
- (0x18) データ信号: データ信号アドレスに 1 ワードが割り当てられ、引数のデータ型が
char
であるため、3 ビットのみが使用されます。残りのビットは使用されません。
- ポート c: デフォルトでは、
ap_ovld
の出力としてインプリメントされます。対応する制御レジスタのサイズは 4 バイト (32 ビット) で、次の 3 つのセクションに分割されます。- (0x20)
c_i
のデータ信号: 入力データ信号用に 1 ワードが割り当てらのれ、引数のデータ型がchar
であるため、アドレス指定に 3 ビットのみが使用されます。残りのビットは使用されません。 - (0x24) 予約
- (0x28)
c_o
のデータ信号: 出力データ信号用に 1 ワード割り当てられます。 - (0x2c)
c_o
の制御信号: 制御信号ap_ovld
用に 1 ワードが割り当てられ、引数コントロール型がchar
であるため、アドレス指定には 3 ビットのみが使用されます。残りのビットは使用されません。
- (0x20)
動作中、ホスト アプリケーションはまず制御アドレス空間 (0x00) に書き込むことによりカーネルを起動します。ホスト/CPU は、この例で定義されているさまざまな関数引数に関連付けられているその他のアドレス空間に書き込むことによって、初期セットアップを完了します。
ポート b の制御信号がアサートされると、カーネルがポート a および b を読み出すことができるようになります (ポート a は ap_none
で制御信号なし)。それまでデザインは停止し、ポート b に valid レジスタが設定されるまで待機します。HLS エンジンがポート b を読み出すたびに、入力 valid レジスタがクリアされ、レジスタは 0 にリセットされます。
HLS エンジンの計算が終了すると、ポート C の出力値が制御レジスタに保存され、ホストの読み出し用に対応する valid ビットがセットされます。ホストがデータを読み出すと、HLS エンジンが制御レジスタ (0x00) の ap_done
ビットを書き込み、IP の計算が終了したことを示します。
Vitis HLS により S_AXILITE 制御レジスタ マップ で割り当てられているアドレスがレポートされ、ソフトウェア開発を支援するために C ドライバー ファイル にも示されます。s_axilite
インターフェイスを使用すると、提供されている C アプリケーション プログラム インターフェイス (API) 関数を使用して、エンベデッドまたは x86 プロセッサで実行されるコードで使用する C ドライバー ファイルを利用し、ソフトウェアからハードウェアを制御できます。