S_AXILITE の例 - 2023.2 日本語

Vitis 高位合成ユーザー ガイド (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 日本語

次に、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 つの要素を含むシステムの一部です。

  1. IP またはカーネルと通信する x86 上で実行されているホスト アプリケーションまたはエンベデッド プロセッサ
  2. SAXI Lite アダプター: INTERFACE プラグマは、s_axilite アダプターをインプリメントします。アダプターには、ホストと通信するインターフェイス プロトコルのインプリメントと、IP またはカーネルへの制御レジスタ マップの供給という 2 つの機能があります。
  3. デザイン ロジックをインプリメントする HLS エンジンまたは関数
図 1. S_AXILITE アダプター

デフォルトでは、Vitis HLSs_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 ビットのみが使用されます。残りのビットは使用されません。

動作中、ホスト アプリケーションはまず制御アドレス空間 (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 ドライバー ファイルを利用し、ソフトウェアからハードウェアを制御できます。