兩種時(shí)序例外
多周期路徑
上面我們講的是時(shí)鐘周期約束,默認(rèn)按照單周期關(guān)系來分析數(shù)據(jù)路徑,即數(shù)據(jù)的發(fā)起沿和捕獲沿是最鄰近的一對(duì)時(shí)鐘沿。如下圖所示。
默認(rèn)情況下,保持時(shí)間的檢查是以建立時(shí)間的檢查為前提,即總是在建立時(shí)間的前一個(gè)時(shí)鐘周期確定保持時(shí)間檢查。這個(gè)也不難理解,上面的圖中,數(shù)據(jù)在時(shí)刻1的邊沿被發(fā)起,建立時(shí)間的檢查是在時(shí)刻2進(jìn)行,而保持時(shí)間的檢查是在時(shí)刻1(如果這里不能理解,再回頭看我們講保持時(shí)間章節(jié)的內(nèi)容),因此保持時(shí)間的檢查是在建立時(shí)間檢查的前一個(gè)時(shí)鐘沿。
但在實(shí)際的工程中,經(jīng)常會(huì)碰到數(shù)據(jù)被發(fā)起后,由于路徑過長或者邏輯延遲過長要經(jīng)過多個(gè)時(shí)鐘周期才能到達(dá)捕獲寄存器;又或者在數(shù)據(jù)發(fā)起的幾個(gè)周期后,后續(xù)邏輯才能使用。這時(shí)如果按照單周期路徑進(jìn)行時(shí)序檢查,就會(huì)報(bào)出時(shí)序違規(guī)。因此就需要我們這一節(jié)所講的多周期路徑了。
多周期約束的語句是:
set_multicycle_path[-setup|-hold] [-start|-end][-from ] [-to ] [-through ]
對(duì)于建立時(shí)間,num_cycles是指多周期路徑所需的時(shí)鐘周期個(gè)數(shù);對(duì)于保持時(shí)間,num_cycles是指相對(duì)于默認(rèn)的捕獲沿,實(shí)際捕獲沿應(yīng)回調(diào)的周期個(gè)數(shù)。
發(fā)起沿和捕獲沿可能是同一個(gè)時(shí)鐘,也可能是兩個(gè)時(shí)鐘,參數(shù)start和end就是選擇參考時(shí)鐘是發(fā)送端還是接收端。
- start表示參考時(shí)鐘為發(fā)送端(發(fā)端)所用時(shí)鐘,對(duì)于保持時(shí)間的分析,若后面沒有指定start或end,則默認(rèn)為為-start;
- end表示參考時(shí)鐘為捕獲端(收端)所用時(shí)鐘,對(duì)于建立時(shí)間的分析,若后面沒有指定start或end,則默認(rèn)為為-end;
上面這兩句話也不難理解,因?yàn)閟etup-time是在下一個(gè)時(shí)鐘沿進(jìn)行捕獲時(shí)的約束,因此默認(rèn)是對(duì)接收端的約束;而hold-up-time是對(duì)同一個(gè)時(shí)鐘沿的約束,目的是發(fā)送端不能太快,是對(duì)發(fā)送端的約束。
對(duì)于單周期路徑來說,setup的num_cycles為1,hold的num_cycles為0.
多周期路徑要分以下幾種情況進(jìn)行分析:
1. 單時(shí)鐘域
即發(fā)起時(shí)鐘和捕獲時(shí)鐘是同一個(gè)時(shí)鐘,其多周期路徑模型如下圖所示。
單時(shí)鐘域的多周期路徑常見于帶有使能的電路中,我們以雙時(shí)鐘周期路徑為例,其實(shí)現(xiàn)電路如下:
若我們沒有指定任何的約束,默認(rèn)的建立/保持時(shí)間的分析就像我們上面所講的單周期路徑,如下圖所示。
但由于我們的的數(shù)據(jù)經(jīng)過了兩個(gè)時(shí)鐘周期才被捕獲,因此建立時(shí)間的分析時(shí)需要再延遲一個(gè)周期的時(shí)間。
采用如下的時(shí)序約束:
set_multicycle_path 2 -setup -from [get_pins data0_reg/C] -to [get_pins data1_reg/D]
在建立時(shí)間被修改后,保持時(shí)間也會(huì)自動(dòng)調(diào)整到捕獲時(shí)鐘沿的前一個(gè)時(shí)鐘沿,如下圖所示。
很明顯,這個(gè)保持時(shí)間檢查是不對(duì)的,因?yàn)楸3謺r(shí)間的檢查針對(duì)的是同一個(gè)時(shí)鐘沿,因此我們要把保持時(shí)間往回調(diào)一個(gè)周期,需要再增加一句約束:
set_multicycle_path 1 -hold -end -from [get_pins data0_reg/C] -to [get_pins data1_reg/D]
這里加上-end參數(shù)是因?yàn)槲覀円巡东@時(shí)鐘沿往前移,因此針對(duì)的是接收端,但由于我們這邊講的是單時(shí)鐘域,發(fā)送端和接收端的時(shí)鐘是同一個(gè),因此-end可以省略。這樣,完整的時(shí)序約束如下:
set_multicycle_path 2 -setup -from [get_pins data0_reg/C] -to [get_pins data1_reg/D] set_multicycle_path 1 -hold -from [get_pins data0_reg/C] -to [get_pins data1_reg/D]
約束完成后,建立保持時(shí)間檢查如下圖所示。
在單時(shí)鐘域下,若數(shù)據(jù)經(jīng)過N個(gè)周期到達(dá),則約束示例如下:
set_multicycle_path N -setup -from [get_pins data0_reg/C] -to [get_pins data1_reg/D] set_multicycle_path N-1 -hold -from [get_pins data0_reg/C] -to [get_pins data1_reg/D]
2. 時(shí)鐘相移
前面我們討論的是在單時(shí)鐘域下,發(fā)送端和接收端時(shí)鐘是同頻同相的,如果兩個(gè)時(shí)鐘同頻不同相怎么處理?
如上圖所示,時(shí)鐘周期為4ns,接收端的時(shí)鐘沿比發(fā)送端晚了0.3ns,若不進(jìn)行約束,建立時(shí)間只有0.3ns,時(shí)序基本不可能收斂;而保持時(shí)間則為3.7ns,過于豐富??赡苡械耐瑢W(xué)對(duì)保持時(shí)間會(huì)有疑惑,3.7ns是怎么來的?還記得我們上面講的保持時(shí)間的定義么,在0ns時(shí)刻,接收端捕獲到發(fā)送的數(shù)據(jù)后,要再過3.7ns的時(shí)間發(fā)送端才會(huì)發(fā)出下一個(gè)數(shù)據(jù),因此本次捕獲的數(shù)據(jù)最短可持續(xù)3.7ns,即保持時(shí)間為3.7ns。
因此,在這種情況下,我們應(yīng)把捕獲沿向后移一個(gè)周期,約束如下:
set_multicycle_path 2 -setup -from [get_clocks CLK1] -to [get_clocks CLK2]
對(duì)setup約束后,hold會(huì)自動(dòng)向后移動(dòng)一個(gè)周期,此時(shí)的建立保持時(shí)間檢查如下:
那如果接收端的時(shí)鐘比發(fā)送端的時(shí)鐘超前了怎么處理?
同樣的,時(shí)鐘周期為4ns,但接收端時(shí)鐘超前了0.3ns,從圖中可以看出,此時(shí)setup是3.7ns,而保持時(shí)間是0.3ns。這兩個(gè)時(shí)間基本已經(jīng)滿足了Xilinx器件的要求,因此無需進(jìn)行約束。
3. 慢時(shí)鐘到快時(shí)鐘的多周期
當(dāng)發(fā)起時(shí)鐘慢于捕獲時(shí)鐘時(shí),我們應(yīng)該如何處理?
但我們可以通過約束讓建立時(shí)間的要求更容易滿足,即
set_multicycle_path 3 -setup -from [get_clocks CLK1] -to [get_clocks CLK2]
跟上面講的一樣,設(shè)置了setup,hold會(huì)自動(dòng)變化,但我們不希望hold變化,因此再增加:
set_multicycle_path 2 -hold -end -from [get_clocks CLK1] -to [get_clocks CLK2]
這里由于發(fā)起和捕獲是兩個(gè)時(shí)鐘,因此-end參數(shù)是不可省的。加上時(shí)序約束后,Vivado會(huì)按照下面的方式進(jìn)行時(shí)序分析。
4. 快時(shí)鐘到慢時(shí)鐘的多周期
當(dāng)發(fā)起時(shí)鐘快于捕獲時(shí)鐘時(shí),我們應(yīng)該如何處理?
假設(shè)發(fā)起時(shí)鐘頻率是捕獲時(shí)鐘頻率的3倍,在沒有任何約束的情況下,Vivado默認(rèn)會(huì)按照如下圖所示的建立保持時(shí)間進(jìn)行分析。
同理,我們可以通過約束,讓時(shí)序條件更加寬裕。
set_multicycle_path 3 -setup -start -from [get_clocks CLK1] -to [get_clocks CLK2] set_multicycle_path 2 -hold -from [get_clocks CLK1] -to [get_clocks CLK2]
這里的hold約束中沒有加-end參數(shù),這樣的話默認(rèn)就是-start,是因?yàn)槲覀儼寻l(fā)起時(shí)鐘回調(diào)2個(gè)周期,如下圖所示。
針對(duì)上面講的幾種多周期路徑,總結(jié)如下:
偽路徑
什么是偽路徑?偽路徑指的是該路徑存在,但該路徑的電路功能不會(huì)發(fā)生或者無須時(shí)序約束。如果路徑上的電路不會(huì)發(fā)生,那Vivado綜合后會(huì)自動(dòng)優(yōu)化掉,因此我們無需考慮這種情況。
為什么要?jiǎng)?chuàng)建偽路徑?創(chuàng)建偽路徑可以減少工具運(yùn)行優(yōu)化時(shí)間,增強(qiáng)實(shí)現(xiàn)結(jié)果,避免在不需要進(jìn)行時(shí)序約束的地方花較多時(shí)間而忽略了真正需要進(jìn)行優(yōu)化的地方。
偽路徑一般用于:
? 跨時(shí)鐘域
? 一上電就被寫入數(shù)據(jù)的寄存器
? 異步復(fù)位或測(cè)試邏輯
? 異步雙端口RAM
可以看出,偽路徑主要就是用在異步時(shí)鐘的處理上,我們上一節(jié)講的多周期路徑中,也存在跨時(shí)鐘域的情況的,但上面我們講的是兩個(gè)同步的時(shí)鐘域。
偽路徑的約束為:
set_false_path [-setup] [-hold] [-from] [-to ] [-through ]
- -from的節(jié)點(diǎn)應(yīng)是有效的起始點(diǎn).有效的起始點(diǎn)包含時(shí)鐘對(duì)象,時(shí)序單元的clock引腳,或者input(or inout)原語;
- -to的節(jié)點(diǎn)應(yīng)包含有效的終結(jié)點(diǎn).一個(gè)有效的終結(jié)點(diǎn)包含時(shí)鐘對(duì)象,output(or inout)原語端口,或者時(shí)序功能單元的數(shù)據(jù)輸入端口;
- -through的節(jié)點(diǎn)應(yīng)包括引腳,端口,或線網(wǎng).當(dāng)單獨(dú)使用-through時(shí),應(yīng)注意所有路徑中包含-through節(jié)點(diǎn)的路徑都將被時(shí)序分析工具所忽略.
需要注意的是,-through是有先后順序的,下面的兩個(gè)約束是不同的約束:
set_false_path -through cell1/pin1 -through cell2/pin2 set_false_path -through cell2/pin2 -through cell1/pin1
因?yàn)樗鼈兘?jīng)過的先后順序不同,偽路徑的約束是單向的,并非雙向的,若兩個(gè)時(shí)鐘域相互之間都有數(shù)據(jù)傳輸,則應(yīng)采用如下約束:
set_false_path -from [get_clocks clk1] -to [get_clocks clk2] set_false_path -from [get_clocks clk2] -to [get_clocks clk1]
也可以直接采用如下的方式,與上述兩行約束等效:
set_clock_groups -async -group [get_clocks clk1] -to [get_clocks clk2]
還有一些其他的約束,比如case analysis、disabling timing和bus_skew等,由于平時(shí)用的比較少,這里就不講了。
-
FPGA
+關(guān)注
關(guān)注
1646文章
22053瀏覽量
618769 -
時(shí)序約束
+關(guān)注
關(guān)注
1文章
118瀏覽量
13686
發(fā)布評(píng)論請(qǐng)先 登錄
FPGA時(shí)序約束之設(shè)置時(shí)鐘組

Techwiz LCD應(yīng)用:LC透鏡光線追跡
集成電路設(shè)計(jì)中靜態(tài)時(shí)序分析介紹
使用IP核和開源庫減少FPGA設(shè)計(jì)周期

EE-38:ADSP-2181 IDMA端口-周期竊取時(shí)序

FPGA驅(qū)動(dòng)AD芯片之實(shí)現(xiàn)與芯片通信

Verilog vhdl fpga
TPS65950實(shí)時(shí)時(shí)鐘時(shí)序補(bǔ)償分析

使用IBIS模型進(jìn)行時(shí)序分析

高速ADC與FPGA的LVDS數(shù)據(jù)接口中避免時(shí)序誤差的設(shè)計(jì)考慮

萊迪思FPGA器件生命周期

評(píng)論