Synopsys設(shè)計約束

1. 設(shè)計約束

上一節(jié)描述了設(shè)計環(huán)境的約束:

https://mp.weixin.qq.com/s?__biz=Mzg4OTIwNzE4Mg==&mid=2247483754&idx=1&sn=cf8dc9f5649ecdf7a769d576a1339be5&chksm=cfee218bf899a89d6c7442adbf16c7d7093517d4dc7c0ff7913119ea3b7aca82741dd9e1fb86&token=1433471869&lang=zh_CN#rd?mp.weixin.qq.com

而設(shè)計約束描述了設(shè)計目標(biāo),它們可包括時序或面積約束。不實際的規(guī)范會導(dǎo)致面積增大、功耗增加和/或時序惡化,所以設(shè)計人員必須指定實際的約束。

create_clock命令用于定義有特定周期和波形的時鐘對象。-period選項定義時鐘周期,而-waveform選項控制時鐘的占空比和起始邊沿。這個命令用于引腳或端口對象類型。

下例指定端口CLK為“時鐘”類型,其周期為40ns,占空比為50%。時鐘正邊沿開始于0ms,下降邊沿發(fā)生在20ns。通過改變下降沿值,可改變時鐘占空比。

create_clock -period 40 -waveform [list 0 20] CLK

create_generated_clock命令用于設(shè)計內(nèi)部生成的時鐘,可以描述作為主時鐘函數(shù)的分頻/倍頻時鐘。

create_generated_clock -name <clock name>

-source <clock source>

-divide_by <factor> | multiply_by <factor>

set_dont_touch_network是一個非常有用的命令,通常用于時鐘網(wǎng)絡(luò)的復(fù)位。這個命令用于在時鐘引腳或端口上設(shè)置dont_touch屬性。注意設(shè)置這一屬性也會阻止DC為滿足DRC而緩沖連線。此外,任何與被設(shè)置為“dont_touch”的連線相接觸的門也將繼承dont_touch屬性。

set_dont_touch用于在current_design、單元、引用或連線上設(shè)置dont_touch屬性。這一命令經(jīng)常用于模塊的層次化編譯過程中,它也能用于阻止DC推斷工藝庫中的某種類型單元。

例:

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)境文件中,這一命令有助于從工藝庫中剔除用戶不愿DC推斷的某類單元。

set_input_delay指定相對于時鐘的信號輸入到達時間。它用于輸入端口,指定在時鐘沿后數(shù)據(jù)穩(wěn)定所需的時間。設(shè)計的時序規(guī)范通常包括這樣的信息,如輸入信號的建立/保持時間要求。如果給定設(shè)計的頂層時序規(guī)范,也可通過用自頂向下的編譯方法或設(shè)計預(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}

在下圖中,相對于占空比為50%,周期為30ns的時鐘信號CLK,為信號data_in指定了23ns的最大輸入延時約束和0ns的最小輸入延時約束。換言之,輸入信號data_in的建立時間要求為7ns,而保持時間要求為0ns。

set_output_delay命令用于在輸出端口定義在時鐘邊沿到來之前數(shù)據(jù)有效所需時間。

dc_shell > set_output_delay -max 19.0 -clock CLK {data_out}

set_clock_latency命令用于定義在綜合時估計的時鐘插入延遲,這主要用于布圖前綜合和時序分析。所估計的延遲值是時鐘樹網(wǎng)絡(luò)插入(在布圖階段)產(chǎn)生的延遲的近似值。

dc_shell > set_clock_latency 3.0 [get_clocks CLK]

set_clock_uncertainty命令讓用戶定義時鐘扭曲(clock skew)信息。

dc_shell > set_clock_uncertainty -setup 0.5 -hold 0.23 [get_clocks CLK]

set_clock_transition命令用于進行布圖前綜合和時序分析。這個命令使DC對時鐘端口或引腳使用指定的轉(zhuǎn)換值。

set_propagated_clock用于當(dāng)設(shè)計已完成時鐘樹網(wǎng)絡(luò)插入的布圖后階段。在這種情況下,將使用傳統(tǒng)的延遲計算方法求出延時。

2. 高級約束

以上和之前的一節(jié)主要介紹的是常用約束。下面介紹的是額外的一些設(shè)計約束,包括指定虛假路徑、多周期路徑、最大和最小延遲等。此外,還討論了為額外優(yōu)化而組合時序關(guān)鍵路徑的過程。

set_false_path用于指示DC忽視某一路徑的時序或優(yōu)化。確定設(shè)計中的虛假路徑是關(guān)鍵,否則會迫使DC優(yōu)化所有路徑,關(guān)鍵時序路徑可能受到不利的影響。

用于這一命令的有效起點和終點分別是輸入端口或時序元件的時鐘引腳和輸出端口或時序元件的數(shù)據(jù)引腳。另外可使用-through進一步明確某一路徑。

dc_shell > set_false_path -from in1 -through U1/Z -to out1

set_multicycle_path用于告知DC通過某一路徑到達其終點所需的時鐘周期數(shù)。DC自動假定所有路徑都是單周期路徑,同時不必為了獲取時序而試圖優(yōu)化多周期段。

set_max_delay定義某一路徑按照時間單位所需的最大延遲。通常它用于只包含組合邏輯的模塊。然而,它也用于約束多個具有不同頻率時鐘驅(qū)動的模塊。

雖然Synopsys建議每個模塊只定義一個時鐘,而在某些情況下一個模塊可包含多個時鐘,每個時鐘具有不同的頻率。為了約束這種模塊,通常可用create_clock和set_dont_touch_network命令來定義模塊中的所有時鐘。然而信號相對于每個時鐘的輸入延時賦值會變得很冗長。為避免這一情況,另一種方法就是用通用的方法定義第一個時鐘,而通過set_max_delay命令約束其他時鐘:

dc_shell > set_max_delay 0 -from CLK2 -to [all_registers -clock_pins]

set_min_delay是與set_max_delay相對的命令,它用于定義某一路徑按照時間單位所需的最小延遲。

dc_shell > set_min_delay 3 -from [all_inputs] -to [all_outputs]

group_path命令用于將設(shè)計中的時序關(guān)鍵路徑綁定到一起以進行代價函數(shù)計算。組合能使組合路徑優(yōu)先于其他路徑。這一命令有不同的選項,包括關(guān)鍵范圍和權(quán)重的規(guī)范。

dc_shell > group_path -to [list out1 out2] -name group1

——添加太多組合對編譯時間有顯著的影響,因此只作為最后的手段使用;

——這一命令有可能增加設(shè)計中最差違例路徑的延遲,這是由于DC使設(shè)計中的組合路徑優(yōu)先于其他路徑。為改善整個代價函數(shù),DC將盡力優(yōu)化組合路徑,然而可能惡化另一組的最差違例的時序。

參考文獻:

https://book.douban.com/subject/2150040/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容