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);
};

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