システム コールは、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__
マクロは機能を変更するために使用しないでください。