參考http://www.cnblogs.com/IClearner/p/6440488.html
一:時鍾/時鍾樹的屬性
1:時鍾樹:
一般的時鍾,我們都指的是全局時鍾,全局時鍾在芯片中的體現形式是時鍾樹。
時鍾樹,是個由許多緩沖單元(buffer cell)平衡搭建的時鍾網狀結構,如下圖所示:
首先不得不說,實際的時鍾除了周期/頻率、相位、沿、電平屬性外,還有其他的屬性,也就是:不是下面這樣子規規整整的:
為什么呢?那是因為時鍾有下面的屬性(“實際的buff”):
2:時鍾屬性
①時鍾的偏移(skew):時鍾分支信號在到達寄存器的時鍾端口過程中,都存在有線網等延時,由於延時,到達寄存器時鍾端口的時鍾信號存在有相位差,也就是不能保證每一個沿都對齊,這種差異稱為時鍾偏移(clock skew),也叫時鍾偏斜。時鍾的偏移如下圖所示:此外,時鍾skew與時鍾頻率並沒有直接關系,skew與時鍾線的長度及被時鍾線驅動的時序單元的負載電容、個數有關。
②時鍾抖動(jitter):相對於理想時鍾沿實際時鍾存在不隨時間積累的、時而超前、時而滯后的偏移稱為時鍾抖動,簡稱抖動,如下圖所示:
時鍾的抖動可以分為隨機抖動(Random Jitter,簡稱Rj)和固有抖動(Deterministic jitter):
·隨機抖動的來源為熱噪聲、Shot Noise和Flick Noise,與電子器件和半導體器件的電子和空穴特性有關,比如ECL工藝的PLL比TTL和CMOS工藝的PLL有更小的隨機抖動;
·固定抖動的來源為:開關電源噪聲、串擾、電磁干擾等等,與電路的設計有關,可以通過優化設計來改善,比如選擇合適的電源濾波方案、合理的PCB布局和布線。
也就是說:jitter與時鍾頻率無直接關系。
時鍾的偏移和時鍾的抖動都影響着時鍾網絡分枝的延遲差異(相位差異),在Design Compiler里面,我們用時鍾的不確定性(uncertainty)來表示這兩種情況的影響。
③時鍾的轉換時間(transition) :時鍾的上升沿跳變到下降沿或者時鍾下降沿跳變到上升沿的時間,這個時間並不是如左下圖所示那樣完全沒有跳變時鍾的,而是像右下圖那樣,時鍾沿的跳變時間就是時鍾的轉換時間(后面約束的時候會有相關的解釋)
時鍾的轉換時間與與單元的延時時間(也就是器件特性)還有電容負載有關。
④時鍾的延時(latency) :時鍾從時鍾源(比如說晶振)出發到達觸發器時鍾端口的延時,稱為時鍾的延時,包含時鍾源延遲(source latency)和時鍾網絡的延遲(network latency),如下圖所示:
時鍾源延遲(clock source latency),也稱為插入延遲(insertion delay),是時鍾信號從其實際時鍾原點到設計中時鍾定義點(時鍾的輸入引腳)的傳輸時間,上圖是3ns。
時鍾網絡的延遲( clock network latency)是時鍾信號從其定義的點(端口或引腳)到寄存器時鍾引腳的傳輸,經過緩沖器和連線產生的延遲(latency),上圖是1ns。
二:DC中的時鍾約束
我們用下面的命令建立時鍾那幾個屬性模型:
create_cloclk、set_clock_uncertainty、set_clock_latency、set_clock_transition分別進行時鍾的周期、偏移、延時、轉換約束。
1:時鍾偏差的建模
set_clock_uncertainty:對時鍾的偏移與抖動進行建模,也就是對時鍾的偏差進行建模。
create_clock -period 10 [get_ports CLK]
set_ clock_ uncertainty -setup 0.5 [get_clocks CLK]
理想的時鍾
只對建立時間的偏差時鍾建模
對建立時間和保持時間都進行偏差建模
在默認的情況下,"set-clock_uncertainty”命令如果不加開關選項“-setup”或“-hold",那么該命令給時鍾賦予相同的建立和保持偏差值。
這是一種對偏差建模的方式,也就是對建立時間和保持時間進行建模的方式;除此之外,還可以對時鍾的上升沿和下降沿進行偏差建模,比如上升沿的偏差是0.2ns,下降沿的偏差是0.5ns,則有:
set_ clock_ uncertainty -rise 0.2 -fall 0.5 [get_clocks CLK]
一般情況下,我們只約束建立時間,也就是只用第一種方式進行時鍾偏差建模。
當對建立時間偏差建模之后,這時,時鍾周期、時鍾偏差和建立時間的關系如下圖所示
假設時鍾周期是10ns,建立時間偏差是0.5ns,觸發器的建立時間是0.2ns,這時候從圖中就可以看到,留給寄存器間的路徑的裕量就減少了,也就是說,對寄存器間的約束就變得更加嚴格了,寄存器的翻轉延時、組合邏輯延時與線網延時等這些延時的和必須小於9.3ns,否則就違反了FF2的建立時間。這一點是要注意的。
2:時鍾轉換時間的建模
由於時鍾並不是理想的方波,用set_ clock_ transition來模擬時鍾的轉換(transition)時間。默認的上升轉換時間為從電壓的20%上升至80%的時間,下降的轉換時間為從電壓的80%下降至20%的時間。如果set_clock_transition命令中不加開關選項“-setup”或“-hold" ,那么該命令給時鍾賦予相同的上升和下降轉換時間。一般情況下,我們只約束最大的轉換時間,如最大轉換時間是0.2ns,那么就加上-max選項:
set_clock_transition -max 0.2 [get_clocks CLK]
3:時鍾延遲的建模
時鍾從時鍾源(比如說晶振)出發到達觸發器時鍾端口的延時,稱為時鍾的延時,包含時鍾源延遲(source latency)和時鍾網絡的延遲(network latency)。我們使用set_clock_latency進行時鍾延時的建模。一般情況下,我們把時鍾源延遲(source latency)和時鍾網絡的延遲(network latency)分開來,因為時鍾源延時需要建模,是因為DC是真的不知道這延時是多大,但是對於時鍾網絡的延遲,DC在布局布線前不知道,但是在布局布線后就可以計算出來時鍾網絡的延時了,因此在布局布線之后進行綜合時,就沒有必要對時鍾網絡進行延時,因此就要把這兩個延時分開來進行約束。
先說布局布線之前:時鍾周期為10ns,時鍾源到芯片的時鍾端口時間是3ns,時鍾端口都內部觸發器的時間是1ns,如下圖所示,
那么就用下面的命令進行建模:
create_clock -period 10 [get-ports CLK]
set_clock_latency -source 3 [get_clocks CLK]
set_clock_latency 1 [get_clocks CLK]
布局布線之后:就可以計算實際的線網延時,就要使用
set_propagated_clock [ get_clocks CLK]
set_clock_latency 1 [get_clocks CLK]這個命令代替上面的命令。
3:總結
基本的時鍾建模就OK了,下面進行總結並給出我們這個例子中使用的約束腳本,理想時鍾和實際時鍾的對比,如下圖所示:
因此總結就是,對實際時鍾的建模/約束如下所示: