配列はストリームに変換できます。ただし、配列はランダムな順序でアクセスできますが、ストリームではすべての要素が順番に読み出されるシーケンシャル アクセス パターンが必要なので、コーディングや合成で問題が発生することがよくあります。このような問題を回避するには、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);
}
}