在之前的文章中我們提到了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仿真時發現精度損失,進而判定這種誤差是否在可接受範圍内。