重要: 在 C++ 类中使用循环时,请确保循环感应变量不属于该类的数据成员,因为这会导致展开此循环。
在此示例中,循环感应变量 k
是类 loop_class
的成员。
template <typename T0, typename T1, typename T2, typename T3, int N>
class loop_class {
private:
pe_mac<T0, T1, T2> mac;
public:
T0 areg;
T0 breg;
T2 mreg;
T1 preg;
T0 shift[N];
int k; // Class Member
T0 shift_output;
void exec(T1 *pcout, T0 *dataOut, T1 pcin, T3 coeff, T0 data, int col)
{
Function_label0:;
#pragma HLS inline off
SRL:for (k = N-1; k >= 0; --k) {
#pragma HLS unroll // Loop will fail UNROLL
if (k > 0)
shift[k] = shift[k-1];
else
shift[k] = data;
}
*dataOut = shift_output;
shift_output = shift[N-1];
}
*pcout = mac.exec1(shift[4*col], coeff, pcin);
};
为了使 Vitis HLS 能够按 UNROLL 编译指示指令指定的方式展开此循环,应重写此代码,从类成员中移除 k
,使其成为 exec
函数的本地类成员。