VSC では、単一のソース C++ モデルを使用するので、機能を迅速に検証できます。ソフトウェア エミュレーション ターゲット (-t sw_emu
) は、v++
コンパイル ステップ中に指定する必要があります。このターゲットでは、VSC は C コンパイルを使用してアクセラレータおよびアプリケーション ソース ファイルをコンパイルし、ハードウェア コンパイルを実行しません。Vitis HLS ツールは RTL の作成には実行されず、オブジェクト ファイルは g++
を使用してリンクされます。
次に、2 つの PE (ldSt
および fsk
) を持つアクセラレータのコード例を示します。ldSt
PE は AXI4-Stream
L
に sz
ワードを書き込み、fsk
PE は単にそれらのワードを S
フィードバック ストリームにコピーします。fsk
関数本体は、L
から 1 ワードを読み込み、S
に 1 ワードを書き込みます。fsk
PE はフリーランニングとマークされているため、sz
には依存しません。
void compute(…) {
hls::stream<T> L, S;
ldSt(…, L, S); // S is feedback
fsk(L, S); // fsk is free-running
}
void ldSt(…, hls::stream<T>& L,
hls::stream<T>& S) {
for (int i=0; i<sz; i++) {
L << input[i];
}
// Error-1: non-empty stream (i < sz-1)
// Error-2: deadlock stream (i < sz+1)
for (int i=0; (i < sz); i++) {
S >> output[i];
}
}
void fsk(hls::stream<T>& L,
hls::stream<T>& S) {
T word;
L >> word;
S << word;
}
C++ ソースは完全に C コンパイルを使用して構築されるため、プロセスは非常に高速です。さらに、VSC は、VSC C++ モデルの特定のハードウェア ビヘイビアー セマンティクスに対してモデルをチェックします。
- アプリケーション層で自動ランタイム アサーションを実行して、ホスト デバイス データを移動します。
- 入力データ バッファーがデバイスに同期された後に書き込まれない可能性があります。
- 結果がデバイスから同期される前に、出力データ バッファが読み出されない可能性があります。
-
CU と PE は並行して実行され、ハードウェア セマンティクスを記述します。したがって、次のようになります。
- 手続き型ではない C++ コードであるフィードバック接続は、機能的に検証できます。
- フリーランニング PE は、通常の PE と共に機能的に検証できます。
- 特定のエラーのあるハードウェア ビヘイビアーが検出されることがあります。
- Error-1: ldSt の 2 番目のループが「i < sz-1」を使用する場合、空ではない AXI4-Stream 'S' になり、これがアサートされます。
- Error-2: ldSt の 2 番目のループで「i < sz +1」を使用する場合、ldStr はストリーム 'S' に書き込まれるワードよりも 1 つ多くのワードを想定しているため、デッドロックが発生します。このシナリオは、この C ベースの早期検証でハングとしてキャプチャされます。