【问题标题】:Is function return an array possible in Vivado HLS?在 Vivado HLS 中函数是否可以返回数组?
【发布时间】:2016-08-09 02:27:08
【问题描述】:

这样的函数:

int * getRandom( ) {

   static int  r[10];
   int i;

   /* set the seed */
   srand( (unsigned)time( NULL ) );

   for ( i = 0; i < 10; ++i) {
      r[i] = rand();
      printf( "r[%d] = %d\n", i, r[i]);
   }

   return r;
}

这是否可以在 Vivado HLS 中使用?如果可能,我如何初始化一个未知大小的数组,因为我不能再使用staticmalloc

【问题讨论】:

  • 在标准 C 中,您不能从函数返回数组 — 您可以返回 OK 指针(因此显示的代码是允许的,尽管它显然存在重入和线程问题)。如果您不能使用staticmalloc() 等,则需要将数组传递给函数以供其填充,而不是返回数组。那么分配空间就是调用者的责任。
  • @JonathanLeffler 所以你的意思是我可以将全局数组设置为函数参数并为每个元素赋值,这样我就可以在不使用静态和 malloc 的情况下获取数组?
  • 是的,或者是一个本地数组,或者你想的任何其他类型的数组。我认为适当的实现可能是:void getRandom(int n_vals, int *i_vals) { for (int i = 0; i &lt; n_vals; i++) i_vals[i] = rand(); },但可能的变化是大量的。如果您真的需要,您可以恢复打印;如果你真的想打电话,你甚至可以打电话给srand(),但你应该只打电话一次。然后,您可以拥有 void somefunc(void) { int data[20]; getRandom(15, data); …use data…; }static int data[20]; void somefunc(void) { getRandom(18, data); …use data…; } 或其他变体。
  • @JonathanLeffler 谢谢!你的回答解决了我的问题。

标签: c arrays vivado vivado-hls


【解决方案1】:

将 cmets 转换为答案。

在标准 C 中,您不能从函数返回数组 — 您可以返回 OK 指针(因此显示的代码是允许的,尽管它显然存在重入和线程问题)。如果您不能使用staticmalloc() 等,则需要将数组传递给函数以供其填充,而不是返回数组。那么分配空间就是调用者的责任。

另见srand() — why call it only once

所以你的意思是我可以将一个全局数组设置为函数参数并为每个元素赋值,这样我就可以在不使用staticmalloc 的情况下获取数组?

是的,或者是一个本地数组,或者你想的任何其他类型的数组。我认为适当的实现可能是:

void getRandom(int n_vals, int *i_vals)
{
    for (int i = 0; i < n_vals; i++)
        i_vals[i] = rand();
}

但可能的变化有很多。如果您真的需要,您可以恢复打印;如果你真的想打电话,你甚至可以打电话给srand()(但你应该只打电话一次)。然后你可以像这样使用它:

void somefunc(void)
{
    int data[20];
    getRandom(15, data);
    …use data…;
}

static int data[20];

void somefunc(void)
{
    getRandom(18, data);
    …use data…;
}

或其他变体(例如在 data 的文件范围定义前不使用 static — 将其转换为全局变量)。 (是的,您可能会在问题中使用 10,或者使用 20 作为数组中的空间量——但 15 和 18 在它们的上下文中也是可以的值。)

【讨论】:

  • 好吧,我不知道我是否完全同意:在 Vivado HLS 中,您可以使用数组“partition -> complete”选项。通过这种方式,您可以创建一个并行传递所有数据的硬件加速器(例如到​​另一个硬件加速器)。我想说的是,我们正在谈论 FPGA:这是用于描述和创建硬件的 C 语言
猜你喜欢
  • 2022-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-03
  • 2018-02-25
  • 1970-01-01
相关资源
最近更新 更多