重要: ループを 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);
};
UNROLL プラグマ指示子で指定したように Vitis HLS でループを展開できるようにするには、コードを記述し直して k
をクラス メンバーからはずし、exec
関数のローカルにする必要があります。