hls::stream_of_blocks
の使用には、次のような制限事項があります。
- 各
hls::stream_of_blocks
オブジェクトには、1 つのプロデューサー プロセスとコンシューマー プロセスが必要で、それぞれのプロセスが異なっている必要があります。つまり、1 つのプロセス内でローカルのストリーム オブ ブロックはサポートされません。 - 連続する領域内では
hls::stream_of_blocks
を使用できません。プロデューサーとコンシューマーは、データフロー領域内で別々の同時実行プロセスである必要があります。 - 次の例に示すように、同じスコープまたはネストされたスコープ内など、ネストされた複数の取得/リリース文 (
write_lock
/read_lock
) を使用することはできません。using ppbuf = int[N]; void readerImplicitNested(hls::stream_of_blocks<ppbuf>& in, ...) { for(unsigned j = 0; j < M; ++j) { hls::read_lock<ppbuf> arrA(in); // constructor would acquire A first hls::read_lock<ppbuf> arrB(in); // constructor would acquire B second for(unsigned i = 0; i < N; ++i) ... = arrA[f(i)] + arrB[g(i)]; // destructor would release B first // destructor would release A second } }
ただし、たとえば if/else 分岐内や後続の 2 つのコード ブロック内など、複数の連続的または一緒に使用できない取得/リリース文 (
write_lock
/read_lock
) を使用できます。この例を次に示します。void readerImplicitNested(hls::stream_of_blocks<ppbuf>& in, ...) { for(unsigned j = 0; j < M; ++j) { { hls::read_lock<ppbuf> arrA(in); // constructor acquires A for(unsigned i = 0; i < N; ++i) ... = arrA[f(i)]; // destructor releases A } { hls::read_lock<ppbuf> arrB(in); // constructor acquires B for(unsigned i = 0; i < N; ++i) ... = arrB[g(i)]; // destructor releases B } } }
- プロデューサー プロセスとコンシューマー プロセスのロックは、スコープ外になると自動的にリリースされるため、明示的にリリースするのはお勧めしません。ただし、ソース コードで
#include "hls_streamofblocks.h
よりも前に#define EXPLICIT_ACQUIRE_RELEASE
を追加しておくと、これらのコードを使用できます。