配置数据流存储器通道 - 2021.2 Chinese

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

Document ID
UG1399
Release Date
2021-12-15
Version
2021.2 Chinese

根据数据生产者和使用者的访问模式,Vitis HLS 将任务间的通道作为乒乓缓冲器或 FIFO 缓冲器来实现。

  • 对于标量、指针和引用参数,Vitis HLS 将通道作为 FIFO 来实现。
  • 如果参数(生产者或使用者)为阵列,那么 Vitis HLS 会将通道作为乒乓缓冲器或 FIFO 来实现,如下所示:
    • 如果 Vitis HLS 判定数据按顺序访问,那么 Vitis HLS 会将存储器通道作为 FIFO 通道来实现以最优化性能,且通道深度为估算值(但实际上可能需要手动微调)。
    • 如果 Vitis HLS 无法判定数据是否按顺序访问或者判定数据采用随机方式访问,那么 Vitis HLS 会将存储器通道作为乒乓缓冲器来实现,即,将其作为 2 个块 RAM,分别由使用者阵列或生产者阵列的最大大小来定义。
      注释: 乒乓缓冲器可确保通道始终具有保存所有样本(不出现丢失)所需的容量。但这种方法在某些情况下可能过于保守。

要显式指定任务之间使用的默认通道,请使用 config_dataflow 配置。此配置可为设计中的所有通道设置默认通道。要减小通道中使用的存储器大小并允许在单一迭代内重叠,可使用 FIFO。要显式设置 FIFO 中的深度(即,元素数量),请使用 -fifo_depth 选项。

指定的 FIFO 通道大小会覆盖默认设置。如果设计中的任何任务生成或使用的样本都可大于指定的 FIFO 大小,那么 FIFO 可能变为空(或满)。在此情况下,设计将停止操作,因为它无法读取(或写入)。这可能导致停滞或死锁状态。

注释: 如果造成死锁状态,那么仅当执行 C/RTL 协同仿真时或者在完整的系统中使用此块时,您才会看到此状态。

设置 FIFO 的深度时,赛灵思建议将初始深度设置为传输的数据值的最大数量(例如,任务间传递的阵列的大小)、确认设计能够成功通过 C/RTL 协同仿真,然后减小 FIFO 大小并确认 C/RTL 协同仿真仍可成功完成且不会出现任何问题。如果 RTL 协同仿真失败,那么 FIFO 大小可能太小,而无法阻止出现停滞或死锁状况。

运行 RTL 协同仿真后,Vitis HLS IDE 可显示每个 FIFO/PIPO 缓冲器的长时间占用量的直方图。这有助于判定每个缓冲器的最佳深度。