Design Compiler
1.
DC默認的設計環境:同步時鍾,上升沿
2.
時鍾路徑划分以及判斷約束是否滿足步驟
三個步驟:a. 把需要綜合的設計拆分成時序路徑的組合
b. 計算每條路徑的延時
c. 用路徑延時和期望到達的時間作比較,判斷約束是否滿足
四條路徑
起始點:輸入端口(不包括時鍾端口),時鍾引腳
終點: 輸出端口(不包括時鍾端口),時序邏輯的輸入引腳(不包括時鍾引腳)
3.
設定時鍾的period,latency,transiton,uncertainty,還有對所有的輸入信號執行命令input delay,對所有的輸出信號執行命令 output delay。
對當前設計執行命令set_max_capacitance,set_max_transition,set_max_fanout
對每一個模塊執行命令set_max_area
4.
create_clock命令用於定義有特定周期和波形的時鍾對象,-period選項定義時鍾周期,而-waveform選項控制時鍾的占空比和起始邊沿。
下例指定端口Clk為時鍾類型,周期2ns,時鍾正邊沿開始於0ns,下降邊沿發生在1ns,通過改變下降沿的值,可以改變時鍾的占空比。
create_clock -period 2 -waveform [list 0 1] [get_ports Clk] 時鍾的單位由工藝庫定義,通過report_lib <lib_name> 或者 get_attribute<lib_name> time_unit_name 命令查看時鍾單位。
此時鍾的時鍾周期為2ns。如果creat_clock命令中沒有 -waveform 選項,則時鍾默認 rises at 0ns with 50% duty cycle 。
注意:
在某些情況下,模塊可能只包括組合邏輯,為定義這一模塊的延遲約束,可生成一個虛時鍾,並指定相對於虛時鍾的輸入和輸出延遲。也可選擇使用set_max_delay和set_min_delay來約束這樣的模塊。
create_generated_clock命令用於設計內部生成的時鍾。這一命令可用於描述作為主時鍾函數的分頻/倍頻時鍾。
create_generated_clock -name <clock name> -source <clock source> -divide_by <factor> | -multiply_by <factor>
5.
理想的時鍾有無限的驅動能力,zero rise/fall transtion times; zero skew; zero insertion delay or latency。
時鍾樹buffer 和skew balancing 是在CTS階段,CTS是在綜合后執行,用的是IC Compiler工具。在DC中,時鍾需要排除在設計規則約束(max_transition,max_capacitance)之外。
The recommended approach to dealing with clocks is to model estimated skew,latency and transition times during synthesis.
6.
set_clock_uncertainty -setup Tu [get_clocks CLK] Tu包括時鍾skew jitter margin
uncertainty 也可以用在時鍾域之間,set_clock_uncertainty -setup Tu -from <Clk1> -to <Clk2>
7.
clock latency可分為souce latency和network latency【 clock network delay = source latency + network latency , "clock network delay" seen in a default timing report】
source latency是這clock信號來源到芯片的clock輸入端的delay【source latency from the actual clock origin to the create_clock port or pin -used for either ideal or propagated clocks (post layout)】
network latency是指芯片clokc輸入端到flip-flop clock輸入的delay【network latency from the create_clock port or pin to the register clock pins 】
命令:create_clock -period 10 [get_ports CLK]
set_clock_latency -source -max 3 [get_clocks CLK]
set_clock_latency -max 1 [ get_clocks CLK ] #pre-layout
##set_propagated_clock [get_ports CLK] ## post-layout
8.
關於時鍾的約束
set_clock_latency命令用於定義在綜合時估計的時鍾插入延遲,這主要用於布圖前綜合和時序分析。所估計的延遲值是時鍾樹網絡插入(在布圖階段)產生延遲值的近似值。
set_clock_uncertainty命令讓用戶定義時鍾扭斜信息。基本上此命令用於給時鍾的建立和保持時間增加一定的余量。布圖前階段可比布圖后階段增加更多的余量。
強烈建議用戶在布圖前和布圖后階段都指定一定的余量,這樣做的主要原因是使芯片少受制造工藝偏差的影響。
set_clock_transition命令很有用,用於進行布圖前綜合和時序分析。這個命令使DC對時鍾端口或引腳使用指定的轉換值(因為時鍾網絡伴有大的扇出,所以在布圖前為時鍾信號的轉換時間設定一個固定值是必要的)
set_propagated_clock 用於當設計已完成時鍾樹網絡插入的布圖后階段。在這種情況下,將用傳統的延遲計算方法求出延時。
creat_clock -period 5 [get_ports Clk]
set CLOCK [get_clocks Clk]
set_clock_latency -source -max 4 $CLOCK
set_clock_latency -max 2 $CLOCK #######################(可被pro計算出來)
set_clock_transition -max 0.08 $CLOCK ##################(可被pro計算出來)
set_clock_uncertainty -setup 0.5 $CLOCK
#set_propagated_clock [get_ports Clk]
9.
setup:在時鍾到來之前,數據保持穩定不變的時間,如果建立時間不夠,數據將不能在這個時鍾上升沿被打入觸發器。
(Tclock>Tclock_q_max+Tlogic_max+Tseup+Tskew)(Tskew考慮時鍾樹向后偏斜的情況)
hold:在時鍾到來之后,數據保持穩定不變的時間, 如果保持時間不夠,數據同樣不能被打入觸發器。
(Tlogic_min+Tclock_q_min >Tskew+Thold)(Tskew考慮時鍾樹向前偏斜的情況)
數據到達時間:launch time +Tclka + Tco + Tdata
數據要求時間(setup):capture time + Tclkb - Tsetup
setup slack = T+Tskew - Tco -Tdata -Tsetup(負的skew)
數據要求時間(保持):capture time + Tclkb + Thold
hold slack = Tskew + Thold - Tco -Tdata (正的skew)
10.
降頻一般是可以解決setup violation的,但是如果出現hold violation, 如果負slack的值比較大,一般要修改設計或約束,如果負slack值較小,可以在P&R階段通過insert buffer 來fix掉
recovery:有些類似於setup檢查,是指撤銷復位時,rst變到非復位狀態的電平必須在clk之前一定的時間到來,可以保證clk在采樣時,DFF處於非復位狀態
removal:有些類似與hold檢查,但又不完全相同,它是指復位時,rst在clk到來之后還需要維持的時間,否則會出現復位不成功
clock skew:clock在不同時序器件clk腳上的時間差異叫做clock skew
clock uncertainty:clock在時序器件clk腳上的不確定性,包括clock jitter和clock skew兩部分的總和.
clock transition:clock信號的skew時間。分為上升沿時間和下降沿時間。
clock gating:指門控時鍾。由於低功耗的要求,有些模塊會停止工作。通過停掉clock減少這些模塊的耗電.
clock jitter:clock源是芯片外部管腳引入或是內部PLL產生的。clock的每個周期時間都會有微小的偏差,這種偏差叫做clock jitter.
clock latency:clock源到時序器件的clk腳的延遲叫做clock latency.
clock tree:從一個clock源出發,clock網絡經過多級buffer,到達每個時序器件的clk腳。為了保證從clock源到每個器件clk腳的延時相差不多,clock在布局布線時做成樹形網絡結構,叫做clock tree
11.
在布局布線前主要是滿足setup滿足時序要求,保持允許有一點時序不滿足,因為在布局布線后實際的延時會增加。
12.
set_input_delay 命令 用於輸入端口
set_input_delay -max 23.0 -clock CLK {datain}
set_inuput_delay -min 0.0 -clock CLK {datain}
上述兩條指令為信號datain指定了23ns的最大輸入延時約束和0ns的最小輸入延時約束,換言之,輸入信號datain的建立時間要求為7ns,而保持時間要求為0ns。
如果,-min和-max選項都被省略的話,最大和最小輸入延時規范使用相同的值。
13.
set_output_delay 命令 用於輸出端口,表示在時鍾邊沿到來之前數據有效所需要時間。
set_out_delay -max 19.0 -clock CLK {dataout}
為信號dataout指定19ns的輸出延時約束,這意味着在時鍾沿后11ns數據有效。
注意:1. 在布圖前階段,有時有必要對選擇的信號進行過緊約束以最大化建立時間,因此壓縮額外時序余量以減少綜合-布圖迭代次數。為了達到這一目的,可在上述命令中指定過緊的約束值而我“愚弄”DC。切記,過分地過緊約束設計將導致不必要的面積增大和功耗增加。
2.當布圖后利用原位優化設計修正保持時間違例時,也可使用負值【如 -0.5】提供額外的時序余量。
14.
set_dont_touch_network非常有用,通常用於時鍾網絡和復位,這個命令用於在時鍾引腳或端口上設置dont_touch屬性。注意設置這一屬性也會阻止DC為滿足DRC而緩沖連線。此外,任何與被設置為“dont_touch”的連線相接觸的門也將繼承dont_touch屬性。
dc_shell -t > set_dont_touch_network{CLK,RST}
注意:
1.假定有一個時鍾作為主時鍾輸入,並生成第二時鍾的模塊,如時鍾除法器邏輯,在這種情況下,應在模塊生成輸出端口上應用set_dont_touch_network,這會幫助阻止DC緩沖時鍾網絡。
2.如果一個設計包含門控時鍾電路並且在時鍾輸入設置了set_dont_touch_network屬性,就會阻止DC適當地緩沖門控邏輯,導致時鍾DRC違例。這對門控復位同樣成立。
15.
set_dont_touch用於在current_design、單元、引用或連線上設置don_touch屬性,這一命令經常用於模塊的層次化編譯過程中,它也能用於阻止DC推斷工藝庫中的某種類型單元。
dc_shell -t > set_dont_touch current_design
dc_shell -t > set_dont_touch [get_cells sub1]
dc_shell -t > set_dont_touch [ get_nets gated_rst]
注意這個命令可以用於包含備用門的模塊,這命令將指示DC不要去打亂(或優化)備用門模塊的實例。
set_dont_use命令通常設置在.synopsys_dc.setup環境文件中,這一命令有助於從工藝庫剔除用戶不願DC推斷的某類單元。
例如,使用上述命令,能從工藝庫中剔除名稱以“SDFF”或“RSFF”開頭的觸發器,如下所示:
dc_shell -t > set_dont_use [list mylib/SDFF* mylib/RSFF*]
16.
高級約束,這些約束包括指定虛假路徑、多周期路徑、最大和最小延遲等,需要注意的是,過多使用時序例外,如虛假路徑和多周期路徑會對運行時間產生極大的影響。
set_false_path用於指示DC忽視某一路徑的時序或優化。確定設計中的虛假路徑是關鍵。用於這一命令的有效起點和終點分別是輸入端口或時序元件的時鍾引腳和輸出端口或時序元件的數據引腳。另外,可使用開關 -through進一步明確某一路徑。
dc_shell -t > set_false_path -from in1 -through U1/Z -to out1
注意:當時序關鍵邏輯由於虛假路徑沒能通過靜態時序分析時,就使用這一命令。
17.
18.
參考文獻:
高級ASIC芯片綜合
E課網
DC user guide
http://www.eefocus.com/sunleijun/blog/10-09/195236_f7476.html