将阵列指定为 PIPO 或 FIFO - 2023.2 简体中文

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

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

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

void top ( ... ) {
#pragma HLS dataflow
  int A[1024];
#pragma HLS stream type=pipo 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

接口上的阵列默认定义为 m_axiap_memory。但如果 INTERFACE 编译指示或指令将阵列定义为 ap_fifoaxis,则可将阵列指定为串流。

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

提示: 对阵列应用 STREAM 指令时,硬件内实现生成的 FIFO 包含的元素数量与阵列同样多。但 depth 选项可用于指定 FIFO 的大小,如 syn.directive.stream 中所述。

STREAM 编译指示或指令也可用于覆盖 syn.dataflow.fifo_depth 配置命令为 DATAFLOW 区域内的任意阵列指定的默认实现,如 数据流配置 中所述。总体上,建议对给定阵列使用 STREAM 编译指示或指令,而不是使用全局选项。

  • 如果 syn.dataflow.default_channel 设置为乒乓,那么只要对任意阵列应用 STREAM 指令,就仍能将该阵列作为 FIFO 来实现。

    提示: 要使用 FIFO 实现,必须以顺序方式(而非随机访问顺序)来访问阵列。
  • 如果 syn.dataflow.default_channel 设为 FIFO,那么只要对阵列的 STREAM 编译指示或指令应用 type=pipo,就仍能将该阵列作为乒乓实现来加以实现。
重要: 要保留顺序访问以确保正确执行串流,可能需要使用 volatile 限定符来阻止编译器最优化(尤其是死码消除)。

当 DATAFLOW 区域中的阵列指定为作为 FIFO 来进行串流和实现时,通常 FIFO 无需保留与原始阵列相同数量的元素。当数据采样可用后,DATAFLOW 区域中的任务会立即使用该数据采样。FIFO 深度可使用 syn.dataflow.fifo_depth 选项或者 STREAM 编译指示或指令搭配 depth 选项来指定。这可用于设置 FIFO 大小,以确保数据流从不发生停滞。

如果选中 type=pipo 选项,depth 选项会设为 PIPO 的深度(块数)。