システム コール - 2023.2 日本語

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

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

システム コールは、C/C++ プログラムが実行されている OS で一部のタスクを実行するので、合成できません。

Vitis HLS では、printf()fprintf(stdout,) などのデータを表示するだけでアルゴリズムの実行には影響しないシステム コールは無視されます。通常はシステム コールは合成できないので、合成前に関数から削除しておく必要があります。getc()time()sleep() などのシステム コールも、OS に対して呼び出しを実行するので合成できません。

Vitis HLS では、合成が実行されたときに __SYNTHESIS__ マクロが定義されます。これにより、__SYNTHESIS__ マクロを使用して、デザインから合成不可能なコードを削除できるようになります。

注記: __SYNTHESIS__ マクロは、合成されるコードにのみ使用します。このマクロは C/C++ シミュレーションまたは C/C++ RTL 協調シミュレーションには従っていないので、テストベンチには使用しないでください。
注意:
__SYNTHESIS__ をコードまたはコンパイラ オプションで定義または定義解除すると、コンパイル エラーが発生することがあります。

次に、サブ関数からの中間結果をハード ドライブのファイルに保存するコード例を示します。__SYNTHESIS__ マクロを使用すると、合成不可能なファイルの書き込みが合成中に無視されるようになります。

#include "hier_func4.h"

int shift_func(dint_t *in1, dint_t *in2, dout_t *outA, dout_t *outB)
{
 *outA = *in1 >> 1;
 *outB = *in2 >> 2;
}

void hier_func4(din_t A, din_t B, dout_t *C, dout_t *D)
{
 dint_t apb, amb;

 sumsub_func(&A,&B,&apb,&amb);
#ifndef __SYNTHESIS__
 FILE *fp1; // The following code is ignored for synthesis
 char filename[255];
 sprintf(filename,Out_apb_%03d.dat,apb);
 fp1=fopen(filename,w);
 fprintf(fp1, %d \n, apb);
 fclose(fp1);
#endif
 shift_func(&apb,&amb,C,D);
}

__SYNTHESIS__ マクロを使用すると、関数からコード自体を削除せずに、合成不可能なコードを削除できます。ただし、このマクロを使用すると、シミュレーション用のコードと合成用のコードが異なるものになります。

注意:
__SYNTHESIS__ マクロを C/C++ コードの機能を変更するために使用すると、C/C++ シミュレーションと C/C++ 合成の結果が異なるものになります。このようなコードのエラーはデバッグしにくいので、__SYNTHESIS__ マクロは機能を変更するために使用しないでください。