timequest靜態時序分析學習筆記之命令約束


第二章 約束命令

 

Timequest共包括13條約束命令(從timequest工具constrants下拉菜單可選的約束命令,實際不止這么多),分別是:

   Creat clock

   Creat generated clock

   Set clock lantency

   Set clock uncertainty

   Set clock groups

   Remove clocks

   Set input delay

   Set output delay

   Set false path

   Set multicycle path

   Set muximum delay

   Set minimum delay

   Set muximum skew

各個約束命令說明

2.1 Create_clock 

  兩個作用:(page73

    1,約束從外部進入FPGA的時鍾。

    2,創建虛擬時鍾,虛擬時鍾是指外部IC芯片用到的時鍾,它們不是FPGA內部的時鍾域。Create_clock不能用於約束FPGA內部的時鍾。(page74在約束命令都是添加在SDC文件里面,所以們得先創建一個SDC文件,通過timequestcronstraints下拉菜單的generated SDC file選項可以生成。而我添加每一條命令都是通過quartus Edit下拉菜單insert constraint選項添加的。

我們選擇通過quartus Edit下拉菜單insert constraint選項添加Create_clock約束命令,彈出如圖11的會話框,Clock name 指你想約束的時鍾名稱,任意起,不過最好根據自己設計的模塊起,便於分析閱讀,不然時鍾多了,自己都不知道哪個時鍾是哪個模塊的。

  Period 約束時鍾的周期

  Rising 指時鍾上升沿的開始時間

  Falling 指時鍾下降沿的開始時間

 

 

11

  Targets 指你想約束的哪個FPGA 管腳。

  SDC command就是要添加到SDC文件里面的約束命令。

  通過圖11會話框的選項添加到SDC的約束命令如圖39行。

2.2 Creat generated clock

  Create_generated_clock的作用:page74

    1,約束PLL。(約束命令derive_pll_clocks

    2,同步輸出時鍾,約束FPGA芯片輸出到外部的時鍾。

    3,時鍾多路復用器(clock muxes

    4ripple clocks,該時鍾是FPGA內部一個寄存器的輸出做為另一個寄存器的時鍾,如通過計數產生的時鍾,源寄存器需要一個已經產生的時鍾,不然ripple clock將不會約束成功。

  我們選擇通過quartus Edit下拉菜單insert constraint選項添加Create_clock約束命令,彈出如圖12的會話框

 

12 Create_generated_clock

    Sorce 源時鍾,指輸入時鍾,用於給被約束時鍾提供時鍾源,這個時鍾往往是已經存在的時鍾,如由之前的Create_clock產生的時鍾。

    Divide by 對源時鍾分頻

    Phase 對源時鍾進行相移

    Multiply by 對源時鍾倍頻

    Offset 對源時鍾進行偏移,這里是偏移多少個ns,而項移是偏移多少度

    Duty cycle 占空比

  圖12的會話框表示對管腳ext1_clk進行了約束,它的源時鍾是clk,約束后的名字是 ext1_clk

  與圖12對應的約束命令:

    create_generated_clock -name ext1_clk -source [get_ports {CLK}] [get_ports {ext1_clk}]

  當然,設計者根據自己的需求來進行約束,是否需要分頻、相移等。

2.3 set_clock_latency

  該約束命令用於板級的時鍾延遲,用於對FPGA輸入時鍾、外部虛擬時鍾(如外部IC的時鍾)以及反饋時鍾(指某個時鍾從FPGA芯片輸出然后又回到FPGA芯片)的約束。page86

  如圖13所示的latency type選項,set_clock_latency分為earlylate之分。

 

 

13 set_clock_latency

  Set_clock_latency約束命令有lateearly之分,late指最大時鍾延遲,early指最小時鍾延遲。當進行setup slack分析時,由於set slack=data required time - data arrived time,所以late的延時會加到data arrived time里面,對源寄存器時鍾進行延時,early的延時會加到data required time里面,對目的寄存器時鍾進行延時;在進行hold slack分析時,由於hold slack = data arrived time - data required time里面,所以early的延時會加到data arrived time里面,對源寄存器時鍾進行延時,late的延時會加到data required time里面,對目的寄存器時鍾進行延時。

  上面這樣分析的目的是為了分析在最糟糕情況是否滿足時序約束。 而值得注意的是lateearly差值會添加到clock pessimism 里面。如下圖:這里late的值我設置的是3nseraly的值我設置的是1ns,上圖是沒有添加Set_clock_latency約束命令的報告,下圖是添加了Set_clock_latency約束命令的報告,然后觀察source latencyclock pessimism的值。

 

14 未添加Set_clock_latency

 

15 添加了Set_clock_latency

2.4 Set_clock_uncertainty

  約束命令set_clock_uncertainty針對時鍾出現的抖動(jitter),clock skew進行的約束。page86

 

16  Set_clock_uncertainty會話框

  通過會話框可以知道,該約束命令是對一個時鍾到另一個時鍾uncertainty的約束。另外,通過derive_clock_uncertainty命令也可以對時鍾uncertainty進行約束,實際上用這個約束命令會更好,因為用這個約束命令不需要設計者去算uncertainty是多少,而set_clock_uncertainty約束命令則需要自己去算,如下圖:

 

17

  注意,不是所有的FPGA都支持jitter分析的,有些FPGA系列芯片不支持derive_clock_uncertainty命令。比如cyclone ii系列就不支持。如果不能使用derive_clock_uncertainty命令的話,那么我們要怎么來知道時鍾抖動信息然后做出正確的約束就很重要了。

建議一般用derive_clock_uncertainty約束命令對時鍾的uncertainty進行約束。

  由於我們能在set input delayset output delay計算公式中添加clk skew信息,以及通過set clock latency添加時鍾延遲信息,加上Set_clock_uncertainty約束命令,這3種約束都能對clk skew進行約束,所以我們在添加約束命令時,不要重復添加clk skew約束。

2.5 set_clock_groups 

  對於有多個時鍾的設計中,可以用這個約束把相關的時鍾分成一個組,與其它不相關的時鍾區分開。這樣也避免timequest對相關的異步時鍾進行時序分析而帶來不必要的麻煩。比如我們如果用pll產生了大量的異步時鍾,而且這些時鍾不完全相關,那么我們就需要通過這些約束把pll產生的時鍾輸出分組。

 

圖 18

  如圖18,這個約束命令把時鍾分成了兩組,ext1_clkext1_clk_r是一組,clkext_div2ext2_clk是一組,這樣約束過后,timequest只對這兩個組內的時鍾域進行分析,兩個組間的時鍾路徑將不會分析。

2.6 set_input_delay

  set_input_delay是對外部IC輸入到FPGA管腳的約束,這個約束命令中的延遲信息需要設計者告訴timequest

 

 

 

19

  如圖19,外部IC時鍾是ext1_clkinput delay options選項中maximum用於setup slack分析,minimum用於hold slack分析,圖19下面76行和77行是通過set_input_delay會話框添加的約束命令,這兩條約束命令表示從外部ICFPGA輸入管腳Din[3:0]的最大延時是4ns,最小延時是2ns,外部IC時鍾是ext1_clk

  會話框中的add delay選項用於說明有另外的外部寄存器連接到端口,通常用於對雙倍速率接口的約束。 

對於雙倍速率接口的1/O約束通常這樣:

    set_input_delay -clock ext_clk -max 0.5 [get_ports {ddr_data[*]}] 

    set_input_delay -clock ext_clk -min -0.5 [get_ports {ddr_data[*]}] 

    set_input_delay -clock ext_clk -max 0.5 [get_ports {ddr_data[*]}] -clock_fall -add_delay 

    set_input_delay -clock ext_clk -min -0.5 [get_ports {ddr_data[*]}]-clock_fall -add_delay 

  這個約束告訴我們每一個ddr_data端口都是被兩個外部的寄存器驅動,一個是在ext_clk的上升沿鎖存,另一個是在ext_clk的下降沿鎖存,如果每沒有在最后兩行添加-add delay的話,最后兩行就會把開始兩行的約束覆蓋掉,timequest也會報出警告。

2.7 set_output_delay

  這個命令約束FPGA輸出到IC的延遲,其它都與set_input_delay一樣,不再多說。

 

20

  如圖208285行表示FPGA輸出管腳Dout2[3:0]Dout1[3:0]到時鍾為ext2_clk的外部IC輸入的最大延遲是4ns,最小延遲是2ns

2.8 set false path

  Set_false_path,該約束命令是告訴timequest不要分析某個路徑或者是某組路徑。

 

 

圖 21

  如圖21,該約束告訴timequest不要分析時鍾域clkext_div2之間的路徑。設計者在用該約束命令時一定要知道自己在做什么,如果某些路徑本身是不存在的,但是timequest在分析時把兩個不相關的時鍾域聯系了在一起並且這些路徑不滿足時序要求,如果設計者不知道的話,有可能會一直去糾結自己邏輯的問題或者是通過其它方式讓這些路徑滿足時序要求,但是這樣做不是正確的,我們應該用set false path約束命令把這些路徑給屏蔽掉,這樣做就不會出現錯誤了。

2.9 set_multicycle_path

  當兩個寄存器間的數據傳輸在一個周期內沒法完成時,我們可以通過該約束命令來改變他的建立關系值和保持關系值讓其滿足時序要求。

 

22

  首先我們看一下會話框,analysis typesetup影響setup relationship,hold影響hold relationship值,reference clock中的startend選項指以哪個時鍾周期來算setup relationshiphold relationship的值。

  然后我們再來看看setuphold是如何影響setup relationship值和hold relationship值的:

 

23

  Case1是在默認情況下的setup relationship值和hold relationship值,默認情況下 -setup的值是1和 -hold 的值是0, Case2我們把setup的值該為2,然后可以看到setup relationship值和hold relationship值都各自增加了10ns。從圖中可以看到,hold relationship的值要隨着setup值的改變而改變,有如下公式:

    setup relationship = default_setup_relationship + (MC_setup_value – 1) * clk_period (on timequest_user_guide page 50

    Holdrelationship = default_hold_relationship + (MC_setup_value – 1) * clk_period 

  可是我們可以發現,如果只通過setup值來改變setup relationship的值,而hold relationship值也跟着發生了改變,這樣hold 分析可能不滿足時序要求,接下來就講講analysis typehold選項的作用。

 

24

  看圖24case1 setup值為4hold值為0setup relationshiphold relationship的值分別從默認的10ns0ns變成了40ns30ns,我們再看后面3中情況,setup值保持不變,hold值從1增加到3的時候,setup relationship值一直保持不變,而hold relationship的值從30ns變成了0ns。從結果看得出這樣的結論:隨着hold值的增加,setup relationship保持不變,而hold relationship的值一直減小。

通過以上分析我們可以得出以下公式:

  1) analysis typesetupreference clockstart

    setup relationship = default_setup_relationship + ((MC_setup_value – 1) * launch_clk_period)

    Holdrelationship = default_hold_relationship + (MC_setup_value – 1) * launch_clk_period 

  2) analysis typesetupreference clockend

    setup relationship = default_setup_relationship + ((MC_setup_value – 1) * latch_clk_period) 

    Holdrelationship = default_hold_relationship + (MC_setup_value – 1) * latch_clk_period

  3) analysis typeholdreference clockstart

    hold relationship = default_hold_relationship - (MC_hold_value * launch_clk_period)

  4) analysis typeholdreference clockend

    hold relationship = default_hold_relationship - (MC_hold_value * latch_clk_period)

  特別說明:用該約束命令約束時,如某個路徑在一個時鍾周期內無法滿足時序要求,然后通過該約束命令讓這個路徑在3個時鍾周期內完成,比如讓setup relationshiphold relationship的值從默認的10ns0ns變成了30ns0ns,雖然通過約束讓自己的設計滿足了時序要求,但是我們要明白邏輯並不會這樣做,我們需要修改邏輯讓以前在一個時鍾周期內完成的操作現在通過3個時鍾周期來完成,這樣我們就完成了通過約束來知道邏輯問題出現在哪個地方,然后通過修改邏輯讓其滿足時序要求。

  下面2張圖是約束前后約束后的比較。Setup值是2

 

25 約束前

 

26 約束后

  從圖25和圖26可以setup relationshipslack的值的變化。

2.10 set muximum delayset minimum delay

  set_max_delay 影響setup relationshipset_min_delay影響hold relationshipset_max_delayset_min_delay存在2個危險:第一,一旦用這2個約束,下降沿采集將被忽略;第二,經過pll相移后的時鍾,使用這2個約束后,相移將被忽略。

  建議不要使用這2個命令對I/O進行約束。對I/O的約束,建議用set_input_delay/set_output_delayset_max_delayset_min_delay會直接將setup relationshiphold relationship的值限制成設定的值,而其它延時造成setup relationshiphold relationship的改變將無效

 

 

參考資料

 

1.FPGA那些事兒--TimeQuest靜態時序分析REV7.0.pdf

 

2.TimeQuest_User_Guide.pdf

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM