ハードウェア関数の移行

ハードウェア関数を SDSoC™ 環境から Vitis 環境に移行する際、注意が必要な事項がいくつかあります。

ハードウェア関数は、PL で実行するため個別の .xo ファイルとしてコンパイルされるので main() 関数には含まれず、SDSoC 環境でのように関数定義に特定のヘッダー ファイルは必要ありません。ヘッダー ファイルを破棄する前に、BUFFER_SIZE 宣言を mmult 関数にコピーする必要があります。#include 文をコメントにするか、削除することもできます。

#include "mmult.h"

ホスト コードとカーネル コードは個別に開発およびコンパイルされるので、一方が C、もう一方が C++ で記述された場合に、名前修飾の問題が発生する可能性があります。この問題を回避するには、カーネル関数宣言を extern "C" リンケージで囲む必要があります。

extern "C" {...}  

また、sds++ コンパイラではエンベデッド プロセッサとプログラマブル ロジック領域間のデータフローに関する一部の機能は推論されていましたが、Vitis コンパイラではホストからカーネルにデータを移動するのに使用するインターフェイス プロトコルを明示的に定義する必要があります。

INTERFACE プラグマの指定

HLS INTERFACE プラグマは、次のコード例に示すように使用して、インターフェイス プロトコルを指定します。

#pragma HLS INTERFACE m_axi port=matA offset=slave bundle=gmem0  
#pragma HLS INTERFACE m_axi port=matB offset=slave bundle=gmem1  
#pragma HLS INTERFACE m_axi port=matC offset=slave bundle=gmem2  
#pragma HLS INTERFACE s_axilite port=matA bundle=control  
#pragma HLS INTERFACE s_axilite port=matB bundle=control  
#pragma HLS INTERFACE s_axilite port=matC bundle=control  
#pragma HLS INTERFACE s_axilite port=col bundle=control  
#pragma HLS INTERFACE s_axilite port=row bundle=control  
#pragma HLS INTERFACE s_axilite port=return bundle=control 
注記: sds++ コンパイラでは、パフォーマンスのためデフォルトで個々のバンドルに m_axi が推論されますが、Vitis コンパイラでは、各バンドルを新しい gmem に設定する必要があります。必要なインターフェイスの数を減らすには、異なるインターフェイスに同じバンドル名を使用します。

上記のコードは、3 つの行列パラメーター matAmatB、および matC に、アクセラレータとのデータ転送用に高パフォーマンス メモリ マップド AXI インターフェイス (m_axi) を定義しています。スカラー パラメーターは、カーネル関数の s_axilite インターフェイスと col および row などの関数パラメーターのほか、メモリ マップド インターフェイスのベース アドレスおよび関数の戻り値にもマップされます。

カーネル インターフェイスは HLS INTERFACE プラグマを使用して定義します。コンパイラで指定のカーネル インターフェイス ポートを定義する際に、これらのパラメーターが使用されます。詳細は、『Vivado Design Suite ユーザー ガイド: 高位合成』 (UG902) および Vitis ソフトウェア プラットフォームでのアプリケーションのアクセラレーション手法 の「インターフェイス合成」を参照してください。

Vitis 環境では、関数パラーメーター (スカラー、ポインター、および戻り制御信号) を、関数の戻り値を含めて 1 つの s_axilite インターフェイス ポートにまとめる必要があります。上記の例では、bundle=control キーワードを指定して、すべての s_axilite ポートを control というインターフェイス ポートにまとめています。

ハードウェア関数ヘッダーが削除され、HLS INTERFACE プラグマが追加されている以外は、関数は大きく変更されていません。関数内で使用されている HLS プラグマは、通常そのまま残しておいてもかまいません。PIPELINE、UNROLL、ARRAY_PARTITION などのプラグマがその例です。