HLS 串流库 - 2023.2 简体中文

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

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

串流是一种数据传输形式,其中数据样本从第一个样本开始按顺序发送。串流不需要地址管理。

在 C 语言中很难对使用串流数据的设计进行建模。使用指针执行多次读取和/或写入访问的方法可能会引发问题,因为其中隐式指定了类型限定符以及测试激励文件的构造方式。

重要: hls::stream 类仅限在 C++ 设计中使用。

Vitis HLS 提供了 C++ 模板类 hls::stream<> 用于对串流数据结构进行建模。使用 hls::stream<> 类实现的串流具有如下属性。

  • 在 C 语言代码中,hls::stream<> 的行为与无限深度的 FIFO 相似。无需定义 hls::stream<> 的大小。
  • 按顺序对其执行读取和写入。即,从 hls::stream<> 读取数据之后,无法再次对其进行读取。
  • 顶层接口上的 hls::stream<> 默认情况下使用 ap_fifo 接口来实现(对应 AMD Vivado™ IP 流程)或者作为 AXIS 接口来实现(对应 AMD Vitis™ 内核流程)。
  • 串流可定义为局部或全局,并且始终作为内部 FIFO 来实现。全局作用域内定义的串流遵循的规则与任何其他全局变量相同。
  • 有两种可能的串流声明:
    • hls::stream<Type>:指定串流的数据类型。

      设计内部的 hls::stream<> 作为 FIFO 来实现,默认深度为 2。STREAM 编译指示或指令可用于更改深度。

    • hls::stream<Type, Depth>:指定串流的数据类型和 FIFO 深度。

      设置深度以防止停滞。如果设计中的任意任务生产或使用样本的速度大于指定深度,那么 FIFO 可能因无法读取(或写入)而变为空(或满),从而导致停滞。

本节显示了如何使用 hls::stream<> 类来对含串流数据的设计进行轻松建模。本节中的主题包括:

  • 串流建模以及串流的 RTL 实现概述。
  • 串流使用方式。
  • 阻塞读写。
  • 非阻塞读写。
  • 控制 FIFO 深度。
注释: hls::stream 类应始终在函数之间作为 C++ 参考实参来进行传递。例如,&my_stream