执行综合时,Vitis HLS 使用由时钟指定的时序约束、由目标器件指定的时延搭配您指定的任意指令来判定哪些硬件实现将用于代码中的各种运算符。例如,要实现乘法器运算,Vitis HLS 可以使用组合乘法器或者使用流水线乘法器。
综合期间映射到运算符的实现可通过指定 ALLOCATION 编译指示或指令来加以限制,与运算符的方式相同。您无需限制乘法运算总数,而可改为选择限制组合乘法器的数量以强制使用流水打拍乘法器来执行所有剩余乘法(或反之亦然)。
BIND_OP 或 BIND_STORAGE 编译指示或指令用于显式指定哪些实现要用于特定运算或存储类型。以下命令会告知 Vitis HLS 使用二阶流水打拍乘法器,并为变量 c
使用互连结构逻辑。由 Vitis HLS 判定用于变量 d
的实现。
int foo (int a, int b) {
int c, d;
#pragma HLS BIND_OP variable=c op=mul impl=fabric latency=2
c = a*b;
d = a*c;
return d;
}
在以下示例中,BIND_OP 编译指示指定使用 dsp
实现来实现变量 temp
的加法运算。这样可确保在最终设计中使用 DSP 模块原语来实现运算。默认情况下,加法运算是使用 LUT 来实现的。
void apint_arith(dinA_t inA, dinB_t inB,
dout1_t *out1
) {
dout2_t temp;
#pragma HLS BIND_OP variable=temp op=add impl=dsp
temp = inB + inA;
*out1 = temp;
}
请参阅 BIND_OP 或 BIND_STORAGE 编译指示或指令来获取有关可供分配到运算或存储类型的实现的详细信息。
在以下示例中,BIND_OP 编译指示指定使用 3 阶流水打拍乘法器来实现 out1
的乘法。
void foo(...) {
#pragma HLS BIND_OP variable=out1 op=mul latency=3
// Basic arithmetic operations
*out1 = inA * inB;
*out2 = inB + inA;
*out3 = inC / inA;
*out4 = inD % inA;
}
如果赋值指定多个相同的运算符,则必须修改此代码以确保针对要控制的每个运算符都存在单一变量。例如,在以下代码中,如果首个乘法 (inA * inB
) 要以流水打拍乘法器来实现:
*out1 = inA * inB * inC;
那么应使用 Result_tmp
变量上指定的编译指示来将代码更改为:
#pragma HLS BIND_OP variable=Result_tmp op=mul latency=3
Result_tmp = inA * inB;
*out1 = Result_tmp * inC;