在之前的文章中我们提到了C仿真和C/RTL协同仿真结果的差异,造成这种差异的原因是C/RTL协同仿真使用的是HLS数学库中的函数,而这些可综合的函数采用的是位近似(bit-approximate)的方式,从而引入了精度损失,这种精度损失是相对于C标准库中的函数而言的。那么,能否尽早发现这种精度损失,以判定其是否在设计者可接受的范围之内呢?答案是肯定的。这里我们就来介绍一下第二种方法。
头文件cpp_math.cpp和cpp_math_sw.cpp分别如下图所示。在头文件中引入了HLS自带的数学库:hls_math.h。在定义可综合的顶层函数cpp_math时,特地使用了“hls::“,意在表明此处使用的是HLS数学库中的函数,有别于C标准库中的数学函数,这也就是cpp_math和cpp_math_sw的本质区别。这里,cpp_math_sw作为testbench的一部分添加到Vivado HLS工程文件中,用于提供参考输出(期望输出)。
仍然采用这篇文章中使用的testbench,这样可将超过可接受误差范围的输入角度、真实值、期望值和误差存入到目标文件中。采用上述定义的函数,在C仿真时就可以检查到超过误差允许值的情形,这是因为此时也使用了HLS数学库中的函数,从而在早期就可以发现精度损失。最终实现了C仿真和C/RTL协同仿真结果的一致性。该方法只适合于C++,而不适合于C。
综上所述,对于C标准库中的数学函数,采用Vivado HLS综合时,建议直接使用HLS数学库提供的函数,这样可以在C仿真时发现精度损失,从而判定这种误差是否在可接受范围内。