C テストベンチおよび C ソース コード - 2023.2 日本語

Vitis 高位合成ユーザー ガイド (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 日本語

次の表に示す C テストベンチおよび C ソース コードを確認してください。

表 1. C テストベンチおよび C ソース コードのデバッグ
質問 必要な操作
C テストベンチで結果がチェックされ、結果が正しい場合に値 0 が返されますか。 C/RTL 協調シミュレーションで C テストベンチから 0 が返されるようにしてください。結果が正しい場合でも、C テストベンチから値 0 が返されないと、C/RTL 協調シミュレーションでエラーがレポートされます。
C テストベンチは乱数に基づいて入力データを作成していますか。 乱数生成に固定シードを使用するようにテストベンチを変更します。乱数生成のシードが、タイム ベース シードなど、変数に基づく場合、シミュレーションに使用されるデータがテストベンチを実行するたびに異なり、結果が異なるものになります。
複数回アクセスされる最上位インターフェイスでポインターを使用していますか。 1 つのトランザクション (C 関数 1 回の実行) 内で複数回アクセスされるポインターには volatile ポインターを使用してください。volatile ポインターを使用しないと、C 標準に準拠するため、最初の読み出しと最後の書き込み以外のすべてが最適化で削除されます。
C コードに定義されていない値が含まれていたり、範囲外の配列アクセスが実行されたりしていますか。

全配列がすべてのアクセスと一致する正しいサイズになっていることを確認してください。問題の原因として、ループ範囲が配列のサイズを超えていることがよくあります (例: N-1 のサイズ指定された配列に N アクセス)。

C シミュレーションの結果に問題がないかどうか、出力値が乱数データ値に割り当てられていないかどうかを確認します。

HLS 外で業界標準の Valgrind アプリケーションを使用してみて、C コードに未定儀や範囲外の問題がないかどうかを確認することも考慮してください。

C 関数は、未定儀または範囲外の変数があっても、実行して完了する可能性があります。C シミュレーションでは未定儀の値に乱数が割り当てられますが、RTL シミュレーションでは不明または X 値が割り当てられます。

デザインに浮動小数点の数学演算を使用していますか。

精密な比較 (exact) を実行する代わりに、C テストベンチ結果が許容範囲のエラーであるかどうかを確認します。浮動小数点の数学演算の中には、RTL インプリメンテーションが C と同じではないものがあります。詳細は、検証および数学関数を参照してください。

サードパーティ シミュレータに、浮動小数点コアの RTL シミュレーション モデルを供給するようにします。詳細は、IP コアのシミュレーションを参照してください。

AMD IP ブロックとサードパーティ シミュレータを使用していますか。 AMD IP のシミュレーション モデルへのパスがサードパーティ シミュレータに渡されるようにします。
データ レートを変更する (間引きや補間など) デザインで hls::stream コンストラクトを使用していますか。

デザインを解析し、STREAM 指示子を使用して hls::stream をインプリメントするのに使用する FIFO のサイズを増加します。

デフォルトでは、hls::stream が深さ 2 の FIFO としてインプリメントされます。補間などによってデータ レートが増加する場合は、デフォルトの FIFO サイズ 2 では小さすぎ、C/RTL 協調シミュレーションが停止することがあります。

シミュレーションで大容量のデータ セットを使用していますか。

C/RTL 協調シミュレーションを実行する際は reduce_diskspace オプションを使用してください。このモードでは、HLS は一度に 1 トランザクションしか実行しません。シミュレーションは多少低速になる可能性がありますが、ストレージおよびシステム容量の問題は制限されます。

C/RTL 協調シミュレーションでは、すべてのトランザクションが一度に検証されます。最上位関数が複数回呼び出されると (ビデオの複数フレームをシミュレーションする場合など)、シミュレーション全体の入力および出力のデータがディスクに保存されます。マシンの設定と OS によっては、これがパフォーマンスや実行の問題の原因となることがあります。