将阵列指定为乒乓缓冲器或 FIFO - 2021.2 Chinese

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

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

默认情况下,所有阵列均作为乒乓缓存来实现以启用随机访问。这些缓冲器也可根据需要调整大小。例如,在某些情况下(如绕过任务时),可能会出现性能劣化。为缓解对性能造成的影响,可通过使用 STREAM 指令来调整这些缓冲器的大小,以向生产者 (producer) 和使用者 (consumer) 提供更多裕量,如下所示。

void top ( ... ) {
#pragma HLS dataflow
  int A[1024];
#pragma HLS stream off variable=A depth=3
 
  producer(A, B, …);  // producer writes A and B
  middle(B, C, ...);  // middle reads B and writes C
  consumer(A, C, …);  // consumer reads A and C

在接口中,如果顶层函数接口上的阵列设置为 ap_fifoaxisap_hs 类型的接口,那么阵列会自动指定为串流。

在设计内,如果实现需要 FIFO,必须使用 STREAM 指令将所有阵列指定为串流。

注释: 对阵列应用 STREAM 指令时,硬件内实现生成的 FIFO 包含的元素数量与阵列同样多。-depth 选项可用于指定 FIFO 的大小。

STREAM 指令还用于从 config_dataflow 配置指定的默认实现更改 DATAFLOW 区域内的所有阵列。

  • 如果 config_dataflow default_channel 设置为乒乓,那么可通过向任意阵列应用 STREAM 指令以将该阵列作为 FIFO 来实现。
    注释: 要使用 FIFO 实现,必须以串流方式来访问阵列。
  • 如果 config_dataflow default_channel 设置为 FIFO,或者 Vitis HLS 已自动判定以串流方式访问 DATAFLOW 区域中的数据,那么仍可通过向阵列应用含 -off 选项的 STREAM 指令,以便将任意阵列作为乒乓实现来加以实现。
重要: 要保留访问,可能需要使用 volatile 限定符来阻止编译器最优化(尤其是死码消除)。

当 DATAFLOW 区域中的阵列指定为作为 FIFO 来进行串流和实现时,通常 FIFO 无需保留与原始阵列相同数量的元素。当数据采样可用后,DATAFLOW 区域中的任务会立即使用该数据采样。含 -fifo_depth 选项的 config_dataflow 命令或者含 -depth 的 STREAM 指令可用于将 FIFO 大小设置为必需的最小元素数量以确保数据流从不停滞。如果选中 -off 选项,-depth 选项会设为 PIPO 的深度(块数)。深度应至少为 2。