虽然阵列可转换为串流,但这样通常会导致出现编码及综合问题,因为阵列可按随机顺序访问,而串流则需采用按顺序访问模式,即每个元素都按顺序读取。为避免出现此类问题,需要串流接口时,强烈建议使用 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);
}
}