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.