在vivado中,我們常用的時序約束指令主要包括如下幾個方面:
| 類型 | 命令 | 說明 |
|---|---|---|
| 時鐘約束 | create_clock | 創(chuàng)建主時鐘 |
| 時鐘約束 | create_generated_clock | 創(chuàng)建衍生時鐘 |
| 時鐘約束 | set_clock_groups | 設(shè)置時鐘組 |
| 時鐘約束 | set_clock_latency | 設(shè)置時鐘延時 |
| 時鐘約束 | set_clock_sense | 設(shè)置時鐘邊沿敏感 |
| 時鐘約束 | set_clock_uncertainty | 設(shè)置時鐘不確定度 |
| 時鐘約束 | set_system_jitter | 設(shè)置系統(tǒng)抖動 |
| 時鐘約束 | set_input_jitter | 設(shè)置輸入抖動 |
| 時鐘約束 | set_external_delay | 設(shè)置外部延時 |
| 輸入 / 輸出信號接口約束 | set_input_delay | 設(shè)置輸入信號延時 |
| 輸入 / 輸出信號接口約束 | set_output_delay | 設(shè)置輸出信號延時 |
| 時序例外約束 | set_false_path | 設(shè)置虛假路徑 |
| 時序例外約束 | set_multicycle_path | 設(shè)置多周期路徑 |
| 時序例外約束 | set_max_delay | 設(shè)置最大延時 |
| 時序例外約束 | set_min_delay | 設(shè)置最小延時 |
| 時序斷言約束 | set_data_check | 約束數(shù)據(jù)到數(shù)據(jù)的建立 / 保持時間檢查 |
| 時序斷言約束 | set_bus_skew | 設(shè)置總線偏斜斷言 |
| 其他約束 | set_case_analysis | 設(shè)置信號為固定數(shù)值 |
| 其他約束 | group_path | 設(shè)置時序路徑分組 |
| 其他約束 | set_disable_timing | 設(shè)置中斷時序弧 |
| 其他約束 | set_max_time_borrow | 設(shè)置鎖存器借用時間 |
1. create_clock(創(chuàng)建主時鐘)
含義:定義設(shè)計中的根時鐘(如外部晶振輸入的時鐘),是所有時序分析的基準(zhǔn)。
使用方法:
create_clock -name clk_100mhz -period 10 [get_ports clk_in]
-name:指定時鐘名稱(自定義,便于識別)
-period:時鐘周期(單位:ns,10ns對應(yīng)100MHz)
[get_ports clk_in]:指定時鐘源端口(FPGA的輸入引腳)
關(guān)鍵參數(shù):
-waveform {0 5}:定義時鐘邊沿位置(默認占空比50%,0ns上升沿,5ns下降沿)
-add:為同一端口添加多個時鐘(如雙沿采樣場景)
2. create_generated_clock(創(chuàng)建衍生時鐘)
含義:定義由主時鐘通過分頻、倍頻或相位偏移生成的時鐘(如PLL輸出時鐘),與主時鐘存在確定的相位關(guān)系。
使用方法:
create_generated_clock -name clk_div2 -source [get_ports clk_in]
-divide_by 2 [get_pins reg_div/Q]
-source:指定源時鐘(主時鐘的端口或引腳)
-divide_by 2:分頻系數(shù)(此處為2分頻)
[get_pins reg_div/Q]:衍生時鐘的生成點(如寄存器輸出引腳)
常用參數(shù):
-multiply_by:倍頻系數(shù)(如-multiply_by 2實現(xiàn)2倍頻)
-phase:相位偏移(單位:deg,如-phase 90表示偏移90度)
-invert:時鐘反轉(zhuǎn)(實現(xiàn)180度相位偏移)
3. set_clock_groups(設(shè)置時鐘組)
含義:將相互異步的時鐘劃分為不同組,告知工具這些時鐘間無需進行時序分析(避免虛假時序違規(guī))。
使用方法:
set_clock_groups -name async_groups -asynchronous
-group [get_clocks clk_100mhz]
-group [get_clocks clk_125mhz]
-asynchronous:標(biāo)記組間時鐘為異步關(guān)系
-group:指定時鐘組(可包含多個時鐘)
其他模式:
-physically_exclusive:互斥時鐘(同一時刻只有一個時鐘有效,如切換時鐘源)
4. set_clock_latency(設(shè)置時鐘延時)
含義:定義時鐘從源到寄存器時鐘端的傳播延時(包括網(wǎng)絡(luò)延時和器件固有時延),分為理想延時和實際延時。
使用方法:
# 設(shè)置時鐘網(wǎng)絡(luò)的理想延時(不考慮布局布線影響)
set_clock_latency 2.5 [get_clocks clk_100mhz]
# 設(shè)置輸入/輸出延時(相對于時鐘源)
set_clock_latency -source 1.2 [get_clocks clk_100mhz]
無選項:默認指時鐘到達寄存器的延時(目的地延時)
-source:指時鐘從源到FPGA引腳的延時(源端延時)
5. set_clock_sense(設(shè)置時鐘邊沿敏感)
含義:指定時鐘沿的采樣方向(上升沿/下降沿),默認情況下工具自動識別,特殊場景需手動指定。
使用方法:
set_clock_sense -positive [get_clocks clk_100mhz] # 上升沿敏感
set_clock_sense -negative [get_clocks clk_100mhz] # 下降沿敏感
6. set_clock_uncertainty(設(shè)置時鐘不確定度)
含義:考慮時鐘抖動(jitter)和偏斜(skew)的綜合影響,為時序分析預(yù)留額外余量,確保設(shè)計可靠性。
使用方法:
set_clock_uncertainty 0.5 [get_clocks clk_100mhz]
數(shù)值表示時鐘不確定性的總量(單位:ns),工具會在建立時間和保持時間分析中自動減去/加上該值。
常用參數(shù):-setup(僅對建立時間生效)、-hold(僅對保持時間生效)
7. set_system_jitter(設(shè)置系統(tǒng)抖動)
含義:定義外部系統(tǒng)引入的時鐘抖動(如晶振抖動),與set_clock_uncertainty的區(qū)別在于:系統(tǒng)抖動是外部引入的,而不確定度包含內(nèi)部偏斜。
使用方法:
set_system_jitter 0.3 [get_clocks clk_100mhz]
8. set_input_jitter(設(shè)置輸入抖動)
含義:指定輸入時鐘的抖動特性(針對外部輸入的時鐘信號),影響時鐘的不確定性計算。
使用方法:
set_input_jitter [get_clocks clk_ext] 0.2
第一個參數(shù)為外部時鐘,第二個參數(shù)為抖動值(單位:ns)
9. set_external_delay(設(shè)置外部延時)
含義:定義FPGA外部電路的延時(輸入信號從外部源到FPGA引腳,或輸出信號從FPGA引腳到外部目的地的延時),用于接口時序分析。
使用方法:
# 輸入信號:外部電路到FPGA引腳的延時(占時鐘周期的30%)
set_external_delay -input 3 [get_clocks clk_100mhz]
# 輸出信號:FPGA引腳到外部電路的延時(占時鐘周期的20%)
set_external_delay -output 2 [get_clocks clk_100mhz]
10. set_input_delay(設(shè)置輸入信號延時)
含義:定義外部輸入信號到達FPGA引腳后,相對于時鐘沿的有效建立時間窗口,用于確保輸入數(shù)據(jù)在時鐘采樣前穩(wěn)定。
使用方法:
set_input_delay -clock clk_100mhz -max 3 [get_ports data_in]
set_input_delay -clock clk_100mhz -min 0.5 [get_ports data_in]
-clock:指定采樣該輸入信號的時鐘
-max:輸入信號的最大延時(數(shù)據(jù)最晚到達時間)
-min:輸入信號的最小延時(數(shù)據(jù)最早到達時間)
單位為 ns,需根據(jù)外部電路延時特性設(shè)置(通常占時鐘周期的 20%-30%)
11. set_output_delay(設(shè)置輸出信號延時)
含義:定義 FPGA 輸出信號到達外部器件所需的延時,確保外部電路能在其時鐘沿前穩(wěn)定采樣數(shù)據(jù)。使用方法:
set_output_delay -clock clk_ext -max 2.5 [get_ports data_out]
set_output_delay -clock clk_ext -min 0.3 [get_ports data_out]
-clock:指定外部電路的采樣時鐘
數(shù)值表示輸出信號相對于外部時鐘的延時,需匹配外部器件的建立 / 保持時間要求
12. set_false_path(設(shè)置虛假路徑)
含義:標(biāo)記無需進行時序分析的路徑(通常是異步時鐘域間路徑或邏輯上不可能激活的路徑),減少工具分析開銷。使用方法:
# 異步時鐘間的路徑
set_false_path -from [get_clocks clk_100mhz] -to [get_clocks clk_125mhz]
# 特定端口到模塊的路徑
set_false_path -from [get_ports reset] -to [get_cells *]
-from/-to:指定路徑的起點和終點(時鐘、端口、單元等)
典型應(yīng)用:復(fù)位信號路徑、異步時鐘域跨域路徑、測試模式專用路徑
13. set_multicycle_path(設(shè)置多周期路徑)
含義:允許數(shù)據(jù)在多個時鐘周期內(nèi)完成傳輸(適用于慢路徑),工具會放寬時序要求。
使用方法:
# 建立時間:允許3個時鐘周期完成傳輸
set_multicycle_path 3 -setup -from [get_clocks clk_fast] -to [get_clocks clk_slow]
# 保持時間:對應(yīng)調(diào)整為2個周期(通常比setup少1)
set_multicycle_path 2 -hold -from [get_clocks clk_fast] -to [get_clocks clk_slow]
-setup/-hold:分別設(shè)置建立時間和保持時間的多周期數(shù)
常用于跨時鐘域數(shù)據(jù)傳輸或低速外設(shè)接口(如 SPI、I2C)
14. set_max_delay(設(shè)置最大延時)
含義:為特定路徑指定最大允許延時(覆蓋默認時鐘約束),確保關(guān)鍵路徑不超時。使用方法:
set_max_delay 8 -from [get_ports ctrl_in] -to [get_ports ctrl_out]
數(shù)值為路徑允許的最大延時(ns),常用于對響應(yīng)速度有嚴(yán)格要求的路徑
15. set_min_delay(設(shè)置最小延時)
含義:為特定路徑指定最小允許延時,防止因路徑過短導(dǎo)致的保持時間違規(guī)(信號變化過快)。使用方法:
set_min_delay 0.8 -from [get_cells reg1/Q] -to [get_cells reg2/D]
確保數(shù)據(jù)在采樣時鐘沿后保持穩(wěn)定的最短時間,避免競爭冒險
16. set_data_check(數(shù)據(jù)到數(shù)據(jù)的建立/保持時間檢查)
含義:定義兩個數(shù)據(jù)信號間的相對時序關(guān)系(非時鐘觸發(fā)),常用于握手信號或異步接口。使用方法:
# data信號需在valid信號有效后至少1ns建立,且保持2ns
set_data_check -setup 1 -hold 2 -from [get_ports valid] -to [get_ports data]
檢查數(shù)據(jù)信號相對于控制信號的穩(wěn)定性,確保握手邏輯可靠
17. set_bus_skew(總線偏斜斷言)
含義:約束總線內(nèi)各信號的最大 skew(偏斜),確保總線信號同步變化(如并行數(shù)據(jù)總線)。
使用方法:
set_bus_skew 1.2 [get_ports data_bus[*]]
數(shù)值為總線內(nèi)任意兩個信號的最大允許延時差,防止因布線長度差異導(dǎo)致的采樣錯誤
18. set_case_analysis(設(shè)置信號為固定數(shù)值)
含義:強制指定信號為恒定值(0或1),用于簡化邏輯分析或驗證特定工作模式。使用方法:
set_case_analysis 1 [get_ports enable] # 強制enable信號為高電平
常用于排除未使用的邏輯分支,優(yōu)化綜合結(jié)果
19. group_path(時序路徑分組)
含義:將相似路徑歸類,便于集中設(shè)置時序約束或查看分析報告。使用方法:
group_path -name axi_path -from [get_clocks axi_clk] -to [get_clocks axi_clk]
set_max_delay 10 [get_paths -group axi_path] # 為分組設(shè)置統(tǒng)一約束
提高約束管理效率,尤其適用于大型設(shè)計
20. set_disable_timing(中斷時序?。?/p>
含義:切斷特定邏輯單元間的時序弧(Timing Arc),工具將忽略該路徑的時序分析。
使用方法:
set_disable_timing -from A -to Y [get_cells mux1]
適用于冗余邏輯或測試模式下的無效路徑,避免誤導(dǎo)性時序違規(guī)報告
21. set_max_time_borrow(設(shè)置鎖存器借用時間)
含義:為鎖存器(Latch)指定最大允許的時間借用(Time Borrow),平衡前后級路徑延時。使用方法:
set_max_time_borrow 2 [get_cells latch1]
鎖存器可通過延長前級數(shù)據(jù)有效時間 “借用” 后級的時序余量,此命令限制最大借用值
-
指令
+關(guān)注
關(guān)注
1文章
623瀏覽量
37523 -
時序約束
+關(guān)注
關(guān)注
1文章
120瀏覽量
13960 -
Vivado
+關(guān)注
關(guān)注
19文章
857瀏覽量
71094
原文標(biāo)題:時序約束分析——vivado中常用指令介紹
文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設(shè)計論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
VIVADO時序約束及STA基礎(chǔ)
FPGA主時鐘約束詳解 Vivado添加時序約束方法
Xilinx FPGA編程技巧之常用時序約束詳解
Xilinx FPGA編程技巧之常用時序約束詳解
深入了解時序約束以及如何利用時序約束實現(xiàn)FPGA 設(shè)計的最優(yōu)結(jié)果
【時序約束資料包】培訓(xùn)課程Timing VIVADO
如何使用時序約束向?qū)?/a>
Vivado進行時序約束的兩種方式
常用時序約束介紹之基于ISE的UCF文件語法
Vivado時序約束中invert參數(shù)的作用和應(yīng)用場景
vivado中常用時序約束指令介紹
評論