Vitis コア開発キットは、PL カーネル上のストリーミング インターフェイスをサポートしていますが、フリーランニング カーネルと呼ばれる特殊なデータ駆動型カーネルもサポートしています。フリーランニング カーネルには制御信号ポートがないので、ソフトウェア アプリケーションとの相互作用メカニズムがなく、開始または停止できません。フリーランニング カーネルには、次のような特徴があります。
- デバイスがバイナリ コンテナー (xclbin) によりプログラムされると、フリーランニング カーネルが自動的に開始するので、ソフトウェア アプリケーションから開始する必要は必要ありません。
- メモリ入力または出力ポートを持たないため、入力または出力ストリームを介してのみほかのカーネルと相互作用します。
- カーネルはデータを受信するとすぐにストリーム データを操作し、データがない場合はストールします。
フリーランニング カーネルの主な利点は、すべての関数が同じ回数実行される必要があるという C セマンティクスに従わないことです。このモデリング形式は、次の例に示すように RTL デザインに類似しています。コンパイラは、前の関数呼び出しが終了した後に自動的に再起動するようにカーネルをモデリングします。この機能は、ソフトウェア コードの while(1)
ループに類似しており、カーネル コードでループを指定する必要がありません。
フリーラニング カーネルには hls::stream
入力と出力しか含まれません。推奨されるガイドラインは次のとおりです。
- カーネル インターフェイスには、
hls::stream<ap_axiu<D,0,0,0> >
を使用します。 - 関数パラメーターに
hls::stream
型を使用すると、Vitis HLS でインターフェイスに AXI4-Stream ポート (axis
) が推論されます。 - カーネルは、ストリーミング インターフェイス (
axis
) のみをサポートします。次の例に示すように、m_axi
またはs_axilite
インターフェイスを使用しないでください。 - フリーランニング カーネルは、INTERFACE プラグマを使用して次のブロック制御プロトコルを指定する必要もあります。
#pragma HLS interface ap_ctrl_none port=return
ヒント: これにより、AXI4-Lite インタフェースまたは制御信号のないカーネルが作成されます。このモデリング方法は、制御ハンドシェイクがなく、自動的に起動して継続的に実行されることから、フリーランニング カーネルと呼ばれます。ソフトウェア アプリケーションとの相互作用が必要なカーネルの場合、 『Vitis 高位合成ユーザー ガイド』 (UG1399) で説明されるように、自動再起動カーネルの使用を検討してください。
次のコード例は、入力 1 つと出力 1 つを含むフリーラニング カーネルが別のカーネルと通信するところを示しています。
void increment(hls::stream<ap_axiu<32, 0, 0, 0> >& input,
hls::stream<ap_axiu<32, 0, 0, 0> >& output){
#pragma HLS interface ap_ctrl_none port = return
ap_axiu<32, 0, 0, 0> v = input.read();
v.data = v.data + 1;
output.write(v);
if (v.last){
break;
}
}
重要: ソフトウェア エミュレーションは、フリーランニング カーネルではサポートされません。