系统调用 - 2023.2 简体中文

Vitis 高层次综合用户指南 (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 简体中文

系统调用无法综合,因为系统调用操作与正在运行 C/C++ 程序的操作系统上执行的某些任务有关。

Vitis HLS 会忽略仅显示数据而对算法执行没有影响的常用系统调用,如 printf()fprintf(stdout,)。一般情况下,系统调用无法综合,应在综合前从函数中移除。其他此类调用示例包括 getc()time()sleep(),这些操作都会对操作系统执行调用。

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__ 宏来更改功能。