默认情况下,所有阵列均作为乒乓缓存来实现以启用随机访问。这些缓冲器也可根据需要调整大小。例如,在某些情况下(如绕过任务时),可能会出现性能劣化。为缓解对性能造成的影响,可通过使用 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_axi
或 ap_memory
。但如果 INTERFACE 编译指示或指令将阵列定义为 ap_fifo
或 axis
,则可将阵列指定为串流。
在设计内,如果实现需要 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 的深度(块数)。