網(wǎng)站建設(shè)付款方式河南百度seo
分析最壞路徑
??通過前面對TimeQuest軟件的理解,基本上可以找到關(guān)鍵路徑,此文章主要對關(guān)鍵路徑時序進行優(yōu)化,使設(shè)計達到時序要求,以TFT屏驅(qū)動為案例,介紹插入寄存器優(yōu)化時序的方法;
??將TFT_CTRL設(shè)置為頂層之后,ctrl+L對工程進行全編譯;
??全編譯之后打開TimeQuest,讀取網(wǎng)表,Read SDC之后,查看最高頻率為270.12MH,顯然無法達到默認時鐘1000MHZ,但是這就是設(shè)計的最高頻率了?不能在提升了?當然可以提升。
??查看最壞傳輸路徑:
??可以在報告界面,直接選中 vcounter[2]這個節(jié)點,然后鼠標右擊,依次選擇“Locate-> Locate in Design File”來定位到該路徑對應在代碼中的位置,如下圖所示:
??點擊后,軟件會自動跳轉(zhuǎn)到代碼的第 85 行,如下圖所示。在此可以看到,vcount_r的變化是受 hcount_ov 和 vcount_ov 控制的,而 vcount_ov 則是跟隨 vcount_r 的值變化的。所以起點和終點就都找到了。
??在上述路徑中,vcount_r 信號要想影響到 vcount_r 的變化,首先是經(jīng)過一級組合邏輯構(gòu)成的比較器,在該比較器中,與一個常量(vline_end)做比較,當兩者相等時,輸出為 1,其他情況下為 0,輸出的信號名為 vcount_ov。vcount_ov 的值才來決定 vcount_r 的值是否變化,因此,整個傳輸路徑可以總結(jié)為下圖:
??通過上圖可以看到,vcount_r[3]要驅(qū)動 vcount_r[2]發(fā)生變化。中間一定要經(jīng)過一級組合邏輯,既然經(jīng)過了組合邏輯,就一定會引入組合邏輯延遲。而且,整個的路徑其實不止這一個組合邏輯,事實上,vcount_ov 有效后,具體 vcount_r[2]是否發(fā)生變化,還與 vcount_r 這個寄存器中的其他位的值相關(guān),所以理論上應該是 vcount_ov 信號還會再進入下一級組合邏輯中參與運算,然后才能最終決定 vcount_r[2]的值是否發(fā)生變化。這個組合邏輯在圖中被放置在了與 D 觸發(fā)器 vcount_r[2]同一個 LE 內(nèi),這種情況下理論來說延遲是最小的,但是事實上很可能這個組合邏輯并不會與 D 觸發(fā)器 vcount_r[2]放置在同一個 LE 內(nèi),那樣的話,延遲就更大了。所以,整個傳輸路徑中至少有 2 級組合邏輯延遲,因為加入了產(chǎn)生 vcount_ov 這個信號的組合邏輯,導致傳輸延遲變長了。既然這樣,只需要將vcount_r[3]到 vcount_r[2]之間的組合邏輯減少,應該就能提升最大運行時鐘頻率了。
RTL 級路徑優(yōu)化
??如何優(yōu)化路徑呢?優(yōu)化路徑的指導思路又是什么呢?其實思路很簡單,核心思路就是減少寄存器到寄存器之間的組合邏輯鏈路。本例中 vcount_r[3]要驅(qū)動 vcount_r[2],中間至少經(jīng)歷兩級組合邏輯,如果能夠?qū)⒓拇嫫鞯郊拇嫫髦g的組合邏輯數(shù)量減少一級,是不是就能提升運行的時鐘頻率了呢?
??vcount_r[3]的輸出傳遞到 vcount_r[2],首先是經(jīng)歷了一級 LUT 實現(xiàn)的查找表,然后查找表的輸出再進入另一個查找表,最后才到達 vcount_r[2],那么,如果能夠讓第一級查找表輸出后,也經(jīng)過 D 觸發(fā)器后再送往下一級查找表,那么整個路徑就被切為了兩段,每段路徑都只包含 1 級組合邏輯了,那樣的話,傳輸延遲就會小很多了。如下圖所示:
??通過此圖可以看到,vcount_ov 不再是直接由 LUT 直接輸出,而是 LUT 之后馬上進入了該 LE 的 D 觸發(fā)器中,再由 D 觸發(fā)器輸出。也就是說,此種方式是在原本的時序路徑中,插入了一級寄存器,從而將原本較長的組合邏輯鏈路路徑切割為了兩段較短的組合邏輯路徑。從而讓寄存器到寄存器之間的傳遞組合邏輯延遲更短,提升了系統(tǒng)運行頻率。
??看上去好像很有道理的樣子,那這個操作在原本代碼工程中該怎么修改才能實現(xiàn)呢?其實方法非常簡單,只需要將 vcount_ov 的產(chǎn)生語句改為時序邏輯即可,當然不要忘記了將該信號的定義也由 wire 改為 reg。具體修改內(nèi)容為:
??1、 代碼 49 行,“wire vcount_ov”改為“reg vcount_ov”,如下圖所示:
2、代碼 94 行對 vcount_ov 的 assign 賦值語句采用注釋的方式屏蔽掉,加上新的時序邏輯描述的代碼,如下圖所示:
??這里將組合電路改為時序電路,vcount_ov 是會延遲一個時鐘周期的,為什么不把條件vcount_r ==vline_end 改為vcount_r ==vline_end -1去彌補這一個時鐘周期?因為 vcount_r 的變化不是每個時鐘都有可能的,只有在 hcount_r 每計滿一次才會變化一次,所以這一個時鐘周期的延遲沒有影響。
??那么,上述操作真的就能提升系統(tǒng)性能嗎?能提升多少呢?這個嘛,就可以通過修改設(shè)計后重新編譯,再對設(shè)計進行時序分析來知曉了。全編譯之后再看一下,結(jié)果如下所示:
??300.48MHZ???哈哈,一頓操作猛如虎,之前是270.12MHZ,現(xiàn)在是 300.48MHZ,提升了近 30MHzZ了。
??首先來說,經(jīng)過這一波操作,確實沒有明顯提升最大運行主頻,但是這并不代表此方法錯了,或者說此方法是沒用的,只能說操作還沒完。時序分析和約束的過程是一個“約束—>分析—>再約束/修改—>再分析”的往復循環(huán)的過程,一次操作只能解決部分問題,當執(zhí)行了修改之后,也許之前的關(guān)鍵路徑解決了,但是馬上又會有新的路徑成為關(guān)鍵路徑,需要再對新的關(guān)鍵路徑進行分析,直到最后滿足設(shè)計需求或者再也無法優(yōu)化。既然如此,那就繼續(xù)分析吧,看看經(jīng)過修改之后,成為新的影響系統(tǒng)運行時鐘頻率的關(guān)鍵路徑是哪個。
??通過查看 Worst-Case Timing Paths 下面的 Setup ‘Clk9M’選項,可以看到,此次 vcount_r到vcount_r的這條路徑,已經(jīng)沒有提示時序余量為負了,甚至都沒有出現(xiàn)在Worst-Case Timing Paths 里面,那么這里,我想留個疑問在這里,供有心的童鞋去思考:此時,hcount_r 到 vcount_r的余量是多少,該怎么看,或者,問個更意外的問題,該條路徑是否還在?本筆記不對該問題作答,僅供有心的童鞋去思考。
??此次 vcount_r 到 vcount_r 的這條路徑,已經(jīng)沒有提示時序余量為負了,時序余量最小的路徑是hcount_r[4]到 vcount_r[3],該路徑時序余量為-2.328。
??定位到該路徑相關(guān)的代碼位置,經(jīng)過分析發(fā)現(xiàn),vcount_r 的計數(shù)條件除了和 vcount_ov相關(guān)以外,還和 hcount_ov 相關(guān),而 hcount_ov 的產(chǎn)生方法和 vcount_ov 的完全一致,也是使用的組合邏輯直接產(chǎn)生的。
??既然這樣,那就借鑒前面優(yōu)化 vcount_ov 的思路,使用同樣的方法把 hcount_ov 也優(yōu)化了,既把 hcount_ov 的產(chǎn)生也改寫為時序邏輯。
??1、 代碼 48行,“wire hcount_ov”改為“reg hcount_ov”,如下圖所示:
??2、代碼 79 行對 hcount_ov 的 assign 賦值語句采用注釋的方式屏蔽掉,加上新的時序邏輯描述的代碼,如下圖所示:
??至于圖中為啥是 hpixel_end – 1 而不是原來的 hpixel_end ,因為這是寄存器輸出,會有一個時鐘周期的延遲,所以為了和之前沒有修改的時序一致,需要提前一個時鐘周期產(chǎn)生該信號。
??全編譯之后再看一下,結(jié)果如下所示:
??最壞路徑的時序余量為-1.518ns,則:Fmax = 1 / (Tclk - Tslack) = 1 / (1 – (-1.518)) = 397.1406MHZ
??再看下報告里的 Fmax Summary,也是一樣的值:
??此時hcount_r 到hcount_r的延遲已經(jīng)不能夠依靠更改RTL代碼進行優(yōu)化了,只能通過更改觸發(fā)器內(nèi)部結(jié)構(gòu)才能繼續(xù)優(yōu)化,但是這已經(jīng)不是用戶該考慮的問題了;
總結(jié)
??到此為止,已經(jīng)優(yōu)化到了一個比較高的程度了,要再優(yōu)化,就要從計數(shù)器的結(jié)構(gòu)入手了,通過修改計數(shù)器的結(jié)構(gòu)來優(yōu)化,這就很燒腦了。對于當前這個代碼,能在 Cyclone IV E 上跑出 393MHz 的頻率,相信大家已經(jīng)很滿意了。所以呢關(guān)于優(yōu)化的內(nèi)容,講到這里,也就基本差不多了。方法很簡單,也就是常說的,插入寄存器大法。