DC(三)——時鍾約束


時鍾約束相關概念

建立時間Tsetup:時鍾有效沿到來之前,數據需要保持穩定的時間,否則觸發器無法鎖存數據。
保持時間Thold:在時鍾有效沿到來之后,數據需要保持穩定的時間,否則觸發器無法鎖存數據。
亞穩態semi-stable state:在數據的建立時間和保持時間中對信號進行采樣,導致輸出無法預測的狀態。

時鍾樹屬性概念

時鍾樹相關屬性對於時鍾的影響如下圖所示。

時鍾偏移(clock skew):由於時鍾信號到不同寄存器之間存在的線網延時,導致時鍾分支信號在到達不同的寄存器的時鍾端口存在的相位差(考慮的對象是不同寄存器之間的延時,相對延時)。與時鍾頻率無關,與時鍾線長度、時鍾線驅動的時序單元負載電容、個數。

時鍾抖動(clock jitter):由於實際時鍾與理想時鍾的差異,導致實際時鍾存在不隨時間積累的時而超前時而滯后的抖動。與頻率無關,來源於熱噪聲、串擾、電磁干擾等因素。

時鍾轉換時間(transition):與理想時鍾的直接跳變不同,時鍾在高電平和低電平轉換是通過對電容的充放電實現翻轉,因此在跳變過程中存在點容充放電的時間。

時鍾的延時(latency):時鍾從時鍾源到寄存器的時鍾端口(絕對延時)的時間稱為時鍾的延時。包含兩種類型:

時鍾源延時(source latency | insertion delay):是時鍾信號從實際原點到模塊的時鍾端的延時,下圖中的3ns;

時鍾網絡延時(clock network latency):時鍾從模塊的時鍾端到寄存器時鍾端口的延時,下圖中的1ns。

時序路徑及約束

時序路徑

時序路徑是點到點的數據通路,數據沿時序路徑進行傳輸,每條時序路徑有一個起點和終點。時序路徑可以分為四條:輸入端口到寄存器寄存器到寄存器寄存器到輸出端口輸入端口到輸出端口詳見《靜態時序分析的基本概念和目的——3時序路徑與關鍵路徑》https://www.cnblogs.com/lizhiqing/p/12704545.html

時序路徑約束目的:約束時序路徑是為了滿足寄存器的建立時間和保持時間

路徑2(寄存器到寄存器)約束

數據從FF1的D端口傳輸至FF2的D端口,主要經歷的時間是觸發器的翻轉時間/轉換延時Tcq寄存器與寄存器之間的組合邏輯延遲Tco連線延遲等。

FF2的建立時間

要求:數據經過上述延時(觸發器的翻轉時間/轉換延時Tcq、寄存器與寄存器之間的組合邏輯延遲Tco、連線延遲)后到達FF2的D端口再加上FF2的建立時間需要小於一個時鍾周期。

否則,若延時過大,在下一個cycle的有效沿到達時,FF1的數據仍在傳輸,則上一cycleFF1的輸入數據無法在本cycle傳遞給FF2,數據可能無法滿足建立時間導致無法更新。

對時鍾進行建模后,上述延時(觸發器的翻轉時間/轉換延時Tcq、寄存器與寄存器之間的組合邏輯延遲Tco、連線延遲)所允許的最大范圍被確定。通過對時鍾進行建模后,該路徑的延時也被確定,DC將從單元庫中選擇單元來滿足這些延時的約束,如果性能最好的單元仍無法滿足建立時間要求,則DC會報錯,需要重新修改設計(修改約束或修改代碼)。

FF2的保持時間

要求:數據經過上述延時后到達FF2的D端不能小於某個值,否則會導致FF2采樣到FF1在本cycle的信號,導致FF2原應保存的FF1上個cycle的信號產生亞穩態。

保持時間一般能夠滿足,即傳輸延時一般大於觸發器的保持時間;即使無法滿足,可以在后盾版圖設計的時候采用在路徑添加緩沖器來增加延時。因此一般只注意建立時間,而不關注保持時間。

定義時鍾命令:

定義時鍾(虛擬時鍾除外),必須定義時鍾周期(-period,下列表達式中10為一個周期的時長)和時鍾源(get_port,下列表達式中clk為設計中的時鍾端口);同時還允許定義可選項(option),如占空比(duty cycle,如果要同時使用時鍾的兩個沿,占空比將影響時序的約束),時鍾偏移(offset/skew)和時鍾名字(clock name)等,可通過 man create_clock查看相關命令。

一旦定義了時鍾,就已經對寄存器之間的路徑進行了約束,可以用report_clock命令來查看定義的時鍾以及其屬性。如果僅定義時鍾周期對reg2reg進行約束會過於理想,需要再添加其他時鍾屬性,如時鍾偏移skew時鍾抖動jitter轉換時間transition延時latency等屬性,上述時鍾屬性詳見http://www.cnblogs.com/IClearner/p/6440488.html

create_clock -period 10 [get_ports clk]

定義生成時鍾命令2:

除了create_clock命令以外,還有create_generated_clock命令來創建產生的時鍾,如分頻后的時鍾。創建生成的時鍾時要指定時鍾的名字和端口,分頻數(倍頻數),生成時鍾的端口。

create_generated_clock -source clk2x -divied_by2 [get_pins clk]

定義虛擬時鍾(virtual clock):

有時需要創建虛擬時鍾用於說明相對於時鍾的I/O端口的延遲,虛擬時鍾在設計中不驅動觸發任何寄存器。下列命令為建立一個周期為10ns,名字為vclk的虛擬時鍾,虛擬時鍾在定義時不需要定義時鍾源

create_clock -period 10 -name vclk

 

路徑1(輸入端口到寄存器)約束

考慮模塊前后使用相同的時鍾CLK,若使用不同時鍾則不同。

FF2的建立時間和輸入的組合邏輯:

外部寄存器FF1在第一個cycle的有效沿發送數據給需要綜合的電路,在FF2在下一個cycle接收。其中需要綜合的FF2的建立時間Tsu和組合邏輯N的延時TN需要通過時序約束進行確定。因此需要在時序約束中明確FF1的翻轉延遲Tclk-q和外部的組合邏輯延時TM。因此可以明確得到當前路徑的滿足建立時間需要使等式(Tclk-Tclk-q+TM≥TN+Tsu)成立。若不成立,DC則會進行優化,選擇合適的單元進行綜合使其滿足約束;若無法滿足約束,DC則會報錯。因此需要明確待綜合電路的外部延時是多少。

 

定義單個輸入延時命令:

在輸入中設置的輸入延遲為Tclk-q+TM。如果已知輸入端口的外部電路延時(包括FF1的翻轉延時和外部組合邏輯M的延時),結合定義的時鍾clk,則可以方便的計算出留給待綜合電路從輸入到寄存器D端口所允許的最大延時。定義輸入延時的命令如下,指定了外部邏輯使用了4ns,若定義的時鍾周期為10ns,則內部組合邏輯的最大延時允許為10-4-Tsu。

set_input_delay -max 4 -clock clk [get_ports A]

以上為理想狀態下的輸入約束。在非理想情況下,需要考慮不確定因素,如時鍾抖動和偏移U外部的輸入延時D(包括前級寄存器翻轉和組合邏輯的延時),則允許的最大延遲為clk_period-D-U-Tsu

定義多個輸入端口延時命令:

可以使用下列命令對除時鍾外的所有輸入端口設置約束。其中[remove_from_collection [all_inptus] [get_ports clk]]表示從所有輸入端口中去除時鍾clk。若需要移除多個時鍾,可以使用 [remove_from_collection [all_inptus] [get_ports "clk1 clk2"]]

set_input_delay 3.5 -clock clk -max [remove_from_collection [all_inputs] [get_ports clk]]

路徑3(寄存器到輸出端口)約束

路徑3的理解方法與路徑1的相類似,就是將路徑1中的內部電路和外部電路調換位置。從時鍾波形上看就是從下一個cycle的有效沿減去外部電路的延時,從該時刻到前一個cycle的有效沿即是內部電路所允許的最大延時。

FF2翻轉時間和輸出的組合邏輯S

路徑3需要滿足FF2的翻轉延時Tclk-q和內部電路的組合邏輯延時TS,要在Tclk-TT(外部電路組合邏輯延時)-Tsu3(外部寄存器的建立時間)的范圍內,DC會選擇合適的單元組成內部電路和FF2使其滿足時序要求。

 

定義輸出端口延時命令:

在輸出約束中設計的輸出時間為TT+Tsu。通過輸出端口延時命令定義外部邏輯所使用的時間,DC會根據定義的時鍾計算內部電路所允許的時間范圍。假設外部電路的所有延時為5ns,定義的時鍾周期為10ns,那么FF2翻轉時間和組合邏輯S的延時應小於10-5=5ns。

set_output_delay -max 5 -clock clk [get_ports B]

同樣,上述是理想情況下的輸出延時,實際中需要考慮時鍾抖動和時鍾偏移等不確定因素。

輸入端口時序,輸出端口時序與時間預算(Time Budget)

在SoC設計中,由於電路規模大,通常會由多個團隊共同進行設計,每個設計團隊負責部分模塊的設計。然而設計者通常不知道每個模塊的外部輸入/輸出延時的建立要求(設計規格書中可能有也可能沒有)。

