System calls cannot be synthesized because they are actions that relate to performing some task upon the operating system in which the C/C++ program is running.
Vitis HLS ignores commonly-used system calls
that display only data and that have no impact on the execution of the algorithm, such as
printf() and fprintf(stdout,). In general, calls to the system cannot be synthesized and should be
removed from the function before synthesis. Other examples of such calls are getc(), time(), sleep(), all of which make calls to the operating system.
Vitis HLS defines the macro __SYNTHESIS__ when synthesis is performed. This allows the __SYNTHESIS__ macro to exclude non-synthesizable code from the
design.
__SYNTHESIS__ macro in the code to be synthesized. Do not use this macro in the test bench, because it is not obeyed by C/C++ simulation
or C/C++ RTL co-simulation.__SYNTHESIS__ macro in code or with compiler options, otherwise compilation
might fail.In the following code example, the intermediate results from a sub-function
are saved to a file on the hard drive. The macro __SYNTHESIS__ is used to
ensure the non-synthesizable files writes are ignored during 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);
}
The __SYNTHESIS__ macro is a convenient way
to exclude non-synthesizable code without removing the code itself from the function. Using such
a macro does mean that the code for simulation and the code for synthesis are now different.
__SYNTHESIS__ macro is used to change the functionality of the C/C++
code, it can result in different results between C/C++ simulation and C/C++ synthesis. Errors in
such code are inherently difficult to debug. Do not use the __SYNTHESIS__ macro to change functionality.