Vitis コア開発キットでは、1 つまたは複数のフリーランニング カーネルがサポートされます。フリーランニング カーネルには制御信号ポートがないので、開始または停止できません。このフリーランニング カーネルの制御信号ではない信号には、次のような特徴があります。
- フリーランニング カーネルにはメモリ入力または出力ポートがないので、ホストまたはその他のカーネル (標準カーネルまたは別のフリーランニング カーネル) とはストリームを介してしか通信できません。
- FPGA がバイナリ コンテナー (xclbin) によりプログラムされると、FPGA でフリーランニング カーネルが開始するので、ホスト コードから開始する必要は必要ありません。
- カーネルがプラットフォーム I/O またはその他のカーネルからストリーム データを受信開始するとすぐに処理し、使用可能なデータがなくなると停止するからです。
フリーランニング カーネルの主な利点は、すべての関数が同じ回数実行される必要があるという C セマンティクスに従わないことです。このモデリング形式は、次の例に示すように RTL デザインに類似しています。コンパイラは、前の関数呼び出しが終了した後に自動的に再起動するようにカーネルをモデリングします。この機能は、ソフトウェア コードの while(1)
ループに類似しており、カーネル コードでループを指定する必要がありません。これは、カーネルが INTERFACE プラグマで mode=ap_ctrl_none
モードを使用する場合に達成できます。これにより、AXI4-Lite インタフェース上に制御信号のないカーネルが作成されます。このモデリング方法は、制御ハンドシェイクがないので、フリーランニング カーネルと呼ばれます。カーネルは自動的に起動し、継続的に実行されます。
重要: フリーランニング カーネルは、カーネルの周りに
while(1)
ループがあるような動作になります。このため、非確定的な動作が発生しないよう、ソース コードで while(1)
ループを明示的に定義しないでください。また、カーネルがサポートするには、ストリーミング インターフェイス (axis
) のみです。次の例に示すように、m_axi
または s_axilite
インターフェイスを使用しないでください。
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;
}
}
ヒント: ソフトウェア エミュレーションは、フリーランニング カーネルではサポートされません。