串流是一种数据传输形式,其中数据样本从第一个样本开始按顺序发送。串流不需要地址管理。
在 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
。