FPGA優化之高扇出


  Fanout即扇出,模塊直接調用的下級模塊的個數,如果這個數值過大的話,在FPGA直接表現為net delay較大,不利於時序收斂。因此,在寫代碼時應盡量避免高扇出的情況。但是,在某些特殊情況下,受到整體結構設計的需要或者無法修改代碼的限制,則需要通過其它優化手段解決高扇出帶來的問題。以下就介紹三個這樣的方法

   首先來看下面這個實例,如圖1所示為轉置型FIR濾波器中的關鍵路徑時序報告,在DSP in FPGA的FIR專題中有介紹轉置型結構FIR濾波器輸入數據的扇出較大,在圖1中所示為11,因此net delay高達1.231ns。如圖2所示,輸入數據驅動了11個DSP48E1。

 

圖1

 

圖2

 在沒有優化情況下,該設計的fmax:206.016MHz       

1、寄存器復制

  寄存器復制是解決高扇出問題最常用的方法之一,通過復制幾個相同的寄存器來分擔由原先一個寄存器驅動所有模塊的任務,繼而達到減小扇出的目的。通過簡單修改代碼,如圖3所示,復制了4個寄存器:din_d0、din_d1、din_d2、din_d3,din_d、din_d0、din_d1、din_d2分別驅動2個DSP48E1,din_d3驅動3個DSP48E1。其中在代碼中為防止綜合器優化相同寄存器,在對應信號上加入了(* EQUIVALENT_REGISTER_REMOVAL="NO" *)屬性避免被優化

 

圖3

  綜合實現后得到時序報告如圖4所示,該數據路徑上輸入數據fanout減為2,對應net delay也減小到了0.57ns。得到設計如圖5所示,與期望的相同,復制了4個寄存器來分擔fanout。經過寄存器優化后得到fmax:252.143MHz

 

圖4

 

圖5

2、max_fanout屬性

      在代碼中可以設置信號屬性,將對應信號的max_fanout屬性設置成一個合理的值,當實際的設計中該信號的fanout超過了這個值,綜合器就會自動對該信號采用優化手段,常用的手段其實就是寄存器復制。屬性設置如下代碼所示:

(* max_fanout = "3" *)reg  signed [15:0] din_d;

         將din_d信號的max_fanout屬性設置成3,經過綜合實現后,得到時序報告如圖6所示,其中fanout只有2,相應的net delay也只有0.61ns,自動優化效果還不錯。結構如圖7所示,其中din_d_12_1、din_d_12_2、din_d_12_3是綜合器優化后自動添加,即實現了寄存器復制功能。經過設置max_fanout屬性優化后得到fmax:257.135MHz

 

圖6

 

圖7

3、BUFG

         通常BUFG是用於全局時鍾的資源,可以解決信號因為高扇出產生的問題。但是其一般用於時鍾或者復位之類扇出超級大的信號,此類信號涉及的邏輯遍布整個芯片,而BUFG可以從全局的角度優化布線。而且一塊FPGA芯片中BUFG資源也有限,在7k325tffg900上也僅有32個,如果用於普通信號的高扇出優化也不大現實。因此,在時鍾上使用BUFG是必須的,但是如果設計中遇到某些復位信號因高扇出產生的時序問題時,可以在此信號上使用BUFG來優化。

         綜上,在遇到信號高扇出時,對於普通信號可采用寄存器復制或者設置max_fanout屬性優化;而對於復位信號,可加入BUFG優化。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM