1. 設(shè)計(jì)約束
上一節(jié)描述了設(shè)計(jì)環(huán)境的約束:
而設(shè)計(jì)約束描述了設(shè)計(jì)目標(biāo),它們可包括時(shí)序或面積約束。不實(shí)際的規(guī)范會(huì)導(dǎo)致面積增大、功耗增加和/或時(shí)序惡化,所以設(shè)計(jì)人員必須指定實(shí)際的約束。
create_clock命令用于定義有特定周期和波形的時(shí)鐘對(duì)象。-period選項(xiàng)定義時(shí)鐘周期,而-waveform選項(xiàng)控制時(shí)鐘的占空比和起始邊沿。這個(gè)命令用于引腳或端口對(duì)象類型。
下例指定端口CLK為“時(shí)鐘”類型,其周期為40ns,占空比為50%。時(shí)鐘正邊沿開(kāi)始于0ms,下降邊沿發(fā)生在20ns。通過(guò)改變下降沿值,可改變時(shí)鐘占空比。
create_clock -period 40 -waveform [list 0 20] CLK
create_generated_clock命令用于設(shè)計(jì)內(nèi)部生成的時(shí)鐘,可以描述作為主時(shí)鐘函數(shù)的分頻/倍頻時(shí)鐘。
create_generated_clock -name <clock name>
-source <clock source>
-divide_by <factor> | multiply_by <factor>
set_dont_touch_network是一個(gè)非常有用的命令,通常用于時(shí)鐘網(wǎng)絡(luò)的復(fù)位。這個(gè)命令用于在時(shí)鐘引腳或端口上設(shè)置dont_touch屬性。注意設(shè)置這一屬性也會(huì)阻止DC為滿足DRC而緩沖連線。此外,任何與被設(shè)置為“dont_touch”的連線相接觸的門也將繼承dont_touch屬性。
set_dont_touch用于在current_design、單元、引用或連線上設(shè)置dont_touch屬性。這一命令經(jīng)常用于模塊的層次化編譯過(guò)程中,它也能用于阻止DC推斷工藝庫(kù)中的某種類型單元。
例:
set_dont_touch current_design
set_dont_touch [get_cells subs]
set_dont_touch [get_nets gated_rst]
set_dont_use命令通常設(shè)置在.synopsys_dc.setup環(huán)境文件中,這一命令有助于從工藝庫(kù)中剔除用戶不愿DC推斷的某類單元。
set_input_delay指定相對(duì)于時(shí)鐘的信號(hào)輸入到達(dá)時(shí)間。它用于輸入端口,指定在時(shí)鐘沿后數(shù)據(jù)穩(wěn)定所需的時(shí)間。設(shè)計(jì)的時(shí)序規(guī)范通常包括這樣的信息,如輸入信號(hào)的建立/保持時(shí)間要求。如果給定設(shè)計(jì)的頂層時(shí)序規(guī)范,也可通過(guò)用自頂向下的編譯方法或設(shè)計(jì)預(yù)算方法提取出子模塊的這些信息。
dc_shell > set_input_delay -max 23.0 -clock CLK {data_in}
dc_shell > set_input_delay -min 0.0 -clock CLK {data_in}
在下圖中,相對(duì)于占空比為50%,周期為30ns的時(shí)鐘信號(hào)CLK,為信號(hào)data_in指定了23ns的最大輸入延時(shí)約束和0ns的最小輸入延時(shí)約束。換言之,輸入信號(hào)data_in的建立時(shí)間要求為7ns,而保持時(shí)間要求為0ns。
set_output_delay命令用于在輸出端口定義在時(shí)鐘邊沿到來(lái)之前數(shù)據(jù)有效所需時(shí)間。
dc_shell > set_output_delay -max 19.0 -clock CLK {data_out}
set_clock_latency命令用于定義在綜合時(shí)估計(jì)的時(shí)鐘插入延遲,這主要用于布圖前綜合和時(shí)序分析。所估計(jì)的延遲值是時(shí)鐘樹(shù)網(wǎng)絡(luò)插入(在布圖階段)產(chǎn)生的延遲的近似值。
dc_shell > set_clock_latency 3.0 [get_clocks CLK]
set_clock_uncertainty命令讓用戶定義時(shí)鐘扭曲(clock skew)信息。
dc_shell > set_clock_uncertainty -setup 0.5 -hold 0.23 [get_clocks CLK]
set_clock_transition命令用于進(jìn)行布圖前綜合和時(shí)序分析。這個(gè)命令使DC對(duì)時(shí)鐘端口或引腳使用指定的轉(zhuǎn)換值。
set_propagated_clock用于當(dāng)設(shè)計(jì)已完成時(shí)鐘樹(shù)網(wǎng)絡(luò)插入的布圖后階段。在這種情況下,將使用傳統(tǒng)的延遲計(jì)算方法求出延時(shí)。
2. 高級(jí)約束
以上和之前的一節(jié)主要介紹的是常用約束。下面介紹的是額外的一些設(shè)計(jì)約束,包括指定虛假路徑、多周期路徑、最大和最小延遲等。此外,還討論了為額外優(yōu)化而組合時(shí)序關(guān)鍵路徑的過(guò)程。
set_false_path用于指示DC忽視某一路徑的時(shí)序或優(yōu)化。確定設(shè)計(jì)中的虛假路徑是關(guān)鍵,否則會(huì)迫使DC優(yōu)化所有路徑,關(guān)鍵時(shí)序路徑可能受到不利的影響。
用于這一命令的有效起點(diǎn)和終點(diǎn)分別是輸入端口或時(shí)序元件的時(shí)鐘引腳和輸出端口或時(shí)序元件的數(shù)據(jù)引腳。另外可使用-through進(jìn)一步明確某一路徑。
dc_shell > set_false_path -from in1 -through U1/Z -to out1
set_multicycle_path用于告知DC通過(guò)某一路徑到達(dá)其終點(diǎn)所需的時(shí)鐘周期數(shù)。DC自動(dòng)假定所有路徑都是單周期路徑,同時(shí)不必為了獲取時(shí)序而試圖優(yōu)化多周期段。
set_max_delay定義某一路徑按照時(shí)間單位所需的最大延遲。通常它用于只包含組合邏輯的模塊。然而,它也用于約束多個(gè)具有不同頻率時(shí)鐘驅(qū)動(dòng)的模塊。
雖然Synopsys建議每個(gè)模塊只定義一個(gè)時(shí)鐘,而在某些情況下一個(gè)模塊可包含多個(gè)時(shí)鐘,每個(gè)時(shí)鐘具有不同的頻率。為了約束這種模塊,通常可用create_clock和set_dont_touch_network命令來(lái)定義模塊中的所有時(shí)鐘。然而信號(hào)相對(duì)于每個(gè)時(shí)鐘的輸入延時(shí)賦值會(huì)變得很冗長(zhǎng)。為避免這一情況,另一種方法就是用通用的方法定義第一個(gè)時(shí)鐘,而通過(guò)set_max_delay命令約束其他時(shí)鐘:
dc_shell > set_max_delay 0 -from CLK2 -to [all_registers -clock_pins]
set_min_delay是與set_max_delay相對(duì)的命令,它用于定義某一路徑按照時(shí)間單位所需的最小延遲。
dc_shell > set_min_delay 3 -from [all_inputs] -to [all_outputs]
group_path命令用于將設(shè)計(jì)中的時(shí)序關(guān)鍵路徑綁定到一起以進(jìn)行代價(jià)函數(shù)計(jì)算。組合能使組合路徑優(yōu)先于其他路徑。這一命令有不同的選項(xiàng),包括關(guān)鍵范圍和權(quán)重的規(guī)范。
dc_shell > group_path -to [list out1 out2] -name group1
——添加太多組合對(duì)編譯時(shí)間有顯著的影響,因此只作為最后的手段使用;
——這一命令有可能增加設(shè)計(jì)中最差違例路徑的延遲,這是由于DC使設(shè)計(jì)中的組合路徑優(yōu)先于其他路徑。為改善整個(gè)代價(jià)函數(shù),DC將盡力優(yōu)化組合路徑,然而可能惡化另一組的最差違例的時(shí)序。
參考文獻(xiàn):