上次介紹了sdc的基本概念摸柄,那接下來幾期伺绽,我們來講解一些比較常用的sdc命令往声。雖然sdc大大小小有上百條命令慈迈,但實際常用的其實就那么10幾條若贮。今天我們來介紹下與時鐘相關的命令。主要有以下命令:
create_clock
create_generated_clock
set_clock_uncertainty
set_clock_groups
任何sdc首先定義的都是時鐘痒留,對于一個同步電路而言谴麦,緩存器和緩存器之間的路徑延遲時間必須小于一個Clock 周期(Period),也就是說伸头,當我們確認了Clock 規(guī)格匾效,所有緩存器間的路徑的Timing Constraint 就會自動給定了。Clock規(guī)格主要包含Waveform恤磷、Uncertainty和Clock group的定義面哼。我們把它們稱為時鐘的三要素,當然創(chuàng)建任何時鐘都要檢查一下這三者有沒有正確定義扫步。
create_clock
主要定義一個Clock的source源端魔策、周期、占空比(時鐘高電平與周期的比例)及信號上升沿及下降沿的時間點河胎。
來看一個最簡單的例子:
這個時鐘描述成sdc語句就是:
create_clock -name SYSCLK -period 20 \
-waveform {0 5} [get_ports2 SCLK]
waveform后面跟上升沿和下降沿的時間
-waveform {time_rise time_falltime_rise time_fall ...}
如果沒指定-period,默認的waveform為{0, period/2}
create_generated_clock
generated clocks是另外一個重要的時鐘概念
generated clocks 是從master clock中取得的時鐘定義闯袒。master clock就是指create_clock命令指定的時鐘產(chǎn)生點,如圖所示:
我們可以用如下命令來描述generated clocks:
#定義master clock
create_clock -name CLKP -period 10 \
-waveform {0 5} [get_pins UPLL0/CLKOUT]
#在Q點定義generated clock
create_generated_clock -name CLKPDIV2 \
?-source UPLL0/CLKOUT? \
-master_clock?CLKP ?-divide_by 2 [get_pins UFF0/Q]
一般我們把時鐘的源頭會定義成create_clock,而分頻時鐘則會定義為create_generated_clock. 兩者的主要區(qū)別在于CTS步驟政敢,generated clock并不會產(chǎn)生新的clock domain, 而且定義generated clock后原茅,clock path的起點始終位于master clock, 這樣source latency并不會重新的計算。這是定義generated clock的優(yōu)點所在堕仔。
Virtual clock
這邊還有一個經(jīng)常用的概念就是Virtual Clock擂橘,虛擬時鐘。
前面介紹的create_clock摩骨,create_generated_clock?都是real clock通贞。而virtual clock則不掛在任何port或者pin上,只是虛擬創(chuàng)建出來的時鐘恼五。如下所示:
#定義虛擬時鐘
create_clock -name VCLK -period 10 -waveform {0 5}
我們通常會把input/output delay掛在virtual clock上昌罩,因為input/output delay約束本來就是指片外的時鐘,所以掛在虛擬時鐘上較為合理灾馒。當然如果要省事情茎用,直接掛在real clock上也是可以的。
set_clock_uncertainty
主要定義了Clock信號到時序器件的Clock端可能早到或晚到的時間睬罗。主要是用來降低jitter對有效時鐘周期的影響轨功。值得注意的是,在setup check中容达,clock uncertainty是代表著降低了時鐘的有效周期古涧;而在hold check中,clock uncertainty是代表著hold check所需要滿足的額外margin花盐。
來看下面一條reg2reg path. 對照著如下時鐘波形圖羡滑。可以寫出下面的約束算芯。
set_clock_uncertainty-from VIRTUAL_SYS_CLK \
-to SYS_CLK -hold 0.05
set_clock_uncertainty -from VIRTUAL_SYS_CLK \
-to SYS_CLK -setup 0.3
set_clock_uncertainty -from SYS_CLK \
-to CFG_CLK -hold 0.05
set_clock_uncertainty -from SYS_CLK \
-to CFG_CLK -setup 0.1
set_clock_groups
定義完時鐘后柒昏,我們也需要通過設置clock group來確認各個時鐘之間的關系。這是很重要的一步熙揍,因為通常我們還需要做cross domain check职祷,如果clock group設錯了,會導致整個STA檢查錯誤诈嘿。一般有三個選項:asynchronous堪旧,physically_exclusive和logically_exclusive。
asynchronous代表兩個異步的clock group
physically_exclusive代表兩個clock group在物理意義上相互排斥奖亚,比如在一個source pin上定義了兩個時鐘淳梦。
logically_exclusive代表兩個clock group在邏輯上相互排斥,比如兩個clock經(jīng)過MUX選擇器昔字。一個簡單的例子:
set_clock_groups -physically_exclusive \
-group {CLK1 CLK2}?-group {CLK3 CLK4}
clock group的定義異常謹慎爆袍,需要和前端再三確認首繁。
原文鏈接:https://mp.weixin.qq.com/s?__biz=MzI1MzAyNTA1Mg==&mid=2652112823&idx=1&sn=8c21159379d408c7a2ca5b7a8c0abe33&chksm=f23a69c4c54de0d239848e310f27125d0c7ba811782334f929ed157d55aa736a5ae953da6781&scene=21#wechat_redirect