默认情况下,所有阵列均作为乒乓缓存来实现以启用随机访问。这些缓冲器也可根据需要调整大小。例如,在某些情况下(如绕过任务时),可能会出现性能劣化。为缓解对性能造成的影响,可通过使用 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_fifo
、axis
或 ap_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。