如何在vivado HLS中创建触发信号

问题描述 投票:0回答:1

我想向我的 vivado HLS IP 添加用于测量的二进制触发信号。 代码如下:

void subfunction1(const int a[10], const int b[10], int out[10]){
  for(int i=0;i<10;i++){
    out[i] = a[i] + b[i];
  }
}

void subfunction2(const int a[10], const int b[10], int out[10]){
  for(int i=0;i<10;i++){
    out[i] = a[i] + b[i];
  }
}


void function(const int a[10], const int b[10], int out[10], bool *trigger){
  subfunction1(a, b, out);
  *trigger = true;
  subfunction2(out, b, out);
  *trigger = false
}

uint8_t top_level_fun(const int a[10], const int b[10], int out[10], bool *trigger){
#pragma HLS INTERFACE ap_memory port = a
#pragma HLS INTERFACE ap_memory port = b
#pragma HLS INTERFACE ap_memory port = out
#pragma HLS INTERFACE ap_fifo register port = trigger

#pragma HLS RESOURCE variable=a     core=ROM_1P_BRAM
#pragma HLS RESOURCE variable=b     core=ROM_1P_BRAM
#pragma HLS RESOURCE variable=out   core=RAM_1P_BROM

  function(a,b,out,trigger);
  return 0x01; // success
}

我希望

trigger
变量正常时为
0
,在
1
执行期间为
subfunction2
。当我编译/共同模拟代码并在全波查看器中查看结果时,我发现
trigger
的值永远不会改变。如何在代码执行期间控制
trigger
的值,以便我可以在 IP 的顶层看到它。

vivado vivado-hls
1个回答
0
投票

您需要使触发器变量可变:

void function([...], volatile bool *trigger)
uint8_t top_level_fun([...], volatile bool *trigger)

否则编译器会优化掉以前的调用,因为它认为它们是不必要的。

请注意 UG902 / UG1399 中有关多访问指针的部分:

在使用指针进行多次访问时,在顶层函数(接口上)的参数列表中使用指针的设计需要特别考虑。当在同一函数中多次读取或写入指针时,就会发生多次访问。

使用多次访问的指针可能会在综合后引入意外的行为。在下面的“坏”示例中,指针 d_i 被读取四次,指针 d_o 被写入两次:指针执行多次访问。

#include "pointer_stream_bad.h"

void pointer_stream_bad ( dout_t *d_o,  din_t *d_i) {
 din_t acc = 0;

 acc += *d_i;
 acc += *d_i;
 *d_o = acc;
 acc += *d_i;
 acc += *d_i;
 *d_o = acc;
}

综合后,此代码将产生 RTL 设计,该设计读取输入端口一次并写入输出端口一次。与任何标准 C/C++ 编译器一样,Vitis HLS 将优化掉冗余指针访问。

© www.soinside.com 2019 - 2024. All rights reserved.