インテル®高位合成 (HLS) コンパイラー プロ・エディション: ベスト・プラクティス・ガイド

ID 683152
日付 12/16/2019
Public
ドキュメント目次

8.1. コンポーネントがコ・シミュレーションでのみ失敗する場合

コンポーネントを エミュレーション (-march=x86-64) モードまたはコ・シミュレーション (-march=FPGA_name_or_part_no ) モードでコンパイルした結果発生する不一致の原因は、通常、コンポーネントまたはテストベンチのバグです。しかし、不一致が発生する原因がバグ以外の場合もよくあります。

浮動小数点の結果を比較する

イプシロンを使用して、テストベンチでの浮動小数点値の結果を比較します。RTLハードウェアからの浮動小数点の結果は、x86エミュレーション・フローとは異なります。

#pragma ivdep を使用してメモリーの依存関係を無視する

#pragma ivdep コンパイラー・プラグマを使用すると、コンポーネントの機能が不正確になる可能性があります。これは、コンポーネントのメモリー依存関係をプラグマで無視しようとした場合です。safelen 修飾子を使用して、メモリー依存関係の発生前に許可できるメモリーアクセス数の制御ができます。

このプラグマの説明については、 インテルHLS (高位合成) コンパイラー: リファレンス・マニュアル内のivdep プラグマを使用したループ伝搬依存性の削除 を参照してください 。

ivdep プラグマの使用例は、 <quartus_installdir>/hls/examples/tutorials/best_practices/loop_memory_dependency のチュートリアルを確認してください。

初期化されていない変数の確認

コーディングを実行すると、C++仕様で定義されていない動作が生じることがよくあります。この未定義の動作は、エミュレーションでは期待どおりに機能することがあります。コ・シミュレーションでは機能しません。

よくある例としてこの状況が発生するのは、デザインからの読み出しが、初期化されていない変数、特に初期化されていない struct 変数から行われる場合です。

初期化されていない値に対するコードの確認を -Wuninitialized コンパイラー・フラグを使用して行います。または、エミュレーション・テストベンチのデバッグを valgrind デバッグツールを使用して行います。-Wuninitialized コンパイラー・フラグでは、初期化されていない struct 変数は表示しません。

変数の誤動作をチェックするためには、1つ以上のストリーム・インターフェイスをデバッグストリームとして使用することもできます。1つ以上の ihc::stream_out インターフェイスをコンポーネントに追加して、コンポーネントによる内部状態変数の書き出しを実行時させることができます。エミュレーション・フローとコ・シミュレーション・フローの出力を比較すると、RTLの動作がエミュレータの動作と異なっている場所がわかります。

ノン・ブロッキング・ストリーム・アクセス

tryRead() のエミュレーション・モデルはサイクル精度ではないため、 サイクル精度 の動作は、エミュレーションとコ・シミュレーションとで異なる場合があります。

ノン・ブロッキング・ストリーム・アクセス (例えば tryRead()) が、FIFOを備えたストリーム (つまり ihc::depth<> テンプレート・パラメーター) からである場合、tryRead() の最初の数回のイタレーションによって返される可能性があるのは、コ・シミュレーションでは false ですが、エミュレーションでは true です。

この場合、コンポーネントをテストベンチからさらに数回呼び出して、ストリーム内のすべてのデータを確実に消費するようにします。この追加の呼び出しによって機能的な問題は起きないはずです。これは、tryRead() によって返されるのは false だからです。