HLS Learning P7 - C++ Basic Operator
这节课主要是关于 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
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.