FPGA時序優化有哪些竅門?
公司最近在做一個錄音器的項目,老闆讓我負責。但是時序收斂一直是個難題,而且還同時有四個設計。我不想修改RTL代碼,請問有什麼別的方法嗎?
不改代碼的前提下進行時序優化還是比較難的
1.只能通過工具的各種優化選項去試試了,各種組合,廣撒網,如果在時序只是差一點的情況下,應該可以找到一種比較好的策略來收斂。
2.當然還可以通過pblock的方式來進行約束,不過這個如果是大項目,是非常費時間的,因為按照你的想像或者原來跑出來的好的結果上的布局的方式進行劃塊的話,未必能夠取得好的效果,大部分的時間是比原來差,做這個事情這個要非常有耐心才行。
3.還有就是看看有沒有非同步路徑,非同步路徑可以先falsepath掉,這樣讓工具取抓重點。
4.還有就是一些配置信號,如果是在同一個時鐘域,而平常根本不切換,或者切換的很少,或者切換出來一個亂的值,對系統不造成影響,系統可以快速的恢復,這樣可以設置falsepath掉,減輕工具負擔。
5.複位,對於有些數據流水的路徑複位可以去掉。如果代碼都可以不依賴複位,就是不需要系統賦值一個初始狀態,系統業務照樣可以跑起來,就可以全部幹掉。如果嫌這個改代碼麻煩的話,直接通過約束來進行falsepath,不過這樣還是要佔用了很多布線資源,個人還是喜歡刪除複位,感覺很爽。
6.再看看扇出落,在代碼裡面加些降低扇出的約束。
7.有些塊ram和分散式ram之間可以互換,通過部分的分散式ram替換塊ram,降低塊ram的資源佔用率。
8.再看看這塊的性能是不是有冗餘的,什麼是性能冗餘,比如說有塊的處理的性能很低本來可以很低,10m的時鐘就可以處理過來,你非得要用100m的時鐘,那不是自己給自己找麻煩么,有性能冗餘的地方可以降頻率處理。
基本就是把大家前面答得總結了一下
改代碼的話,整體的思路就是retiming和pipline,就是把關鍵路徑進行拆分。這裡大家都講了很多了
1.打拍。不過估計你不願意用。2.手動分配位置,這個不是一定有效
3.打破層級或者物理綜合,或者自動加流水等綜合優化參數調整。
4.根據實際情況使用非同步時鐘策略5.換速度更快的片子一樓回答已到位。
1. 盡量用硬核,比如硬體乘法器,這個應該都知道。
2. 結構上的pipeline,簡言之就是「拆",最極端的情形是拆到源和目的Reg間只有基本的組合邏輯門,比如說~a b之類...;當然FPGA里實際不必這樣,打個比方,兩個xbit的數據做比較,若晶元內是4輸入LUT,若有pipeline的必要,那麼流水級最多用[log4(x)]+1就夠了。
3. 系統上的流水,也就是打拍,副作用是帶來latency;這是最常見的方式之一,但有的情形下不允許。
3. 非同步, 劃分不同時鐘域;比如說系統主體可以工作在100M-,特定的子系統要求必須工作在300M+,那麼可以將特定模塊劃分到不同的時鐘域里;但非同步時鐘域不宜太多。
4. 綜合時使用retiming,duplication;physical synthesis優化,現在的綜合器這方面已經足夠聰明了。
5. 預算允許可使用速度更快的晶元;這個也許是實現 「不修改RTL又時序收斂」 的最可能的方式。
最也進剛剛接手一個對時序要求很高的項目,看到這個問題來說說自己的感受吧。首先我非常贊同 @林名 的說法,因為我也大至是按照這個順序來的。首先如果按照題主的要求來的話,大概就只有兩條路可以走一個是換資源和速度更快的片子,還有就是使用軟體進對每個模塊進行區域的劃分。我當時用的是xilinx V5系列FPGA,和題主一樣我一開始也不想改RTL代碼,所以使用的是planhead對每個模塊進行了區域的劃分。在劃分區域的時候還是有有些技巧的,比如一些介面模塊盡量離晶元引腳更進一些,聯繫比較緊密的模塊放在一起。但是我進行了一個星期的手動調整布局布線和劃分區域,最終發現還是有13個路徑的時序沒有通過,最後還是修改了RTL代碼才把問題解決。所以我是想告訴題主,修改RTL代碼才是關鍵!而且還有一點非常重要,盡量使用FPGA提供的硬核還有多使用狀態機。就比如說我們的代碼里的計數器,選擇器,乘法器等都是用的FPGA 自帶的DSP48E模塊而沒有自己使用代碼去編寫。一般你自己寫的代碼,編譯器編譯後布局布線,是很亂的自己用軟體查看就知道。而FPGA 自帶的內核都是很有規律放在一些指定位置的,所以時鐘頻率可以跑的更快布局布線也更加整齊。
時序不收斂的本質在於兩個寄存器之間的組合邏輯延時超過了時鐘周期T,因此從這兩方面入手。減少組合邏輯延時:1.更快的片子,走線延時更少。2.優化組合邏輯。3.流水線分割組合邏輯。時鐘周期T:降低時鐘頻率。做fpga不去深入底層優化電路水平提不高的。以最少的資源跑最高的性能是工程師的追求。
調節工具的選項就可以進行時序優化,我們就是研究這個方向的。
從理論計算機科學的角度來說,綜合,布局布線的優化屬於一類叫做NP-完全(NP-complete)的演算法。這是最難解決的問題類別之一,因為你必須篩選海量的備選方案來找到最好的哪一個,如果一個工具上有N個選項,把每一種組合都試一遍就是N!種,這很顯然不可能。
但是如果藉助機器學習來找到最好的參數組合,就沒有那麼困難了。其實機器學習解決FPGA時序問題在業內已經被討論了很久,但是我們是第一個將產品做出來並實際應用的。這個軟體(名字叫做InTime)的原理其實可以應用到很多晶元的設計上,不僅僅只針對FPGA,我來簡單講解一下。
拿Quartus舉例,這個工具上大概有80個可選的布爾運算參數,一個參數有開關兩種情況,如果直接把每一個參數一開一關而構成的組合都試一遍來決定一個最好的,那就要試2^80種組合,這根本不可能。我們的想法是利用迭代的方法從無數的組合中選擇出來最好的。我們先並行運行幾十種組合,比如說30種。你可以把總共2^80種組合想像成一個搜索空間,這30種就分布在這個空間的各個位置,大體上把這個空間每一個區域都代表了。並行運行這30種組合算第一輪,然後得出一個最佳的(產生最小的WNS的那一個)。接下來我們從這個最佳組合的周圍再選三十個組合,把它附近的區域都代表了,然後運行第二輪,再得出一個最好的。以此類推進行,進行第三輪,第四輪。一般運行幾輪之後,結果變化就沒那麼顯著了,每一輪最佳組合的WNS趨於穩定,如果等於零,那就證明我們已經找到了最好的參數組合,完成時序收斂。
這就好比現在有一億個來自各行各業的人,已知他們中只有一個人年薪超過百萬,一個沒有任何行業背景知識的研究員,怎麼才能在他們中快速找到這個人呢?他可以從三十個相差較大的樣本行業中每個行業選一個人進行比較,得出結論,金融行業那個人賺的最多,年薪30萬;然後他再從金融行業的30個分支行業中每個行業選一個人進行比較,得出結論,投行的那個人賺的最多,年薪80萬;再然後他從30個投行里每個投行選一個人,最終找到了高盛那個員工,年薪一百萬。這比挨個排查這一億人效率快很多。
你可能也發現了一些問題,比如第一輪就找錯了怎麼辦(沒有找到最終能完成時許收斂的參數組合附近,就好像那個研究員一開始找到的是IT行業的員工)?那麼很顯然你會發現雖然運行幾輪後結果會提高,但是最終怎麼樣也無法完全收斂(WNS=0)。這個時候你就需要換一種選擇組合的方法重新找一遍。我們管這些方法叫做「策略」「;「策略」來自我們之前超過四萬個CPU小時的經驗,它們大概知道對於什麼樣的項目,那些參數影響時序會更明顯,從而對選擇參數組合更有針對性。
對於優化過程的不同階段,我們都有不同的「策略」,這個策略本身可以被看成一種機器學習的資料庫。如果你用這套方法(通過InTime軟體)在自己的多個項目上運行後,這些迭代經驗也形成了一個只屬於你的機器學習資料庫,你運行的次數越多,資料庫就越完備,它越了解你的項目風格和代碼風格,你進行下一次運行得到的結果就會越快越好。
這個時序優化的思路就是這樣,並且我們的方法已經有了很多成功的案例。如果題主有興趣了解更多細節,也可以給我發私信。我們非常樂意幫助各界的朋友解決時序收斂問題。
設置寄存器 MAX FANOUT,同時FALSE 掉一些RESET 信號和非同步時鐘。
每次看到回答時序收斂的問題都要進來看一下,能不能給個例子,讓我看看到底什麼叫時序收斂。。。
1、檢查各種資源的佔比,lutreg超過70%建議升級片子,ramdsp佔比超90%建議盡量優化代碼或升級片子;
2、第一個版本的代碼還是建議先改代碼,不過是有針對性的優化,綜合報時序問題的路徑、組合邏輯級數高的路徑、fanout高的信號等等都是需要優化的;3、再去掉多餘的markdebug、keep ture、don"t tourch等語句,有特殊功能的則保留,要相信現在軟體優化已經很智能了,比人工優化的好;4、代碼改不動的情況下,可以修改編譯參數或編譯選項;不同的編譯器選項參數不一樣,怎麼改問fae、看手冊或上網查;其實最重要的還是寫代碼的時候風格要好,盡量避免時序差的寫法,這裡面文章就更多了。%80的時序不收斂可能造成的因素都和加法器的進位鏈過長有關係 實施超前進位計數(加法)器吧
要熟悉底層,越深越好,比如每個gate的工作原理。拋開流程式執行。
很遺憾,很多情況下修改rtl是最有效、甚至唯一的選擇
拋開代碼空談時序優化,都是耍流氓。看一下是組合邏輯多還是路徑延時大,優化手段完全不一樣。組合邏輯過多,除了改代碼沒什麼辦法。路徑延時大可以打兩拍,或者做下位置約束。
具體問題具體分析,我試過不收斂也能用
推薦閱讀:
※MRAM,CBRAM,PCRAM,RRAM這些新型存儲器能用作內存嗎?
※光電轉化的理論極限速度是多少?
※從電路分析的角度解釋,為什麼 CPU 頻率越高發熱越大?
※凝聚態物理專業,以後想進半導體公司,要做什麼準備,參考什麼書,為以後筆試面試做準備???
※作為一名IC設計工程師,在設計過程中你最依賴EDA工具的哪些功能?
TAG:半導體 | 嵌入式系統 | 現場可編輯邏輯門陣列FPGA |