展开 C++ 类中的循环 - 2023.2 简体中文

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

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 简体中文
重要: 在 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 函数的本地类成员。