负责管理系统内的存储器分配的任意系统调用(例如,malloc()
、alloc()
和 free()
)都使用该操作系统的存储器中现有的资源,并在运行时期间进行创建和释放。为了能对硬件实现进行综合,设计必须完全为自包含的独立设计,并指定所有必要的资源。
必须从设计代码中移除存储器分配系统调用后才能进行综合。由于动态存储器操作用于定义设计功能,因此必须转换为受同等限制的表示法。以下代码示例显示了如何将使用 malloc()
的设计变换为可综合版本,并突出显示了 2 项实用的编码样式技巧:
- 此设计不使用
__SYNTHESIS__
宏。用户定义的
NO_SYNTH
宏用于选择可综合版本或不可综合版本。这样可确保在 C/C++ 语言中仿真的代码与 Vitis HLS 中综合的代码相同。 - 使用
malloc()
的原始设计中的指针无需重写即可配合固定大小的元素一起使用。可创建固定大小的资源,并且可将现有指针直接设置为指向此固定大小的资源。此技巧可避免对现有设计进行手动重新编码。
#include "malloc_removed.h"
#include <stdlib.h>
//#define NO_SYNTH
dout_t malloc_removed(din_t din[N], dsel_t width) {
#ifdef NO_SYNTH
long long *out_accum = malloc (sizeof(long long));
int* array_local = malloc (64 * sizeof(int));
#else
long long _out_accum;
long long *out_accum = &_out_accum;
int _array_local[64];
int* array_local = &_array_local[0];
#endif
int i,j;
LOOP_SHIFT:for (i=0;i<N-1; i++) {
if (i<width)
*(array_local+i)=din[i];
else
*(array_local[i])=din[i]>>2;
}
*out_accum=0;
LOOP_ACCUM:for (j=0;j<N-1; j++) {
*out_accum += *(array_local+j);
}
return *out_accum;
}
由于在此处执行编码更改会影响设计功能,因此 AMD 不建议使用 __SYNTHESIS__
宏。AMD 建议执行以下步骤:
- 将用户定义的
NO_SYNTH
宏添加到代码中,并对代码进行修改。 - 启用
NO_SYNTH
宏、执行 C/C++ 语言仿真,并保存结果。 - 禁用
NO_SYNTH
宏,执行 C/C++ 语言仿真以验证结果是否相同。 - 在禁用用户定义的宏的情况下执行综合。
此方法可确保通过 C/C++ 语言仿真来确认更新后的代码,然后对相同的代码进行综合。就像 C/C++ 语言中的动态存储器使用限制一样,Vitis HLS 也不支持动态创建或删除 C/C++ 对象(用于综合)。