fanout,即扇出,指模組直接呼叫的下級模組的個數,如果這個數值過大的話,在fpga直接表現為net delay較大,不利於時序收斂。因此,在寫**時應盡量避免高扇出的情況。但是,在某些特殊情況下,受到整體結構設計的需要或者無法修改**的限制,則需要通過其它優化手段解決高扇出帶來的問題。以下就介紹三個這樣的方法:
首先來看下面這個例項,如圖1所示為轉置型fir濾波器中的關鍵路徑時序報告,在dsp in fpga的fir專題中有介紹轉置型結構fir濾波器輸入資料的扇出較大,在圖1中所示為11,因此net delay高達1.231ns。如圖2所示,輸入資料驅動了11個dsp48e1。
在沒有優化情況下,該設計的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" *)屬性避免被優化。
綜合實現後得到時序報告如圖4所示,該資料路徑上輸入資料fanout減為2,對應net delay也減小到了0.57ns。得到設計如圖5所示,與期望的相同,複製了4個暫存器來分擔fanout。經過暫存器優化後得到fmax:252.143mhz
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
通常bufg是用於全域性時鐘的資源,可以解決訊號因為高扇出產生的問題。但是其一般用於時鐘或者復位之類扇出超級大的訊號,此類訊號涉及的邏輯遍布整個晶元,而bufg可以從全域性的角度優化佈線。而且一塊fpga晶元中bufg資源也有限,在7k325tffg900上也僅有32個,如果用於普通訊號的高扇出優化也不大現實。因此,在時鐘上使用bufg是必須的,但是如果設計中遇到某些復位訊號因高扇出產生的時序問題時,可以在此訊號上使用bufg來優化。
綜上,在遇到訊號高扇出時,對於普通訊號可採用暫存器複製或者設定max_fanout屬性優化;而對於復位訊號,可加入bufg優化。
如何解決併發
雖然從巨集觀上,處理器是並行處理多項任務,但本質上乙個處理器在某個時間點只能處理乙個任務,屬於序列執行。在單處理器的情況下,併發問題源於多道程式設計系統的乙個基本特性 程序的相對執行速度不可 它取決於其他程序的活動 作業系統處理中斷的方式以及作業系統的排程策略。在分布式環境下,併發產生的可能性就更大...
如何解決藍屏問題
第一步 公升級筆記本bios 一般說來筆記本在出廠的時候很可能設計上存在某些的瑕疵,而廠商通常會採用公升級bios的方法來解決這些bug。如果我們在使用筆記本腦的過程中遇到了藍屏的情況,那麼我們可以採取公升級bios的辦法來解決藍屏的故障。第二步 正確安裝硬體驅動 在重新整理了bios以後,部分筆記...
如何解決「重複定義」
標頭檔案中一般只包含宣告,不包含變數的定義,如果沒辦法必須在標頭檔案中包含定義的話,多次引用該標頭檔案時,常遇到函式或者變數被重複定義的錯誤,比喻file1.h中定義了int a file2.h中也定義了 int a 此時在file.c中既包含file1.h也包含file2.h,在預編譯是,file...