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