文章目录
config_dataflow
Description
• Specifies the default behavior of dataflow pipelining (由set_directive_dataflow命令实现).
• 允许您指定默认通道存储类型和深度
作用对象:DATAFLOW区域中的所有数组,全局
Syntax
config_dataflow [OPTIONS ]
Options
-default_channel [fifo|pingpong]
默认情况下,当使用dataflow pipelining时,将使用以乒乓方式配置的乒乓方式配置的RAM缓存来缓冲functions或loops之间的数据。
当使用streaming data时(也就是说,数据总是按连续的顺序读写),FIFO内存更有效,可以选择作为默认内存类型。
TIP:使用set_directive_stream命令将数组设置为streaming执行FIFO访问。
-fifo_depth
指定fifo的默认深度。默认深度为2。
当使用乒乓内存时,这个选项没有效果。如果未指定,则默认深度为2,或者如果这是一个转换为FIFO的数组,则默认大小为原始数组的大小。在某些情况下,这可能过于保守,并引入了超出必要范围的fifo。
当你知道fifo比需要的大的时候,使用这个选项。
CAUTION! 使用此选项时请小心。FIFO深度不够可能会导致死锁情况。
-scalar_fifo_depth
指定标量传播FIFO的最小值。Specifies the minimum for scalar propagation FIFO.
通过标量传播,编译器将标量从C代码转换成fifo。可以使用-start_fifo_depth设置这些fifo的最小大小。如果没有提供此选项,则使用-fifo_depth值。
-start_fifo_depth
Specifies the minimum depth of start propagation FIFOs.
This option is only valid when the channel between the producer and consumer is a FIFO. This option uses the same default value as the-fifo_depth option, which is 2. Such FIFOs can sometimes cause deadlocks, in which case you can use this option to increase the depth of the
FIFO.
此选项仅在生产者和消费者之间的通道为FIFO时有效。该选项使用与-fifo_depth选项相同的默认值,即2。这样的fifo有时会导致死锁,在这种情况下,您可以使用此选项来增加的FIFO深度。
Pragma
没有等同的pragma
Examples
将默认通道从乒乓存储更改为FIFO.
config_dataflow -default_channel fifo
将默认通道从乒乓存储更改为FIFO,深度为6
config_dataflow -default_channel fifo -fifo_depth 6
CAUTION! 如果设计实现要求FIFO的元素大于6个,则此设置将导致设计无法通过RTL验证。使用此选项时要小心,因为它是用户覆盖。
set_directive_dataflow(pragma HLS dataflow)
Description
指定对函数或循环执行dataflow优化,以改进RTL实现的并发性。
作用对象:函数或循环
在C描述中,所有操作都是按顺序执行的。在没有任何限制资源的指令(例如set_directive_allocation)的情况下,Vivado HLS试图最小化延迟并提高并发性。
数据依赖关系可以限制这一点。例如,访问数组的函数或循环必须在完成所有对数组的读/写访问之前完成。这可以防止下一个使用数据的函数或循环开始操作。
函数或循环中的操作可以在前一个函数或循环完成其所有操作之前开始操作。
当指定dataflow优化时,Vivado HLS:
- 分析顺序函数或循环之间的数据流。
- 寻求创建通道(基于pingpong RAMs或FIFOs),允许消费者functions or loops在生产者functions or loops完成之前开始运行。
这使得函数或循环可以并行运行,依次为:
- 减少延迟
- 提高RTL设计的吞吐量
如果没有指定启动间隔II(从一个函数或循环的开始到下一个的周期数),Vivado HLS将尝试最小化启动间隔并在数据可用时立即启动操作。
Syntax
set_directive_dataflow <location>
• <location> is the location (in the format function[/label]) at which dataflow optimization is to be performed.
Pragma
将pragma放在C源代码中所需位置的边界内。
#pragma HLS dataflow
Examples
指定函数foo中的dataflow优化。
set_directive_dataflow foo
#pragma HLS dataflow
set_directive_stream(pragma HLS STREAM)
作用对象:数组
默认情况下,数组变量被实现为RAM:
- 顶级函数array参数被实现为一个RAM接口端口。
- 一般arrays是作为ram实现读写访问的。
- 在dataflow优化涉及的子函数中,数组参数是使用RAM乒乓缓冲通道实现的。
- 在基于loop的dataflow优化中涉及的数组被实现为一个RAM乒乓缓冲通道。
如果数组中的数据是按顺序使用或产生的,则更有效的通信机制是使用流式数据,使用fifo而不是ram。
当将顶级函数的参数指定为接口类型ap_fifo时,数组将自动实现为流。
IMPORTANT! 为了保留访问,可能需要使用volatile限定符来防止编译器优化(特别是死代码消除)。?
Syntax
set_directive_stream [OPTIONS] <location > <variable>
- <location>是包含数组变量的location(在format函数[/label]中)。
- <variable>是要作为FIFO实现的数组变量。
Options
-depth <integer >
Note: 只适用于dataflow通道中的array streaming。
默认情况下,RTL中实现的FIFO的深度与C代码中指定的数组大小相同。这个选项允许修改FIFO的大小。
当数组在DATAFLOW区域中实现时,通常使用-depth选项来减小FIFO的大小。
例如,在一个所有循环和函数都以II=1的速率处理数据的数据流区域中,不需要大型FIFO,因为数据是在每个时钟周期中产生和使用的。在这种情况下,可以使用-depth选项将FIFO大小减少到2,从而大大减少RTL设计的面积。
config_dataflow -depth命令为DATAFLOW区域中的所有数组提供了相同的功能。set_directive_stream -depth 覆盖了使用config_dataflow指定的默认值。
优先级:set_directive_stream> config_dataflow
-dim
指定要流式传输的数组的维度。默认是维度1。对于一维数组,将dim设置为1。对于二维数组,将dim设置为2。??对于具有N维的数组,指定为从0到N的整数。
维度只能为dataflow区域内的使用者和生产者模型之间的设计内部流指定。它不能应用到设计接口的流。
-off
Note:仅与dataflow通道中的数组streaming相关。
config_dataflow -default_channel fifo命令意味着在设计中的所有数组上都有一个set_directive_stream。该选项允许在特定的数组上关闭streaming(并默认返回使用基于RAM pingpong缓冲区的通道)。Note:如果选择了off选项,-depth选项将设置乒乓球的深度(块数)。深度至少为2。
Pragma
将pragma放在C源代码中所需位置的边界内。
#pragma HLS stream variable=<variable> \ off \ depth=<int>
Examples
在函数foo中指定数组A[10作为streaming,并实现为FIFO。
set_directive_stream foo A
#pragma HLS STREAM variable=A
函数foo中的循环loop_1中的数组B被设置为streaming,FIFO深度为12。在本例中,将pragma放在loop_1中。
set_directive_stream -depth 12 foo/loop_1 B
#pragma HLS STREAM variable=B depth=12
数组C已禁用流。在本例中,假设启用了config_dataflow
set_directive_stream -off foo C
#pragma HLS STREAM variable=C off