本文繼續(xù)講解時序約束的第四大步驟——時序例外。
首先看一下圖1,最后一步才進(jìn)行時序例外的相關(guān)約束。再講一下步驟,第一步是時鐘約束,這一步會影響FPGA內(nèi)部時序,第二步和第三步也會使用生成時鐘的約束作為參考時鐘約束輸入輸出端口。時鐘約束完內(nèi)部實(shí)際邏輯都沒問題之后,第二步是input delay,第三步是output delay,這兩步是對FPGA外圍的接口進(jìn)行約束。在外圍接口約束都做好之后,才做最后一步,時序例外。
圖1 時序約束步驟
時序例外就是指有些時序路徑是不需要約束的,要把force掉的,或者有些情況是很特殊的。
時序例外做好之后,基本上項目就是完工的一個階段。時序例外一般有幾種情況,第一個是多周期的路徑,第二個是不需要檢查路徑,一般要把這個路徑force掉,而不需要檢查路徑又有三種情況,一種是常亮或偽常亮,第二種是互斥的路徑或時鐘,第三種是異步的時鐘。最后是純組合邏輯延時。
第1節(jié) 多周期路徑
1.1、概述
第一種多周期的路徑顧名思義,多周期路徑其實(shí)就是指某個電路路徑不可能在一個時鐘周期內(nèi)完成,需要多個時鐘周期才能得到正確結(jié)果,這時需要告知綜合軟件哪條路徑需要幾個時鐘周期才能得到正確結(jié)果,綜合軟件根據(jù)約束條件對相應(yīng)路徑進(jìn)行調(diào)整,常見的就是乘法器之類的。
1、多周期約束改變默認(rèn)的setup和hold的默認(rèn)檢查方式。
2、設(shè)計中有些邏輯并不要求在單周期內(nèi)完成穩(wěn)定采樣,在寄存器間不是按照連續(xù)時鐘周期改變的時候就多時鐘周期路徑問題。
-通常出現(xiàn)在存在時鐘使能信號的情況。
-從源寄存器、目的寄存器要求數(shù)據(jù)更新的時間是N個時鐘周期
3、可以使得工具關(guān)注于更加難滿足timing的path,便于時序收斂;工具更加關(guān)注于真實(shí)的關(guān)鍵路徑。
圖2就是一個N個時鐘周期的例子:
圖2 多周期約束實(shí)例
1.2、創(chuàng)建多周期路徑例外
多周期路徑通過set_multicycle_path命令進(jìn)行定義:
set_multicycle_path
?
標(biāo)志識別哪些路徑使用多周期約束命令,可以使用-from、-through和-to。
? 決定靜態(tài)時序檢查的類型,是建立時間還是保持時間。
? 決定multicycle 路徑有多少個時鐘周期。
如上面兩段代碼,分別表示對建立時間和保持時間進(jìn)行約束,其中從寄存器C到寄存器D的路徑建立時間約束為需要兩個時鐘周期,保持時間需要1個時鐘周期。
1.3、常規(guī)的建立保持時間檢查
靜態(tài)時序路徑就是從一個時鐘的元素開始和結(jié)束,并且是同一個時鐘驅(qū)動的周期內(nèi),如圖3所示。
圖3 常見的建立時間、保持時間檢查規(guī)則
—建立時間檢查在啟動時鐘邊緣后的目標(biāo)1個時鐘周期執(zhí)行,也就是建立時間的發(fā)射沿launch edge和捕獲沿capture edge一般情況下相差一個時鐘周期。
—保持時間檢查在啟動時鐘后的目標(biāo)0時鐘周期執(zhí)行,保持時間的發(fā)射沿launch edge和捕獲沿capture edge一般是重合的,后面講保持時間概念時就清楚了。
而進(jìn)行多周期約束后,這些路徑的建立時間和保持時間檢查規(guī)則會發(fā)生相應(yīng)的改變,因為需要多個時鐘周期才能完成相應(yīng)的計算,那么建立時間的檢查要求也就會對應(yīng)的增加。
如下面約束:
上面代碼把寄存器C到寄存器D的路徑設(shè)置為N個時鐘周期,那么捕獲沿setup capture edge 相對于發(fā)射沿launch edge會延遲N個時鐘周期,如圖4所示。其實(shí)不對建立時間進(jìn)行多周期約束時,就是N=1。
圖4 N周期建立時間多周期約束
默認(rèn)情況下保持時間的檢查規(guī)則只會比建立時間的檢查規(guī)則少一個時鐘周期,這是在進(jìn)行多周期約束時需要考慮的,如果寄存器C到寄存器D的路徑只做了上面的N個時鐘周期的建立時間約束,那么保持時間約束的檢查規(guī)則將還是默認(rèn)的,即保持時間的檢查規(guī)則會變?yōu)镹-1個時鐘周期,如圖5所示:
圖5 不對保持時間約束的檢查規(guī)則
根據(jù)保持時間的概念,很明顯圖5的檢查規(guī)則是錯誤的,原因是保持時間的目的是讓下一個時鐘的數(shù)據(jù)不會來得太快,將目前的有效數(shù)據(jù)刷新,導(dǎo)致數(shù)據(jù)丟失。為了彌補(bǔ)這個錯誤,還需要對相同路徑的保持時間進(jìn)行約束,使得保持時間的檢查規(guī)則依舊為0個時鐘周期。對應(yīng)的命令如下:
上述命令會讓該路徑保持時間捕獲沿提前N-1個時鐘周期,與發(fā)射沿重合,如圖6所示
圖6 路徑保持時間約束之后檢查規(guī)則
上面只是一些簡單的使用方式,多周期約束還可以用來調(diào)節(jié)信號的相位,比如SDRAM的接口時鐘與內(nèi)部工作時鐘的相位關(guān)系,一般是將一個時鐘經(jīng)過反相器之后,相位相差90°的兩個時鐘分別作為接口時鐘和內(nèi)部工作時鐘,其實(shí)這個步驟還可以使用多周期約束完成。
其實(shí)多周期約束在很多時候都是可以通過程序設(shè)計解決的,比如在程序中添加一些指示信號,或者打拍來完成多個周期的等待。所以明德?lián)P一般不會用多周期約束,都是在程序設(shè)計時就會去考慮和解決這些問題,也推薦大家在設(shè)計時就去考慮這些延遲問題,不要等最后的時序約束才解決這些問題。
第2節(jié) 不需要檢查路徑
第二個不需要檢查路徑是重點(diǎn)講解的內(nèi)容,什么是不需要檢查路徑呢?第一種就是常量或偽常量信號。
什么叫常量或偽常量信號?比如一個單bit信號一般會有高低兩種電平,會存在電平變換。但是也會存在一些信號會被賦值成常數(shù),一直為高電平或者低電平,電平狀態(tài)不會改變。所以通過其它時鐘、跨時鐘域處理的時候,其實(shí)是不需要處理的。因為它不會變,那在其他時鐘上升沿時,該信號是不會變的,建立時間和保持時間是一直滿足的,就不會有壓穩(wěn)態(tài)。這種情況下,該信號不會存在時序不滿足的情況,常量或偽常量信號是不需要對它進(jìn)行約束的,可以把它排除掉。
第二種是互斥的路徑或時鐘,其實(shí)就是雙向端口,即雙向端口inout 類型的端口,其輸入路徑與輸出路徑其實(shí)是沒有關(guān)系的,故把它排除掉。
第三種是異步的時鐘,是最常見的,也是FPGA肯定會用到,也一定要排除掉的。而且在任何一個項目里面,如果使用多個時鐘,一定會用到的異步時鐘處理。一般都會通過一些跨時鐘域的處理方式之后,就可以做相關(guān)約束了。但把相關(guān)路徑設(shè)置為不需要檢查路徑之前,一定要先對這寫路徑的時鐘已經(jīng)做跨時鐘域處理。比如已經(jīng)打了兩拍,或者通過一個異步FIFO、雙口RAM把它隔離了,否則這時候把它force 掉,就是會出現(xiàn)錯誤。
2.1 常量和偽常量信號
首先是常量或為常量信號,如圖7,數(shù)據(jù)選擇器的S端雖然是一個經(jīng)過觸發(fā)器輸出的信號,但觸發(fā)器REGA的輸入信號一直為零,導(dǎo)致數(shù)據(jù)選擇器的S端也一直為零。只要一直是零,那這個路徑就可以把force 掉,即不用去分析該路徑,包括經(jīng)過這個數(shù)據(jù)選擇器的路徑也是不用分析的。
圖7 實(shí)例
約束語句語法如下:
– set_false_path
–
表示約束的路徑。
– 指定類型-setup 或者 –hold,不指定時建立setup和保持hold檢查都受到影響
所以圖7可以進(jìn)行如下約束:
-set_false_path -from [get_cells REGA]
-set_false_path -through [get_pins_MUXA/I1]
其中第一句表示從REGA輸出的信號都不需要檢查時序,第二句表示綜合軟件對經(jīng)過數(shù)據(jù)選擇器的信號也不需要進(jìn)行時序檢查。
在一般情況下,如果是同一個時鐘,可以也不用約束。但如果在跨時鐘,而又沒有做跨時鐘域處理。其值是永遠(yuǎn)不會變的,就可以通過set false path這種約束方式來告知綜合軟件不用檢查相關(guān)路徑的時序。
2.2 互斥路徑_雙向端口
第二種是互斥路徑,即雙向端口。如圖8的inout類型信號端口示意圖,比如這個D端口是inout類型,那這種路徑哪個是不需要分析的呢?
其實(shí)輸入路徑與輸出路徑對應(yīng)的寄存器是不需要分析的,如圖8中紅色虛線所示路徑是不需要分析的,綠色代表輸出路徑,而藍(lán)色代表輸入路徑,這兩條都是需要綜合軟件分析的,但是紅色是輸出經(jīng)過D端口后到達(dá)輸入寄存器的,所以該路徑是不需要分析的。即從Status經(jīng)過D端口到達(dá)Contorl的路徑是不需要分析的。
圖8 inout類型端口
相應(yīng)的約束語句如下,從Status寄存器,經(jīng)過D端口到達(dá)Control的信號都不需要檢查其時序,其中*表示通配符。
2.3 異步時鐘
第三個異步時鐘,再強(qiáng)調(diào)一下,一般比較大的系統(tǒng),不可避免會有多個時鐘。多個時鐘域下面的信號會存在交互,就會跨時鐘域。綜合軟件在對設(shè)計進(jìn)行綜合和時序分析后,一般會對這些路徑報錯,提示開發(fā)人員這些路徑存在時序違逆。這時候發(fā)現(xiàn)異步時鐘域的信號肯定不能滿足建立時間要求,但是一定要用不同的時鐘,那怎么辦呢?
一般會做異步時序處理,比如通過打兩拍,把亞穩(wěn)態(tài)出現(xiàn)的機(jī)率降低,或者是用異步FIFO、雙口RAM把兩個時鐘域的信號同步。這樣做了異步時鐘域處理之后,綜合軟件仍然會報告這個時序不滿足建立時間保證要求,那怎么辦呢?
這時就可以把這個報告錯誤的路徑給屏蔽掉,就是告知軟件不要去分析了,這段路徑已經(jīng)人為處理過了,時序是沒有問題的,如圖9所示,這個系統(tǒng)會選擇CLK0或者CLK1中的一個作為系統(tǒng)時鐘,很顯然時鐘域CLK0到CLK1之間的路徑是不需要進(jìn)行分析的,可以使用set_false_path進(jìn)行約束。
圖9 多時鐘域信號
這種會存在兩種約束方式,方式一如下,表示綜合軟件從CLK0到CLK1、從CLK1到CLK0的路徑都不需要分析。
set_false_path -from [get_clocks CLK0] -to [get_clocks CLK1]
set_false_path -from [get_clocks CLK1] -to [get_clocks CLK0]
方式二是通過set_clock_groups進(jìn)行約束,如下所示,表示綜合軟件不需要檢查CLK0與CLK1之間的路徑。
set_clock_groups-physically_exclusive -group CLK0 -group CLK1
這樣就可以正確的處理,綜合軟件不去對這些路徑進(jìn)行分析,也就會不會提示錯誤了。但強(qiáng)調(diào)一點(diǎn),首先一定要做異步時序處理,然后才能把這個路徑給force掉。假如沒有做異步時序處理,而綜合軟件報告要說時序出錯了,開發(fā)人員不對時序做處理,而是直接把這個報告給屏蔽掉了,這就是典型的解決不了問題就解決提出問題的人。后續(xù)系統(tǒng)功能出現(xiàn)問題,而綜合軟件報告的錯誤又被屏蔽了,這可能會出現(xiàn)災(zāi)難性后果。所以在使用set_false_path忽略路徑的時候,特別是異步時鐘,要特別小心。要確保真的做了時序處理,才能把相關(guān)路徑force 掉。
語句相對簡單,但非常重要,在不需要檢查路徑類型中,這個是最常見的,也是最重要的,也要小心處理的一種類型。
第3節(jié) 組合電路延時
第三種情況就是組合邏輯延時。組合邏輯延時是什么情況?
假如FPGA的兩個端口,一個作為輸入管腳,一個作為輸出管腳。信號從輸入管腳進(jìn)入之后,會經(jīng)過一些加法器、乘法器、減法器等組合邏輯電路,然直接從輸出管腳輸出。期間不會經(jīng)過時序邏輯電路,即不會經(jīng)過觸發(fā)器,沒有時鐘參與,如圖10所示。
圖10 純組合邏輯傳輸示意圖
中間沒有經(jīng)過任何時鐘的情況,此時需要告知綜合軟件這條路徑的最大傳輸延遲和最小傳輸延遲是多少,即輸入信號最快和最慢傳輸多久能得到輸出。約束如下:
上述語句表示從IN端口到OUT端口最大延遲是8ns,即信號傳輸最慢的時候,需要8ns才能得到輸出。最小延遲是2ns,即信號傳輸最快的時候,只需要2ns就能得到輸出。一般這個延遲都不會很大,應(yīng)該是沒有影響的,也不推薦這種設(shè)計方式。
第4節(jié) 總結(jié)與建議
這是實(shí)際例外的情況,還是按照前面的順序去找到對應(yīng)情況,按要求進(jìn)行約束。
內(nèi)容最多的是多周期路徑,做了簡單的介紹。最核心是設(shè)置異步時序約束的內(nèi)容,簡單但重要且常用。
審核編輯:湯梓紅
-
FPGA
+關(guān)注
關(guān)注
1630文章
21799瀏覽量
606196 -
寄存器
+關(guān)注
關(guān)注
31文章
5367瀏覽量
121221 -
時序約束
+關(guān)注
關(guān)注
1文章
115瀏覽量
13462
發(fā)布評論請先 登錄
相關(guān)推薦
工程師談FPGA時序約束七步法
VIVADO時序約束及STA基礎(chǔ)
FPGA的IO口時序約束分析
時序約束之時序例外約束
【時序約束資料包】培訓(xùn)課程Timing VIVADO
進(jìn)行時序約束的方法都在這里,趕緊收藏
![進(jìn)行<b class='flag-5'>時序</b><b class='flag-5'>約束</b>的方法都在這里,趕緊收藏](https://file1.elecfans.com//web2/M00/A7/4D/wKgZomUMQ7GAOhYKAAAVLUkBCZ4829.png)
正點(diǎn)原子FPGA靜態(tài)時序分析與時序約束教程
![正點(diǎn)原子FPGA靜態(tài)<b class='flag-5'>時序</b>分析與<b class='flag-5'>時序</b><b class='flag-5'>約束</b>教程](https://file.elecfans.com/web1/M00/CE/CD/o4YBAF-rS5iABAFXAADn1A_7I2g634.png)
評論