限制 - 2023.2 简体中文

Vitis 高层次综合用户指南 (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 简体中文

使用 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 来使用这些锁定。