时序约束优先级_VIVADO之时序约束
1 時鐘約束
1.1 主時鐘(primary clock)
主時鐘應首先被定義,因為其他時序約束往往以主時鐘為參照標準。主時鐘的定義往往應定義在輸入端口,而不是clock buffer的輸出端口。如下圖所示:
針對主時鐘進入時鐘專用單元,則對主時鐘輸入端進行約束,時鐘專用單元輸出時鐘將以主時鐘作為樹根節點進行約束調整。
針對差分時鐘信號輸入,主時鐘約束應在差分時鐘正相端進行約束,而不是在正反相上均進行約束,以避免錯誤的CDC路徑。
約束原語:
create_clock -name -period -waveform {} [get_ports ]
1.2 虛擬時鐘(virtual clock)
虛擬時鐘并沒有連接到任何物理線網。虛擬時鐘同樣使用create_clock命令定義,但不定義源(get_port)。
虛擬時鐘往往用于在下列情景中指定輸入輸出延遲約束 :
* 外部IO參考時鐘并不是設計中的時鐘
*I/O路徑參考時鐘來源于FPGA內部派生時鐘,但內部派生時鐘與主時鐘的頻率關系并不是整數倍。
*僅針對I/O指定不同的jitter和latency
虛擬時鐘必須在用于約束I/O延遲之前被定義。
示例:create_clock -name clk_virt -period 10
1.3 衍生時鐘(generated clock)
衍生時鐘是設計中由時鐘生成沒款(MMCM,PLL等)或用戶邏輯所產生的時鐘模塊。衍生時鐘可衍生與主時鐘或其他衍生時鐘。衍生時鐘衍生于其控制時鐘(master clock),在進行約束時,并不是對衍生時鐘的周期或波形做約束,而是描述時鐘衍生單元如何對控制時鐘(master clock)的轉換。
控制時鐘和主時鐘的關系可以是:
*簡單的時鐘分頻
*簡單的時鐘倍頻
*分頻與倍頻的組合以獲取一個非整數的頻率變換(通常由MMCM和PLL)完成。
*移相或相位反轉
*占空比轉換
*上述的組合
約束原語:create_generated_clock
簡單二分頻示例:
create_clock -name clkin -period 10 [get_ports clkin]
#1 采用主時鐘作為master clock create_generated_clock -name clkdiv2 -source [get_ports clkin] -divide_by 2\[get_pins REGA/Q]
#2 采用REGA的clock引腳作為源。 create_generted_clock -name clkdiv2 -source [get_pins REGA/C] -divide_by 2\[get_pins REGA/Q]
#3 使用-edges作為選項 create_generated_clock -name clkdiv2 -source [get_pins REGA/C] -edges {1,3,5}
對于占空比改變或相移的約束:使用-edge_shift
-edge_shift不能與如下列命令同時使用:-divide_by -multiply_by -invert。
示例:
create_clock -name clkin -period 10 [get_ports clkin]
create_generated_clock -name clkshift -source [get_pins mmcm0/CLKIN] -edges{1 2 3}\-edge_shift {2.5 0 2.5} [get_pins mmcm0/CLKOUT]
-edge_shift的值可以是正數也可以是負數。
-multiply_by和divide_by可同時使用以產生非整數倍頻/分頻。
create_generated_clock -name \
-source \
-multiply_by \
-divide_by \
衍生時鐘路徑上組合邏輯的約束:-combinational;
示例:
假定master_clock驅動一個基于寄存器的二分頻時鐘電路和一個二選一驅動器的時鐘選擇器用于選擇master和二分頻時鐘,對于主時鐘到衍生時鐘有時序路徑也有組合路徑,對于組合邏輯路徑可以進行-combinational約束
create_generated_clock -name clkout -source [get_pins mmcm0/CLKIN] -combinational [get_pins MUX/O]
1.3.1 自動衍生時鐘
在定義了master_clock后,對于Clock modifying Blocks所輸出產生的時鐘,VIVADO可以自動進行約束。
對于7系列設備,CMB包含MMCM/PLL,BUFR,PHASER。對于UltraScale系列,CMBS包含MMCM/PLL*,BUFGGT/BUFGCE_DIV,GT*_COMMON/ GT*_CHANNEL/ IBUFDS_GET3,BITSLICE_CONTROL/RX*_BITSLICE,ISERDESE3。
衍生時鐘的重命名:
create_generated_clock -name new_name [-source master_pin] [-master_clock master_clk] source_object
newname和sourceobject必須被制定。sourceobject指衍生時鐘的對象(CMB output pin,GT output pin for UltraScale等)。當有多個時鐘傳遞至source pin時應制定-source和-master_clock。
If any of the -edges/-edge_shift/-divide_by/-multiply_by/-combinational/-duty_cycle /-invert options is passed to the create_generated_clock command, the generated clock is not renamed. Instead a new generated clock is created with the specified characteristics.
自動衍生的時鐘重命名只能在它的發源處重命名,不能經過任何原語器件。主時鐘和用戶定義的時鐘不能被重命名。
The auto-derived clocks can be renamed at any time inside the XDC, even after they have been referenced by some timing constraints。
時鐘重命名可以在XDC文件中任何地方重命名。
1.4 時鐘組(clock group)
默認情況下,vivado分析各時鐘下所有的路徑(除非制定或使用clock group 或false path約束)。
時鐘組約束set_clock_groups將關斷指定的時鐘組之間的時序分析,但并不關斷時鐘組內各時鐘之間的時鐘約束。set_false_path約束是單向的,但set_clock_group時序分析忽略是雙向的。
set_clockgroups在有至少有兩個有效非空時鐘組是才有效。可以使用schematic viewer,clock_network_report觀察決定哪些時鐘不能一塊兒分析。
對于異步時鐘和不可預測時鐘(unexpandable clocks,在1000個內時鐘沿無法對齊),可采用set_clock_groups進行約束(set_clock_groups優先級比常規的時序例外高,若想分析兩個異步時鐘之間的的一些路徑則不應該使用時鐘組約束,應只使用timeing_exceptions)。
示例:
主時鐘clk0經由MMCM產生usrclk和itfclk。第二個主時鐘clk1有GTP恢復產生并由MMCM 產生時鐘gtclkrx和gtclktx。
通過-asynchronous創建異步時鐘組
set_clock_groups -name async_clko_clk1 -asynchronous -group {clk0 usrclk itfclk} \
-group {clk gtclkrx,gtclktx}
也可通過get_clocks -include_generated_clocks去動態的追蹤衍生時鐘:
set_clock_groups -name async_clk0_clk1 -asynchronous \
-group [get_clocks -include_generated_clocks clk0]\
-group [get_clocks -include_generated_clocks clk1]
1.4.1 排外性時鐘組(exclusive clock groups)
有些設計模塊中根據工作模式的不同通過BUFGMUX和BUFGCTRL實現多個時鐘的切換,這種時鐘稱為排外性時鐘,時鐘不會同時存在。可通過-logically_exclusive或-physically_exclusive進行約束。
示例:
MMCM產生時鐘clk0,clk1,兩者通過一個BUFGMUX產生時鐘clkmux驅動整個設計。
默認情況下,vivado會分析clk0和clk1之間的路徑,即使兩者不會同時存在于設計中。可進行如下約束:
set_clock_groups -name exclusive_clk0_clk1 -physically_exclusive \
-group clk0 -group clk1
在FPGA中,-logically_exclusive和-physically_exclusive沒有差別,盡在ASIC中有區別
1.5 Clock Latency,Jitter,and Uncertainty
1.5.1 Clock Latency
片內的時鐘延遲有vivado自動計算,可通過set_clock_latency約束片外時鐘延時(用于源同步信號中的源時鐘)。
示例
# Minimum source latency value for clock sysClk (for both Slow and Fast corners)
set_clock_latency -source -early 0.2 [get_clocks sysClk]
# Maximum source latency value for clock sysClk (for both Slow and Fast corners)
set_clock_latency -source -late 0.5 [get_clocks sysClk]
1.5.1 Clock Jitter
時鐘抖動分為input jitter(源時鐘本身屬性)和system jitter(電源噪聲、板級噪聲及其他額外系統抖動造成)。通過set_input_jitter、set_system_jitter可分別對input jitter和system jitter進行約束。system jitter 是對全部時鐘的約束。
2 I/O延遲約束
2.1 輸入延遲
命令格式:set_input_delay
輸入延時可正可負,取決于時鐘和數據的相位關系。
參考時鐘可以是設計時鐘也可以是虛擬時鐘(純組合邏輯電路)。
2.1.1 最大與最小延時命令選項
-max,-min選項指定輸入最大最小延時。最大延時一般用于保持時間分析,最小延時一般用于建立時間分析。若沒有該選擇項,則最大最小延時設為相同值。
2.1.2 時鐘下降沿指定選項
-clock_fall指定輸入延遲約束以時鐘下降沿作為時鐘參照點。默認情況下,VIVADO僅以時鐘上升沿作為參照時鐘。
2.1.3 增加延遲輸入延遲約束
-add_delay選項一般用于引腳輸入約束已存在,想再次指定額外的時序約束。一般用于約束具有多個時鐘或時鐘邊沿相關的引腳約束(DDR、inout等)。
示例
# defines an input delay relative to a previously defined sysClk for both min and max analysis.create_clock -name sysClk -period 10 [get_ports CLK0]
set_input_delay -clock sysClk 2 [get_ports DIN]
#defines an input delay relative to a previously defined virtual clockcreate_clock -name clk_port_virt -period 10
set_input_delay -clock clk_port_virt 2 [get_ports DIN]
#defines a different input delay value for min analysis and max analysis to sysClkcreate_clock -name sysClk -period 10 [get_ports CLK0]
set_input_delay -clock sysClk -max 4 [get_ports DIN]
set_input_delay -clock sysClk -min 1 [get_ports DIN]
#純組合邏輯電路create_clock -name sysClk -period 10 [get_ports CLK0]
set_input_delay -clock sysClk 4 [get_ports DIN]
set_output_delay -clock sysClk 1 [get_ports DOUT]
#DDR時鐘create_clock -name clk_ddr -period 6 [get_ports DDR_CLK_IN]
set_input_delay -clock clk_ddr -max 2.1 [get_ports DDR_IN]
set_input_delay -clock clk_ddr -max 1.9 [get_ports DDR_IN] -clock_fall -add_delay
set_input_delay -clock clk_ddr -min 0.9 [get_ports DDR_IN]
set_input_delay -clock clk_ddr -min 1.1 [get_ports DDR_IN] -clock_fall -add_delay
2.2 輸出延時
約束指令:set_output_delay.
同set_input_delay,-clock是指令約束必選項,同時輸出延遲約束包含-min,-max,-clock_fall,-add_delay
示例:
# defines an output delay relative to a previously defined sysClk for both min and max analysis
create_clock -name sysClk -period 10 [get_ports CLK0]
set_output_delay -clock sysClk 6 [get_ports DOUT]
#defines an output delay relative to a previously defined virtual clock.
create_clock -name clk_port_virt -period 10
set_output_delay -clock clk_port_virt 6 [get_ports DOUT]
#DDR
create_clock -name clk_ddr -period 6 [get_ports DDR_CLK_IN]
set_output_delay -clock clk_ddr -max 2.1 [get_ports DDR_OUT]
set_output_delay -clock clk_ddr -max 1.9 [get_ports DDR_OUT] -clock_fall -add_delay
set_output_delay -clock clk_ddr -min 0.9 [get_ports DDR_OUT]
set_output_delay -clock clk_ddr -min 1.1 [get_ports DDR_OUT] -clock_fall -add_delay
3 時序例外(Timing Exceptions)
3.1 多周期路徑(Multicycle Paths)
常用于邏輯電路中需要多于一個時鐘周期才能穩定達到目標寄存器,若控制電路允許這種情況,可使用多時鐘周期路徑約束(多用于建立時間分析,保持時間可視情況保持原狀)。
約束原語:set_multicycle_path [-setup|-hold] [-start|-end][-from ] [-to ] [-through ]
對于setup分析,num_cycles默認為1,對于hold分析,mun_cycles默認為0.
默認情況下,保持時間的檢查是以建立時間的檢查為前提,即總是在建立時間的前一個時鐘周期確定保持時間檢查,可參考文獻:Vivado: 如何理解多周期路徑約束?xilinx.eetrend.com
路徑分析以目的端時鐘作為參考.若更改為以源端時鐘作為分析對象,使用-start選項.相似的,多周期保持路徑以源端時鐘分析,若更改為保持要求以目的端時鐘為準,則使用-end選項.
對于-setup:表示該多周期路徑所需要的時鐘周期個數;
對于-hold:表示相對于缺省捕獲沿(設定捕獲沿的前一個時鐘周期),實際捕獲沿(往往與觸發沿保持同步位置)應回調的時鐘周期個數;
*參考時鐘周期的選取:
-end表示參考時鐘為捕獲端(收端)所用時鐘,對于-setup缺省為-end;
-start表示參考時鐘為發送端(發端)所用時鐘,對于-hold缺省為-start;
若源時鐘和目的時鐘具有相同的周期,則-end,-start沒有什么不同.-start和-end對觸發沿和捕獲沿的影響如下:
對于-start,hold沿將以latch沿為基礎向后移動,setup分析將以捕獲沿為基礎,向前移動N個源時鐘周期時鐘定位latch沿;對于-end,hold沿將以移動后的hold沿為基準向前移動,setup分析將以latch沿為基礎,向后移動N個目的時鐘周期定位捕獲沿.
3.1.1 單時鐘域的多周期時鐘約束Multicycle Constraint in SIngle Clock Domain
默認的建立與保持關系如下圖所示:默認的建立與保持沿關系
示例:帶使能的雙周期時鐘路徑
下列約束建立一個新的建立關系
set_multicycle_path 2 -setup -from [get_pins data0_reg/C] -to [get_pins data1_reg/D]
在建立新的建立約束關系時,保持時間關系也將自動的調整(移至捕獲時鐘沿的前一個時鐘沿),下圖展示了僅約束setup多周期約束后建立與保持關系的變化:
由于帶有使能,data0_reg沒有必要再保持一個時鐘周期,Xilinx推薦更改保持關系為原來的狀態,通過增加-hold約束,
set_multicycle_path 1 -hold -end -from [get_pins data0_reg/C] \ -to [get_pins data1_reg/D]
此時,建立與保持關系如下所示:
對于建立與保持關系,觸發沿是不改變的.
若不增加-hold,在implementation過程中將插入大量的延時以滿足保持時間約束,因而需要增加-hold約束.
在單時鐘域或具有相同波形的雙時鐘域,當一個N周期的建立多周期,N-1個保持多周期的約束示例如下所示:
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]
3.1.2 單時鐘域帶相移的多周期時鐘約束
3.1.2.1 目的時鐘超前源時鐘
示例: CLK1為源時鐘,CLK2為目的時鐘,CLK2超前0.3ns.
由于時鐘相移,建立與保持分析可能不像預期那樣,如下圖所示:
此種情況下,由于0.3ns相移,建立余量只有0.3ns,這使得幾乎不可能滿足時序收斂,另一方面,有3.7秒的保持余量,太過豐富.
這種情況下,應設置多周期時鐘約束:
set_multicycle_path 2 -setup -from [get_clocks CLK1] -to [get_clocks CLK2]
將捕獲沿向前移1個時鐘周期,保持沿將自動移動,無需在施加-hold約束.此時時序關系如下圖所示:
3.1.2.2 目的時鐘滯后源時鐘
對于目的時鐘之后源時鐘,無需施加多時鐘周期約束.若目的時鐘超前太多,則需施加(個人以為超前太多可歸于上一種情況).
3.1.3 慢時鐘域到快時鐘域的多周期時序約束
示例:
帶有時鐘使能的慢時鐘域到快時鐘域,CLK2時鐘頻率為CLK1時鐘頻率的3倍.若沒有多時鐘周期約束,STA分析將按照下圖進行分析:
施加建立多時鐘周期約束:
set_multicycle_path 3 -setup -from [get_clocks CLK1] -to [get_clocks CLK2]
此時建立與保持關系如下圖所示:
由于沒有施加保持關系,因而需要在路徑上添加大量的延時,將會增加面積和功耗.
施加-hold約束:
set_multicycle_path 2 -hold -from [get_clocks CLK1] -to [get_clocks CLK2]
此時建立與保持關系分析如下圖所示:
對于慢時鐘域到快時鐘域,定義N周期建立多時鐘周期約束,N-1周期保持約束,定義原語:
set_multicycle_path N -setup -from [get_clocks CLK1] -to [get_clocks CLK2]
set_multicycle_path N-1 -hold -end -from [get_clocks CLK1] -to [get_clocks CLK2]
3.1.4 快時鐘域到慢時鐘域的多周期時序約束
在沒有多時鐘周期約束的情況下,STA將按照下圖進行分析約束:
建立約束:
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]
建立與保持關系約束將變為如下圖所示:
快時鐘域到慢時鐘域的約束:
set_multicycle_path N -setup -start -from [get_clocks CLK1] -to [get_clocks CLK2]
set_multicycle_path N-1 -hold -from [get_clocks CLK1] -to [get_clocks CLK2]
3.1.5 小結
3.2 偽路徑(False Paths)
偽路徑定義為:
1 從邏輯上考慮,與電路正常工作不相關的那些路徑,比如測試邏輯,靜態或準靜態邏輯(rom).
2 從時序上考慮,我們在綜合時不需要分析的那些路徑,比如跨時鐘域的路徑,異步雙端口RAM等.
偽路徑的優勢:減少工具運行優化時間,增強實現結果,避免在不需要進行時序約束的地方畫較多時間而忽略了真正需要進行優化的地方.
約束原語:
set_false_path [-setup] [-hold] [-from ] [-to ] \ [-through ]
-from的節點應是有效的起始點.有效的起始點包含時鐘對象,時序單元的clock引腳,或者input(or inout)原語.
-to的節點應包含有效的終結點.一個有效的終結點包含時鐘對象,output(or inout)原語端口,或者時序功能單元的數據輸入端口
-through的節點應包括引腳,端口,或線網.當單獨使用-through時,應注意所有路徑中包含-through節點的路徑都將被時序分析工具所忽略.
-through的先后順序非常重要!!!
示例:
set_false_path -through cell1/pin1 -through cell2/pin2
set_false_path -through cell2/pin2 -through cell1/pin1
上述第一條約束將會忽略先經過pin1,再經過pin2的路徑約束,而第二條語句會忽略先經過pin2,再經過pin1的路徑,兩者并不等價.
false_path的約束是單向的,而非雙向的.
3.3 最大最小延遲(Min/Max Delays)
最大最小延遲可重新指定路徑的最大最小延遲.
最大延遲(Maximum delay)可重寫路徑的默認setup(recovery)要求.
最小延遲可以重定義路徑的默認hold要求.
約束原語:
set_max_delay [-datapath_only] [-from ][-to ][-through ]
set_min_delay [-from ] [-to ][-through ]
-from:有效的起始節點包含:時鐘,input(input)端口,或時序單元(寄存器,RAM)的時鐘引腳.
-to:有效的終止節點包含:時鐘,output(inout)端口或時序單元的數據端口.
-through:有效的節點包含:引腳,端口,線網.
-datapath_only選項可在裕量計算時不考慮時鐘偏斜,需和-from一同使用.在不使用帶-datapath_only選項時,設置最大延遲不改變最小約束要求,保持約束(hold check)將保持默認值.當使用帶datapath_only選項約束時,路徑的保持要求檢查(hold check)將被忽略(內建set_false_path -hold 約束),換言之,路徑的保持關系檢查將不做分析.同樣的,建立最小延遲約束也不改變路徑的setup檢查.-datapath_only可用于跨時鐘域信號需要設置最大延遲時使用.
跨時鐘域信號最大延遲約束設置(這種情況下不應再設置時鐘組):
set_max_delay -datapath_only -from \ -to
3.4 條件分析(case analysis)
但正常工作模式下的某些輸入是不會發生的,例如ResetN在正常工作模式是1,如果考慮它為0對單元延時的影響,無疑是不必要的。條件分析常用于在上電后信號保持不變或復用邏輯中僅在某些情況下才有效的情況.可用于BUFGMUX,LUT, F8MUX, the Reset pin of the FF, and the Enable pin of the FF.更多的是應用于bufgmux.
約束原語:set_case_analysis
的值可以是0,1,zero,one,rise,rising,fall,falling.表明指定的信號僅在給定情況下才會分析,其他情況將不會分析.
示例:下圖中在S設定值后僅clk_2沿路徑向后傳送,可施加約束:
create_clock -name clk_1 -period 10.0 [get_pins clock_sel/I0]
create_clock -name clk_2 -period 15.0 [get_pins clock_sel/I1]
set_case_analysis 1 [get_pins clock_sel/S]
3.5 禁止時序分析(disabling timing)
通過set_disable_timing約束可以禁止某些路徑的時序分析.只能禁止邏輯單元的input到output端口.可用于指定組合反饋邏輯,分布式ram等某些路徑的禁止時序分析.
約束原語:
set_disable_timing [-from ] [-to ] [quiet][-verbose]
-from,-to的參數只能是引腳名和非VIVADO工具對象的名稱.同時引腳名稱必須匹配元件庫中的名稱,而不是設計中的引腳名.
示例:
set_disable_timing -from WCLK -to O [get_cells inst_fifo_gen /gdm.dm /gpr1.dout_i_reg[*]]
上述約束將禁止所有inst_fifo_gen /gdm.dm /gpr1.dout_i_reg[*]寄存器WCLK到O的時序分析.
-from,-to是可選的.若僅指定-from,則所有源自-from指定位置為出發點的路徑都將被忽略,若僅指定-to,則所有終結至-to節點的路徑都將被禁止時序分析.若-from,-to都沒有指定,則所有的時序路徑都將被忽略.
4 跨時鐘域約束(Clock Domain Constraints)
跨時鐘域包含同步跨時鐘域和異步跨時鐘域,這取決于觸發沿與捕獲沿之間的關系和CDC路徑上的時序例外約束。例如同步時鐘之間被約束以false path將不會再進行時序分析,將被當成異步時鐘域處理。
跨時鐘域的路徑可以通過set_false_path或set_clock_groups約束全部忽略掉,也可以通過set_max_delay -datapath_only選項做部分路徑分析.多比特跨時鐘域信號也可以使用set_bus_skew約束.
總線偏斜約束用于指定跨時鐘域信號之間最大的偏斜要求。不同于傳統的時鐘偏斜,它對應于不同路徑信號之間的所允許的最大捕獲時間。
bus skew約束目的在于限制源端向目的端發送數據所需要的源端時鐘數。該數目取決于跨時鐘路徑上的同步電路。bus skew 約束往往用于:
格林碼傳輸
配置寄存器
帶有CE、MUX、或MUX 保持電路的多比特跨時鐘實現
bus skew并不是一個時序例外,相反其是一個時序聲明。因而它并不影響時序例外的優先級。bus skew往往用于route_design。
約束原語:
set_bus_skew [-from ] [-to ] [-through ]
-from選項包含有效的起始點。有效起始點包含輸入(或inout)端口,或時序單元(寄存器,ram等)的時鐘輸入端口。
-to選項包含時鐘,輸出(或inout)端口,時序單元的數據輸入端口
-through選項包含pins,ports,nets。
推薦-from和-to都使用,同時定義詳盡的約束,避免包含進多余的路徑。不建議直接設置源端時鐘到目的端時鐘之間的總線約束,應具體到信號。
總線偏斜的值應該是實際可靠的。推薦設置值應大于源端和目的時鐘周期最小值的一半。同時該值也依賴跨時鐘域上的拓撲邏輯電路。
示例:
跨時鐘域的時鐘使能電路如下圖所示,時鐘使能信號同步電路上包含四個同步寄存器:
這種情況下,總線偏斜值根據同步寄存器個數進行調整,因為寄存器個數反映了什么時候目的端時鐘使能。假設源端時鐘周期5ns,目的端時鐘周期2.5ns,此時約束為
set_bus_skew -from [get_cells src_hsdata_ff_reg*] -to [get_cells dest_hsdata_ff_reg* ] 10.000
同時為避免在布局過程源端和目的端位置間距太大,可施加set_max_delay約束:
set_max_delay -datapath_only -from [get_cells src_hsdata_ff_reg*] -to [get_cells dest_hsdata_ff_reg*] 10.000
示例二:
如下圖所示異步時鐘域之間的格林碼傳輸。由于必須確保在目的時鐘域同一時間只有一位發生跳轉,因而總線偏移應不超過一個目的端時鐘周期。
set_bus_skew -from [get_cells src_gray_ff_reg*] -to [get_cells { dest_graysync_ff_reg[0]* }] 2.500
set_max_delay -datapath_only -from [get_cells src_gray_ff_reg*] -to [get_cells
{dest_graysync_ff_reg[0]*}] 5.000(從慢時鐘域到快時鐘域,僅需確保源端變化能被目的端采到即可)
5 XDC約束優先級
xdc約束指令是按照順序解釋執行的,相應的,同樣的約束指令,最后一條約束生效。
時序例外優先級:時序例外優先級從高到低為:Clock Grroups,False Path,Maximum Delay Path(set_max_delay)和(set_min_delay),多時鐘周期約束(set_multicycle_path).
set_bus_skew約束并不影響上述優先級且不與上述約束沖突。原因在于set_bus_skew并不是某條路徑上的約束,而是路徑與路徑之間的約束。
針對同樣的約束例外,約束定義的越細致,則其優先級越高。針對各種對象的優先級為:Ports,pins,cells,clocks。clock相比于ports,pins,cells優先級最低。路徑指示聲明的優先級從高到低分別為:-from -through -to,-from -to,-from -through,-from, -through -to,-to,-through。優先級先考慮對象類型才考慮路徑指示。
示例:
> set_max_delay 12 -from [get_clocks clk1] -to [get_clocks clk2]
> set_max_delay 15 -from [get_clocks clk1]
上述約束中,第一條約束優先級高,第二條約束clk1到clk2的約束將會被重寫。
> set_max_delay 12 -from [get_cells inst0] -to [get_cells inst1]
> set_max_delay 15 -from [get_clocks clk1] -through [get_pins hier0/p0] -to
[get_cells inst1]
-throuh并不影響優先級,約束器將會采用最嚴的約束,因而從inst0到inst1的約束將會被指定為第一條。
> set_max_delay 4 -through [get_pins inst0/I0]
> set_max_delay 5 -through [get_pins inst0/I0] -through [get_pins inst1/I3]
兩條約束都存在,但inst/i0將采用最嚴的第一條約束。
應避免對同一對象添加多條約束。推薦使用report_exceptions指令來檢查有效的例外約束。
總結
以上是生活随笔為你收集整理的时序约束优先级_VIVADO之时序约束的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习之旅3
- 下一篇: 在js中动态的判断复选框是否选中