hls::print
関数は、C の printf
と似ており、フォーマット文字列と 1 つの int
または double
引数 (オプション) を標準出力に表示し、C シミュレーション、RTL 協調シミュレーション、およびハードウェア エミュレーションのシミュレーション ログに出力します。
ただし、次に示すように、限られたデータ型セットで、最大 1 つの引数を出力するように制限されています。また、パイプラインの開始間隔とレイテンシも変更される可能性があるため、使用するのはかなり控えめにする必要があります。
hls::print
関数の用途は次のとおりです。
- 選択した変数の値をトレースします。
- 複雑な制御と同時実行 (たとえば、データフロー内) でコード ブロックが実行される順序に従います。ヒント: スケジューラは、コードの基本ブロック内で個々のステートメントがスケジュールされる順序をトレースするためには使用できません。これは、スケジューラがその順序を大幅に変更する可能性があるためです。
この単純な例で使用すると、次のようになります。
#include "hls_print.h"
...
for (int i=0; i<N; i++) {
#pragma HLS pipeline ii=1
hls::print("loop %d\n", i);
...
C シミュレーション、ソフトウェア エミュレーション、RTL 協調シミュレーション、およびハードウェア エミュレーションで、ループの各イテレーションごとに「i」の値が出力されます (ターゲットがハードウェア インプリメンテーションの場合は、現在のところは無視されます)。
次の点に注意してください。
-
hls::print
は、Verilog RTL でのみサポートされます。 - サポートされるフォーマット指定子は、次だけです。
- 整数または符号なしの場合、%d
- float または double の場合、%f
-
long
型とlong long
型の値、およびその符号なしの型の値は、int
またはuint
にキャストする必要があります (C++ の引数昇格規則のため)。 - 「監視」ポイントを追加しておくと、
hls::print
の挿入で HLS によって実行される最適化が変更される場合があります。このため、RTL の動作を変更できます (ソフトウェアのprintf
の場合と同様ですが、HLS の性質により、バイナリの動作を大幅に変更できます)。 -
int
またはdouble
値のみを渡すと、上記の影響を最小限に抑えることができます。 - コード ブロック内のさまざまな
hls::print
関数の実行順序は、最適化とスケジューリングによって変わる場合があります。 - RTL では、デバッグをしやすくするために、現在のシミュレーション時間も出力されます。
- 生成されるデータの量が非常に多いことがあるたえ、大きな配列のダンプには使用しないでください。