串流在软件中(以及在测试激励文件中进行 RTL 协同仿真期间)作为无限队列来建模。在 C++ 中对串流进行仿真无需满足任意深度。串流可在函数内部使用,也可在函数接口上使用。内部串流可作为函数参数来进行传递。
串流仅限在基于 C++ 的设计中才能使用。每个 hls::stream<>
对象都仅限单一进程写入,且仅限单一进程读取。
如果在 Vivado IP 流程中,顶层接口使用 hls::stream
,那么默认情况下在 RTL 中,将其作为 FIFO 接口 (ap_fifo
) 来实现,但也可选择将其作为 AXI4‑Stream 接口 (axis
) 来实现。在 Vitis 内核流程中,默认将其作为 AXI4‑Stream 接口 (axis
) 来实现。
如果在设计函数中使用 hls::stream
并将其综合到硬件中,那么会将其作为 FIFO 来实现,且默认深度为 2。在某些情况下(如使用内插时),可能必须增大 FIFO 深度以确保 FIFO 可保存硬件生成的所有元素。如果无法确保 FIFO 大小足以保存硬件生成的所有数据样本,则可能导致设计停滞(可见于 C/RTL 协同仿真和硬件实现中)。FIFO 深度可使用 STREAM 指令搭配 depth
选项来进行调整。
hls::stream
变量在默认非 DATAFLOW 区域内使用时的大小设置正确。如果使用 hls::stream
在不同任务(子函数或循环)间传输数据,应立即考量在不同任务间存在数据串流的 DATAFLOW 区域内实现这些任务。默认(非 DATAFLOW)行为是完成每一项任务后再开始下一项任务,在此情况下必须确保用于实现 hls::stream
变量的 FIFO 大小足以保存生产者任务所生成的所有数据采样。不增大 hls::stream
变量的大小会导致如下错误:
ERROR: [XFORM 203-733] An internal stream xxxx.xxxx.V.user.V' with default size is
used in a non-dataflow region, which may result in deadlock. Please consider to
resize the stream using the directive 'set_directive_stream' or the 'HLS stream'
pragma.
此错误表示在非 DATAFLOW 区域内,默认 FIFO 深度为 2 可能不足以保存生产者任务写入 FIFO 的所有数据采样,并且可能发生死锁。