你的FPGA設計有這些缺陷嗎
- 2019 年 12 月 17 日
- 筆記
上期內容:
UltraScale系列FPGA與7系列FPGA時鐘資源有哪些不同
本文關注點:
缺陷1:過高的邏輯級數
缺陷2:過重的流水
缺陷3:直接實例化F7MUX、F8MUX或F9MUX
缺陷4:用LUT實現大位寬數據存儲
FPGA設計,尤其是高速設計即主時鐘頻率超過300MHz,都會或多或少出現時序違例。而時序違例並不是單一的問題,它可能設計中的多個缺陷導致的。本文關注常見的以下幾個設計缺陷。
缺陷1:過高的邏輯級數
所謂邏輯級數(Logic Level)是指時序路徑起點和終點之間的組合邏輯單元的個數,這些邏輯單元可能是查找表(LUT)、進位鏈(Carry Chain)、數據選擇器(F7MUX/F8MUX/F9MUX)等。如下圖所示路徑,其邏輯級數為4。
邏輯級數會清晰地顯示在時序報告中,對於上圖所示時序路徑,其時序報告如下圖所示。圖中紅色方框標記的部分即為邏輯級數,同時也顯示了邏輯級數的構成單元。
邏輯級數過高帶來的後果是組合邏輯延遲很大。如下圖所示的報告,可以看到該時序路徑邏輯級數為15,邏輯延遲(Logic Dealy)為1.319,佔總延遲的13.427%。邏輯級數過大,很大程度上與RTL程式碼風格相關,因此,為降低邏輯級數,通常要從優化程式碼的角度考慮。這種改動通常比較大,建議在設計初期就做好邏輯級數的評估。
缺陷2:過重的流水
對於邏輯級數較高的路徑,典型的優化方法是插入流水暫存器,將組合邏輯打斷。這往往會給很多初學者一個誤導:流水暫存器越多,時序越容易收斂。本質上,這兩者並沒有必然的關係。只能說,在合理範圍內,流水暫存器會對時序收斂帶來一定的好處。過多的流水暫存器,一方面造成輸入到輸出的Latency增大,另一方面也增加了觸發器的利用率。觸發器利用率的增加意味著其控制集(時鐘、使能、複位/置位)很有可能增大,從而可能導致布線擁塞。
缺陷3:直接實例化F7MUX、F8MUX或F9MUX
無論是7系列FPGA還是UltraScale系列FPGA,其SLICE中都包含F7MUX和F8MUX,UltraScale系列FPGA中的SLICE還包含F9MUX。這些MUX在如下情況時會被工具自動推斷而被使用:
一個8:1MUX需要2個LUT和1個F7MUX;
一個16:1MUX需要4個LUT、2個F7MUX和1個F8MUX,其中F8MUX的輸入分別來自於這兩個F7MUX的輸出;
一個32:1MUX需要8個LUT、4個F7MUX、2個F8MUX和1個F9MUX,其中F8MUX的輸入分別來自於這兩個F7MUX的輸出;F9MUX的輸入分別來自於這兩個F8MUX的輸出。
F7MUX、F8MUX、F9MUX都是2:1的MUX,有些工程師覺得沒用這些資源挺可惜,於是就直接通過原語(Primitive)的方式使用,這實際上會造成SLICE埠密度增大,尤其是使用量比較大的時候,最終導致的後果就是布線擁塞。
缺陷4:用LUT實現大位寬數據存儲
SLICEM中的LUT可以用做RAM或ROM,例如,可以存儲濾波器係數、FFT的旋轉因子等。作為一種輕量級的存儲資源,其在速度和功耗上都有一定的優勢。但如果是存儲大位寬的數據,例如位寬為256或1024等,即使深度只有16或32,在高速設計中,仍然建議使用BlockRAM,而不是LUTRAM。畢竟每個LUT只提供1bit輸出,256的位寬意味著至少需要256個LUT,而這些LUT必然分布在不同列的SLICEM中,無論對布線還是時序都會帶來負面影響。
文 | Lauren 圖 | Laur
Copyright @ Lauren的FPGA
轉載事宜請私信 | 獲得授權後方可轉載