这节课主要是关于 C++ 基本运算在 HLS 中的注意事项,C++ 基本运算的语法并不是可以直接完全在 HLS 中应用的。仔细想也能理解,在软件编程中 C++ 特性的易用和高效有很大一部分原因要归功于编译器。而在 HLS 中并没有那么高级的优化处理,因此在编写时需要遵循一些规则。

1. Operators

当我们进行定点数的算术运算时,需要注意位宽的处理。遵循的原则是:大数据不溢出,小数据不损失

没有什么特别的,支持缩写形式

在 Vivado HLS 中,当进行算术运算时,一定要保证运算符两侧的类型是一致的,如果存在不一致一定要手动进行数据类型的转换。因为 Vivado HLS 不支持自动类型转换,不然会报如下错误

对于逻辑运算返回的结果是 True or False,而对于位运算,返回值和操作数的宽度有关系。

2. Case Analysis

这部分主要想让我们明白,使用 HLS 加速算法时需要对算法理解到位,关键部分使用什么资源要做到心里有数,以及实现上根据 HLS 特性做相应的调整。

a. Complex Multiplier

如下实例所示,声明并使用了 complex 这个 library 来实现复数运算。可以看到正常的实现形式会消耗 4 个 multipliers 和 2 个 adders

对公式进行变换,减少了 multiply 的使用,修改后同样的运算变成只使用 3 个加法器

b. Euclidean Algorithm

计算最大公约数的算法(主要是取余运算)

这里采用循环方式来实现

Vivado HLS 不支持递归,提示的报错信息如下所示

3. Summary