因此需要通過建立時間預算(Time Budget,預先確定外部輸入/輸出延時,從而方便輸入/輸出端口進行時序約束。通常有下述基本原則:DC要求對所有時間路徑進行約束,而不應在綜合時留有未加約束的路徑。可以假設輸入和輸出的內部電路(組合邏輯?)各使用時鍾周期的40%,那么存在20%的裕度用於前一級寄存器的翻轉時間后一級寄存器的建立時間

以上述比例進行舉例,對下圖電路的時鍾約束為:

create_clock -period 10 [get_ports clk]

set_input_delay -max 6 -clock clk [all_inputs]

remove_input_delay [get ports clk] #時鍾不需要輸入延遲約束

set_output-delay -max 6 -clock clk [all_outputs]

 如果設計中模塊的以前一級寄存器的輸出端Q來划分內外部電路的話,時間預算將會變為如下內容:

create_clock -period 10 [get_ports clk]

set_input_delay -max $Tclk-q -clock clk [all_inputs]

remove_input_delay [get ports clk] #時鍾不需要輸入延遲約束

set_output-delay -max [expr 10-$Tclk-q] -clock clk [all_outputs]

路徑4(輸入到輸出)約束

路徑4是組合邏輯的路徑,對於組合邏輯的約束可能需要虛擬時鍾的概念,組合邏輯存在兩種情況:

模塊中有時鍾

模塊中存在輸入端口到輸出端口,也存在時序邏輯(模塊中有時鍾)。輸入端口的寄存器和輸出端口的寄存器由同一個時鍾進行聯系,那么模塊內部組合邏輯F的延時TF需要在T-Tinput_delay-Toutput_delay的范圍內才能滿足時序約束。約束內容如下。對於多時鍾同步約束,需要修改相應的延時和時鍾,參考多時鍾同步時序約束同樣,還存在不確定時鍾因素。

set_input_delay 0.4 -clock clk -add_delay [get_ports B]

set_output_delay 0.2 -clock clk -add_delay [get_ports D]

set_max_delay $clk_period -from [get_ports B] to [get_ports D] #可無

純組合邏輯(模塊內部無時鍾)

需要使用虛擬時鍾。

 

DC中的時鍾約束

默認情況下,在邏輯綜合過程中一個時鍾需要驅動很多寄存器,但是DC並不會在在連線上加時鍾緩沖器(clock buffer)以加強驅動能力,而是將時鍾直接連接在寄存器的時鍾引腳上。換言之,對於高扇出(high fanout)的時鍾連線,DC不會對其進行設計規則的檢查和優化,通常由后端工具在時鍾連線上加時鍾緩沖器,或做時鍾樹的綜合(clock tree synthesis),后端工具根據整個設計的物理布局(placement)數據,進行時鍾樹的綜合。綜合后的時鍾樹將滿足skew,latency和transition的目標,如下左圖為理想情況下的時鍾樹不確定因素全為0,右圖為實際的時鍾樹。

 為在綜合過程中表現出時鍾的不確定因素,可以在DC約束中設置時鍾的不確定因素。邏輯綜合中通常會給時鍾加上dont_touch的約束,使得DC在綜合時不會給時鍾網絡加入BUFFER以滿足skew的要求(PPT與ICer說法矛盾)。時鍾網絡通常在布局布線階段進行時鍾樹綜合(CTS),命令為:

set_dont_touch_network [get_clocks clk]

時鍾偏移(skew)和抖動(jitter)的建模

命令為set_clock_uncertainty,可以對時鍾的偏移和抖動進行建模。通常只約束建立時間,在考慮時鍾偏移時,需要寄存器之間的組合邏輯的延時更大

建立時間的偏移set_clock_uncertainty -setup 0.5 [get_clocks clk]

保持時間的偏移set_clock_uncertainty -hold 0.5 [get_clocks clk]

上升沿和下降沿的偏移set_clock_uncertainty -rise 0.2 -fall -0.5 [get_clocks clk]

時鍾轉換(transition)時間建模

命令為set_clock_transition,默認的上升轉換時間為電壓的20%上升至80%的時間下降的轉換時間為電壓的80%下降至20%的時間。若命令中不加開關選項‘-setup’和‘-hold’,那么將給時鍾上升和下降賦予相同的轉換時間。通常只約束最大的轉換時間,使用-max命令。

set_clock_transition -max 0.2 [get_clocks clk]

時鍾延遲(latency)的建模

命令為set_clock_latency。如上述概念所述,latency包含source latency和network latency,二者需要分開進行約束。在DC過程中通常僅對source latency進行建模,network latency在布局布線后可以計算得出。

通常情況下對最大的延時進行約束,在命令中加入‘-max’。

對時鍾源延時進行約束:set_clock_latency -source 3 [get_clocks clk]

布局布線前對network latency的約束:set_clock_latency 3 [get_clocks clk]

在布局布線后可以計算實際的network latency,使用該命令代替上述命令:set_propagated_clock 2 [get_clocks clk]

參考文獻:

https://www.cnblogs.com/IClearner/p/6624722.html


免責聲明!

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



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