描述
提示: 此编译指示或指令在 DSP 多重运算匹配(MULADD、AMA、ADDMUL 和相应的减法运算)中不起作用。事实上,使用 BIND_OP 为 DSP 分配运算符会妨碍 HLS 编译器匹配多重运算表达式。如需了解更多信息,请参阅 DSP 多重运算匹配。
Vitis HLS 使用特定实现来实现代码中的运算。set_directive_bind_op
命令用于指定针对每个指定的变量,都应将一项运算(mul
、add
、sub
)映射到特定器件资源,以便在 RTL 内实现 (impl
)。如果不指定此命令,Vitis HLS 就会自动判定要使用的资源。
例如,您可使用 set_directive_bind_op
命令来指明在器件互连结构内(而不是在 DSP 内)实现一项特定乘法器运算 (mul
)。
您也可以使用 -latency
选项来指定运算的时延。
重要: 要使用
-latency
选项,运算必须具有 1 个可用的多阶段实现。HLS 工具可为所有基本算术运算(加减乘除)和所有浮点运算提供 1 个多阶段实现。语法
set_directive_bind_op [OPTIONS] <location> <variable>
-
<location>
是包含变量的位置(格式为function[/label]
)。 -
<variable>
是要分配的变量。在此例中,定义的变量就是该指令的目标运算结果所分配到的变量。
选项
-
-op <value>
- 用于定义要绑定到特定实现资源的运算。受支持的函数运算包括:
mul
、add
和sub
-
-impl <value>
- 定义用于指定运算的实现。
-
-latency <int>
- 定义运算的实现的默认时延。有效的时延值因指定的
op
和impl
而异。默认值为 -1,即交由 Vitis HLS 选择时延。
运算 | 实现 | 最小时延 | 最大时延 |
---|---|---|---|
add | fabric | 0 | 4 |
add | dsp | 0 | 4 |
mul | fabric | 0 | 4 |
mul | dsp | 0 | 4 |
sub | fabric | 0 | 4 |
sub | dsp | 0 | 0 |
提示: 比较运算符(如
dcmp
)是在 LUT 中实现的,不得在互连结构外部实现,也不能映射到 DSP,因此无法通过 config_op
命令或 bind_op
命令来配置。运算 | 实现 | 最小时延 | 最大时延 |
---|---|---|---|
fadd | fabric | 0 | 13 |
fadd | fulldsp | 0 | 12 |
fadd | primitivedsp | 0 | 3 |
fsub | fabric | 0 | 13 |
fsub | fulldsp | 0 | 12 |
fsub | primitivedsp | 0 | 3 |
fdiv | fabric | 0 | 29 |
fexp | fabric | 0 | 24 |
fexp | meddsp | 0 | 21 |
fexp | fulldsp | 0 | 30 |
flog | fabric | 0 | 24 |
flog | meddsp | 0 | 23 |
flog | fulldsp | 0 | 29 |
fmul | fabric | 0 | 9 |
fmul | meddsp | 0 | 9 |
fmul | fulldsp | 0 | 9 |
fmul | maxdsp | 0 | 7 |
fmul | primitivedsp | 0 | 4 |
fsqrt | fabric | 0 | 29 |
frsqrt | fabric | 0 | 38 |
frsqrt | fulldsp | 0 | 33 |
frecip | fabric | 0 | 37 |
frecip | fulldsp | 0 | 30 |
dadd | fabric | 0 | 13 |
dadd | fulldsp | 0 | 15 |
dsub | fabric | 0 | 13 |
dsub | fulldsp | 0 | 15 |
ddiv | fabric | 0 | 58 |
dexp | fabric | 0 | 40 |
dexp | meddsp | 0 | 45 |
dexp | fulldsp | 0 | 57 |
dlog | fabric | 0 | 38 |
dlog | meddsp | 0 | 49 |
dlog | fulldsp | 0 | 65 |
dmul | fabric | 0 | 10 |
dmul | meddsp | 0 | 13 |
dmul | fulldsp | 0 | 13 |
dmul | maxdsp | 0 | 14 |
dsqrt | fabric | 0 | 58 |
drsqrt | fulldsp | 0 | 111 |
drecip | fulldsp | 0 | 36 |
hadd | fabric | 0 | 9 |
hadd | meddsp | 0 | 12 |
hadd | fulldsp | 0 | 12 |
hsub | fabric | 0 | 9 |
hsub | meddsp | 0 | 12 |
hsub | fulldsp | 0 | 12 |
hdiv | fabric | 0 | 16 |
hmul | fabric | 0 | 7 |
hmul | fulldsp | 0 | 7 |
hmul | maxdsp | 0 | 9 |
hsqrt | fabric | 0 | 16 |
示例
在以下示例中,指定了使用互连结构逻辑的二阶流水打拍乘法器来为函数 foo
的变量 <c>
实现乘法运算。
int foo (int a, int b) {
int c, d;
c = a*b;
d = a*c;
return d;
}
set_directive
命令如下所示:set_directive_bind_op -op mul -impl fabric -latency 2 "foo" c
提示: HLS 工具会选择用于变量
<d>
的核。