開發定點(fixed-point)算法時,通常需要在設計功能性、數字精度建模、及驗證(仿真)速度之間取得一個平衡。現在,一種新的數據類可使此過程簡單化,由此得到更簡單精確的建模精度、更好的數字求精、及更快的驗證周期,而ANSI C/C++正是開發這種數字求精算法的最佳語言。
某此算法天生就適用於操作整數,或那些理想中的實數(如數字濾波器的系數),它們也可能會使用浮點或定點類型。一般而言,在算法開發的早期階段,會經常用到C語言的float或double浮點類型,因為它們可提供一個非常大的動態數據范圍,且對大多數程序來說都是適用的。見圖1:
使用C內置的float類型來建模一個FIR濾波器
算法可進行數字求精,以便使用定點算術來降低最終硬件或軟件實現的復雜性。在硬件方面,將整數或定點算術限制為最小位寬,可在本質上滿足性能、空間、能耗的需要;如果實現中用到了DSP處理器,那麼把算法限制為整數或定點算術,就可為特定程序使用盡可能便宜的處理器。
定點算術的建模可通過C語言內置的浮點或整數類型來完成,這做的話,需要顯式編碼並受限於C中浮點數及整數可表示的最大數:64位整數或53位尾數;這些都會給操作數的位寬帶來更多的限制,例如,2個33位的數相乘,會超過64位C整數可表示的范圍。圖2演示了一個FIR濾波器的例子,但temp變量限制為15位的定點精度,其中10位用於整數位。在這個實現中,LSB的右部位被捨棄(量化模型的截斷),而MSB的左部位也被捨棄(包裝的溢出模型),應該意識到,使用float(或double)的模型在精度上是受限的,且不能再次合成(synthesis)。同樣,由於有取整模型的嚴格位精度定義有先,又由於內置浮點類型的取整將會先被應用,所以對除法這樣的操作來說,就非常難實現了。
使用float建模定點行為
當許多算法都能依賴本地C數據類型的精度來編寫時,對支持任意長度的整數及定點算法,大家就會抱有極大的期望,而硬件描述語言(HDL)如VHDL,走的也是同一條路。隨著C/C++越來越多地被用於高級合成與驗證工具(High-Level Synthesis and Verification tools),也證明了這種語言本質上有一個足以滿足當前及未來程序需要的數據類型庫。任意長度類型的支持,也可使數據類型的行為有一個統一的定義,而統一的語義則避免了人工實現上的一些限制。
算法C數據類型
算法C數據類型是一種基於類的C++庫,其實現了任意長度的整數及定點類型,而這些可自由訪問的類型有一系列好處,包括統一及良好定義的語義,還有媲美C/C++內置數據類型的運行時速度,對比SystemC中相應的類型,其運行速度也超過10倍以上。這些數據類型能用於任何符合C++或SystemC規范標准的程序中,並擁有高度可合成的語義。
語義
語義的統一性與一致性是避免在算法中,發生功能性錯誤的關鍵,以下的例子,也說明了這點: