PIPO バッファーの主な制限の 1 つは、C++ の関数呼び出しシーケンスに対して、前にしか転送できないことです。つまり、次の接続は PIPO ではサポートされていませんが、hls::stream_of_blocks
ではサポートされます。
void top(...) {
int b[N];
for (int i = 0; i < M; i++) {
#pragma HLS dataflow
#pragma HLS stream off variable=b
consumer(b, ...); // reads b
producer(b, ...); // writes b
}
}
この概念は、次のコード例で示します。
#include "hls_streamofblocks.h"
typedef int buf[N];
void producer (hls::stream_of_blocks<buf> &out, ...) {
for (int i = 0; i < M; i++) {
hls::write_lock<buf> arr(out);
for (int j = 0; j < N; j++)
arr[f(j)] = ...;
}
}
void consumer(hls::stream_of_blocks<buf> &in, ...) {
if (in.empty()) // execute only when producer has already generated some meaningful data
return;
for (int i = 0; i < M; i++) {
hls::read_lock<buf> arr(in);
for (int j = 0; j < N; j++)
... = arr[g(j)];
...
}
}
void top(...) {
// Note the large non-default depth.
// The producer must complete execution before the consumer can start again, due to ap_ctrl_chain.
// A smaller depth would require ap_ctrl_none
hls::stream_of_blocks<buf, M+2> backward;
for (int i = 0; i < M; i++) {
#pragma HLS dataflow
consumer(backward, ...); // reads backward
producer(backward, ...); // writes backward
}