4.2. ホスト・アプリケーションの説明
このホスト・アプリケーションは、運用デザインのホスト・アプリケーションと比較して単純化されています。すべてのAPI呼び出しは、メイン・ソース・ファイルで発生します。実稼働デザインでは、DMA AFUデザインと同様に、ライブラリーでこれらのAPI呼び出しを行う可能性が高くなります。明確にするために、すべてのホストコードは単一のソースファイルhls_afu_host.cにあります。このセクションの見出しは、 hls_afu_host.cの見出しと一致しています。
スレーブ名 | アドレス・レンジ |
---|---|
Device feature header slave | 0x0000 to 0x003F |
HLS component | 0x0040 to 0x007F |
Preamble/Header Files
ホストコードの最初のセクションには、必要なライブラリが含まれており、いくつかの定数アドレスオフセットが定義されています。このデザインは、HLSコンパイラーが発行するfpVectorReduce_float_csr.hの定数からHLSコンポーネントのCSR定数を導き出します。 HLSコンポーネントのスレーブ・インターフェイスは、AFU ID MMスレーブとメモリー空間を共有するため、ベースオフセットにより、AFU ID MMスレーブおよびHLSコンポーネントの各レジスターに一意のアドレスが確保されます。
Discover/Grab FPGA Resources
このコードブロックは定型です。デザインは、使用可能なアクセラレーターをFPGAハードウェアに照会し、デザインがホスト・アプリケーションに必要なアクセラレータを見つけると、ホスト・アプリケーションはFPGAデバイスの制御を試みます。このデザインでは、ホストはアクセラレーション・スタックに必要なAFレジスターも実行します。 HLSコンポーネントは、AFUデバイス機能ヘッダーAvalon-MMスレーブにあるこれらのレジスターを実装しません。
Setup and Populate Host-Side Memory
このコードブロックは、AFがアクセスできる連続したホスト側メモリーバッファを構成します。アクセラレーション・スタックのホストを実行するときは、このコマンドを使用して2 MBのhugepagesを使用するように構成してください(ASEを使用して実行している場合、このコマンドは不要です)。
# sudo sh -c "echo 20 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages"
このコマンドを使用すると、ホスト・アプリケーションはメモリー内に2MBの固定連続バッファーを割り当てることができます。
fpgaPrepareBuffer()関数は、デザインがAFと共有するホスト側バッファーを割り当てます。この関数は、ユーザーが指定したアドレスから始まるメモリーブロックを割り当てます。さらに、メモリーブロックが64バイト(512ビット)にアライメントされていることを保証します。これにより、AFUアクセスが効率的になります。 fpgaGetIOAddress()は、AFがホストと同じメモリー空間にアクセスするために使用できるポインターを取得します。ホストは、他のアレイの場合と同様に、RAMのブロックを追加できます。
Setup Interrupts
このデザインでは、割り込みフレームワークを使用して、AFが処理を終了したときにホストに報告できるようにします。 HLSコンポーネントはこのデザインで必要な割り込みを生成するため、ホストは割り込みを有効にするためにHLSコンポーネントのスレーブメモリー空間に書き込む必要があります。まず、ホストはCSR_INTERRUPT_ENABLEレジスターを読み出すことにより、割り込みが既に有効になっているかどうかを確認します。割り込みの詳細については、インテルのアクセラレーション・スタックに含まれているHello Interrupt AFUの例を参照してください。
Start AF and Wait for Result
AFを開始するために、ホストは入力変数をHLSコンポーネントのスレーブスペース(入力データ開始アドレス、出力データ開始アドレス、データサイズ)に書き込みます。次に、HLSコンポーネントのスレーブ空間のSTARTビットに1を書き込みます。ポーリングAPIを使用して、ホストはAFが終了するのを待ちます。
Check Results
ホストは、割り込みが正しく返されたこと(またはタイムアウトしなかったこと)をチェックし、出力メモリーに期待値が含まれていることを確認します。このデザインでは、メモリースペースの最後にデバッグデータも出力されます。これは、AFが512ビットの読み出しと書き込みのみを実行できることを示しています。長さが512ビット(64バイト)の倍数ではないベクトルを渡すと、デザインは出力ベクトルメモリー空間の一部のデータを上書きします。
Cleanup
最後に、ホスト・アプリケーションは、実行中に割り当てたリソースを破棄します。