阵列到串流的编码样式 - 2023.2 简体中文

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

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

虽然阵列可转换为串流,但这样通常会导致出现编码及综合问题,因为阵列可按随机顺序访问,而串流则需采用按顺序访问模式,即每个元素都按顺序读取。为避免出现此类问题,需要串流接口时,强烈建议使用 hls::stream 对象,如 使用 HLS 串流 中所述。使用此构造将强制执行源代码中的串流语义。

但要将阵列转换为串流,您应对临时变量执行所有运算。读取输入串流、处理临时变量并写入输出串流,如以下示例所示。此方法允许您保留数据串流的读取和写入顺序,而不是尝试多次或随机读取或写入。

struct A {
  short varA;
  int varB;
};
 
void dut(A in[N], A out[N], bool flag) {
#pragma HLS interface mode=axis port=in,out
   for (unsigned i=0; i<N; i++) {
      A tmp = in[i];
      if (flag)
         tmp.varB = tmp.varA + 5;
   out[i] = tmp;
   }
}

如不遵循此编码样式,它将导致串流处理功能失败。

建议的方法是将实参定义为 hls::stream 对象,如下所示:

void dut(hls::stream<A> &in, hls::stream<A> &out, bool flag) {
#pragma HLS interface mode=axis port=in,out

for (unsigned i=0; i<N; i++) {
   A tmp = in.read();
   if (flag)
      tmp.varB = tmp.varA + 5;
   out.write(tmp);
  }
}