制限 - 2023.2 日本語

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

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

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 を追加しておくと、これらのコードを使用できます。