使用 hls::stream_of_blocks
时有些限制需要注意:
- 每个
hls::stream_of_blocks
对象都必须具有单一的生产者和使用者进程,每个进程都必须不同。换言之,不支持单一进程内的本地块串流。 - 在顺序区域内,不能使用
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 } }
但您可以使用多个顺序或互斥的获取/释放语句 (
write_lock
/read_lock
),例如在 IF/ELSE 分支内或者在 2 个后续代码块中。如下示例所示: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
来使用这些锁定。