HLS Print 関数 - 2023.2 日本語

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

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

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 では、デバッグをしやすくするために、現在のシミュレーション時間も出力されます。
  • 生成されるデータの量が非常に多いことがあるたえ、大きな配列のダンプには使用しないでください。