set_directive_dependence - 2023.2 简体中文

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

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

描述

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 项输入从不采用相同索引)之类的情况下,依赖关系分析可能过于保守,无法滤除假性依赖关系。set_directive_dependence 命令允许您显式定义依赖关系并消除假性依赖关系。

重要: 如果依赖关系并非假性 (false) 关系,那么指定假性依赖关系可能导致硬件错误。指定依赖关系前,请确认它是否正确(true 或 false)。

语法

set_directive_dependence -dependent <arg> [OPTIONS] <location>
-dependent (true | false)
指定该实参可用于指示依赖关系如为 true 则需要强制实施,如为 false 则应移除。但如果不指定该实参,则工具将返回警告,称未指定该值,并且假定值为 false
<location>
表示代码中定义依赖关系的位置,指定方式为 function[/label]

选项

-class (array | pointer)
指定需要澄清其中所含依赖关系的变量的类。该选项与 -variable 选项互斥。
-dependent (true | false)
指定需强制实施依赖关系 (true) 还是移除依赖关系 (false)。
-direction (RAW | WAR | WAW)
注释: 仅与循环进位依赖关系有关。
指定依赖关系的方向:
RAW(先写后读 - 真性依赖关系)
写指令使用的值供读指令使用。
WAR(先读后写 - 反依赖关系)
读指令获取的值被写指令覆盖。
WAW(先写后写 - 输出依赖关系)
2 条写指令按顺序写入相同位置。
-distance <integer>
注释: 仅与循环进位依赖关系有关,其中 -dependent 设置为 true
指定阵列访问的迭代间距离。
-type (intra | inter)
指定依赖关系:
  • 位于相同循环迭代内 (intra),或者
  • 位于不同循环迭代之间 (inter)(默认值)。
-variable <variable>
定义特定变量,以供应用依赖关系指令。该选项与 -class 选项互斥。
重要: 对于与 m_axi 接口内其他实参捆绑的函数实参,不能指定 dependence。这是函数上的 m_axi 接口的默认配置。并且除非结构体已解聚,否则也不能为结构体的元素指定依赖关系。

示例

移除 func 函数的 loop_1 的相同迭代中的 Var1 之间的依赖关系。

set_directive_dependence -variable Var1 -type intra \
-dependent false func/loop_1

func 函数的 loop_2 中的所有阵列的依赖关系将告知 Vitis HLS,在相同循环迭代内,所有读操作都必须发生在写操作之后

set_directive_dependence -class array -type intra \
-dependent true -direction RAW func/loop_2