データフロー領域でのフィードバックのモデル化 - 2023.2 日本語

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

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

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
}