配列をストリームに変換するコーディング スタイル - 2023.2 日本語

Vitis 高位合成ユーザー ガイド (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 日本語

配列はストリームに変換できます。ただし、配列はランダムな順序でアクセスできますが、ストリームではすべての要素が順番に読み出されるシーケンシャル アクセス パターンが必要なので、コーディングや合成で問題が発生することがよくあります。このような問題を回避するには、HLS ストリームの使用 で説明されるように、ストリーミング インターフェイスが必要な場合は、hls::stream オブジェクトを使用することを強くお勧めします。このコンストラクトを使用すると、ソース コードでストリーミング セマンティクスが使用されるようになります。

ただし、配列をストリームに変換するには、すべての操作を一時変数に対して実行する必要があります。次の例に示すように、入力ストリームを読み出し、一時変数を処理し、出力ストリームを書き込みます。この方法を使用すると、複数の読み出しや書き込み、またはランダムな読み出しや書き込みをしようとするよりも、データのストリームのシーケンシャルな読み出しおよび書き込みを保持できます。

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