C 语言建模与 RTL 实现 - 2023.2 简体中文

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

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

串流在软件中(以及在测试激励文件中进行 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 的所有数据采样,并且可能发生死锁。