描述
Vitis HLS 会检测循环内的依赖关系:循环的相同迭代内的依赖关系为独立于循环的依赖关系,循环的不同迭代之间的依赖关系则为循环进位依赖关系。
执行运算调度时,这些依赖关系受到影响,尤其是在函数和循环流水打拍期间。
- 独立于循环的依赖关系
- 在单个循环迭代内访问相同元素。
for (i=1;i<N;i++) { A[i]=x; y=A[i]; }
- 循环进位依赖关系
- 从不同循环迭代内访问相同元素。
for (i=1;i<N;i++) { A[i]=A[i-1]*2; }
在诸如建立变量相关阵列索引或需强制实施外部要求(例如,2 项输入从不采用相同索引)之类的情况下,依赖关系分析可能过于保守,无法滤除假性依赖关系。syn.directive.dependence
命令允许您显式定义依赖关系并消除假性依赖关系。
重要: 如果依赖关系并非假性 (false) 关系,那么指定假性依赖关系可能导致硬件错误。指定依赖关系前,请确认它是否正确(true 或 false)。
语法
syn.directive.dependence=[OPTIONS] <location>
-
<location>
- 表示代码中定义依赖关系的位置,指定方式为
function[/label]
。
选项
-
class=(array | pointer)
- 指定需要澄清其中所含依赖关系的变量的类。该选项与
variable
选项互斥。 -
variable=<variable>
- 定义特定变量,以供应用依赖关系指令。该选项与
class
选项互斥。重要: 对于与m_axi
接口内其他实参捆绑的函数实参,不能指定dependence
。这是函数上的m_axi
接口的默认配置。并且除非结构体已解聚,否则也不能为结构体的元素指定依赖关系。 -
dependent=(true | false)
- 指定该实参可用于指示依赖关系如为
true
则需要强制实施,如为false
则应移除。但如果不指定该实参,则工具将返回警告,称未指定该值,并且假定值为false
。 -
direction=(RAW | WAR | WAW)
-
注释: 仅与循环进位依赖关系有关。指定依赖关系的方向:
-
RAW
(先写后读 - 真性依赖关系) - 写指令使用的值供读指令使用。
-
WAR
(先读后写 - 反依赖关系) - 读指令获取的值被写指令覆盖。
-
WAW
(先写后写 - 输出依赖关系) - 2 条写指令按顺序写入相同位置。
-
-
distance=<integer>
-
注释: 仅与循环进位依赖关系有关,其中指定阵列访问的迭代间距离。
-dependent
设置为true
。 -
type=(intra | inter)
- 指定依赖关系:
- 位于相同循环迭代内 (
intra
),或者 - 位于不同循环迭代之间 (
inter
)(默认值)。
- 位于相同循环迭代内 (
示例
移除 func
函数的 loop_1
的相同迭代中的 Var1
之间的依赖关系。
syn.directive.dependence=variable=Var1 type=intra \
dependent=false func/loop_1
func
函数的 loop_2
中的所有阵列的依赖关系将告知 Vitis HLS,在相同循环迭代内,所有读操作都必须发生在写操作之后。
syn.directive.dependence=class=array type=intra \
dependent=true direction=RAW func/loop_2