动态存储器使用 - 2023.2 简体中文

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

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

负责管理系统内的存储器分配的任意系统调用(例如,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 建议执行以下步骤:

  1. 将用户定义的 NO_SYNTH 宏添加到代码中,并对代码进行修改。
  2. 启用 NO_SYNTH 宏、执行 C/C++ 语言仿真,并保存结果。
  3. 禁用 NO_SYNTH 宏,执行 C/C++ 语言仿真以验证结果是否相同。
  4. 在禁用用户定义的宏的情况下执行综合。

此方法可确保通过 C/C++ 语言仿真来确认更新后的代码,然后对相同的代码进行综合。就像 C/C++ 语言中的动态存储器使用限制一样,Vitis HLS 也不支持动态创建或删除 C/C++ 对象(用于综合)。