DC使用教程系列2-时钟的概念与环境接口面积约束脚本
文章目錄
- 1、時鐘約束的概念
- 2、 DC中的時序約束
- 3、環(huán)境、設(shè)計規(guī)則和面積約束
- 3.1 環(huán)境設(shè)置選擇**set_operatting_condition**
- 3.2 設(shè)置線負(fù)載模型set_wire_load_model
- 3.3 設(shè)置驅(qū)動強度(set_driving_cell)
- 3.4 設(shè)置電容負(fù)載(set_load)
- 3.4 設(shè)置設(shè)計規(guī)則約束
- 3.5 面積約束
- 4 官方腳本解讀
- 1、 set lib_name cb13fs120_tsmc_max
- 2、current_design TOP
- 5、reset_design
- 9、set_clock_uncertainty 0.2 [get_clocks clk]
- 12 supressed_message UID-401
- 13 set_driving_cell -library $lib_name -lib_cell sdcfq1 [remove_from_collection [all _ inputs ] [get_ports clk] ]
- **什么是為設(shè)計指定輸入端口的驅(qū)動強度?**
- 14、 set_input_cell 0.1 -max -clock clk [remove_from_collection [all_inputs] [get_ports clk] ]
- 18、set_output_delay 1 -max -clock clk [all_outports]
- 命令掌握
- 參考文章
時間又拖拖拖,隨著追尋DFT的進(jìn)度,DC的進(jìn)度在經(jīng)歷了.dynopsys_dc.setup后,就停滯不前了,接下來本文就來介紹DC的約束篇目,在我理解來看vcs是不帶時序信息的,而DC就是盡量滿足符合實際工作環(huán)境來建立一個數(shù)字電路的模型,也就是說他會盡量的接近實際的工作環(huán)境來建立模型。所以約束,就有用了,不僅僅是環(huán)境約束,告訴DC綜合出來的芯片要工作在什么環(huán)境下面等等。
1、時鐘約束的概念
我們必須定義時鐘周期(也就是-period這個選項)和時鐘源(端口或引腳)(也就是設(shè)計中的clk),也可以加上一些可選項(option)來定義時鐘的占空因數(shù)(duty cycle),偏移(offset/skew)和時鐘名( clock name),我們可以通過man create_clock 來查看命令的相關(guān)選項。
一旦定義了時鐘,對于寄存器之間的路徑,我們已經(jīng)做了約束。我們可以用report_clock命令來查看所定義的時鐘以及其屬性。然而單單定義一個時鐘周期進(jìn)行約束寄存器與寄存器之間的路徑很顯然是過于理想的,需要再添加其他的時鐘屬性,在添加之前,需要知道時鐘的偏移(skew)、抖動(jitter)、轉(zhuǎn)換時間(transition)、延時(latency)這幾個概念和屬性。因為畢竟現(xiàn)實中不是理想的時鐘,包括時鐘的0->1或者1->0這些跳變都是需要一定的時間。
同步電路的理解
看是不是同步電路,以本博主的觀念來看,關(guān)鍵還是看兩個domain的時鐘是否具備了某種固定關(guān)系。當(dāng)然百度百科上面說的是最簡單的一種,情況,有的概念,個人覺得也未必就是對的,畢竟在抄抄抄環(huán)境下。所以本博主認(rèn)為關(guān)鍵還是看兩個domain的時鐘是否具備了某種固定關(guān)系。
比如說,來自于兩個時鐘源,但這兩個時鐘源頻率一樣,相位一樣,那就是同步(當(dāng)然,不太可能兩個晶振不可能同時發(fā)出相位一樣的時鐘)。再來,一個時鐘經(jīng)過了分頻電路,是2與4倍關(guān)系,那每個大周期都固定的包含了小周期的是時鐘,所以也是同步,但是三倍頻率,那就不同步了,因為你現(xiàn)在的周期,與另一個周期,在每個周期上的相位并不是固定的某種關(guān)系。
時鐘樹的概念
時鐘樹,是個由許多緩沖單元(buffer cell)平衡搭建的網(wǎng)狀結(jié)構(gòu),它有一個源點,一般是時鐘輸入端(clock input port),也有可能是design內(nèi)部某一個單元輸出腳(cell output pin),然后就是由一級一級的緩沖單元搭建而成,具體的多少級,根據(jù)你的設(shè)置以及所使用的單元而定,目的就是使所用終點的clock skew(一般最關(guān)心這個)、insertion delay以及transition了,滿足設(shè)計要求
①時鐘的偏移(skew):時鐘分支信號在到達(dá)寄存器的時鐘端口過程中,都存在有線網(wǎng)等延時,由于延時,到達(dá)寄存器時鐘端口的時鐘信號存在有相位差,也就是不能保證每一個沿都對齊,這種差異稱為時鐘偏移(clock skew),也叫時鐘偏斜。此外,時鐘skew與時鐘頻率并沒有直接關(guān)系,skew與時鐘線的長度及被時鐘線驅(qū)動的時序單元的負(fù)載電容、個數(shù)有關(guān),時鐘的偏移如下圖所示:
②時鐘抖動(jitter):相對于理想時鐘沿實際時鐘存在不隨時間積累的、時而超前、時而滯后的偏移稱為時鐘抖動,簡稱抖動,如下圖所示:
·隨機抖動的來源為熱噪聲、Shot Noise和Flick Noise,與電子器件和半導(dǎo)體器件的電子和空穴特性有關(guān),比如ECL工藝的PLL比TTL和CMOS工藝的PLL有更小的隨機抖動;
·固定抖動的來源為:開關(guān)電源噪聲、串?dāng)_、電磁干擾等等,與電路的設(shè)計有關(guān),可以通過優(yōu)化設(shè)計來改善,比如選擇合適的電源濾波方案、合理的PCB布局和布線。
jitter與時鐘頻率無直接關(guān)系
時鐘的偏移和時鐘的抖動都影響著時鐘網(wǎng)絡(luò)分枝的延遲差異(相位差異),在Design Compiler里面,我們用時鐘的不確定性(uncertainty)來表示這兩種情況的影響。
③時鐘的轉(zhuǎn)換時間(transition) :時鐘的上升沿跳變到下降沿或者時鐘下降沿跳變到上升沿的時間,這個時間并不是如左下圖所示那樣完全沒有跳變時鐘的,而是像下圖那樣,時鐘沿的跳變時間就是時鐘的轉(zhuǎn)換時間。
時鐘的轉(zhuǎn)換時間與與單元的延時時間(也就是器件特性)還有電容負(fù)載有關(guān)
④時鐘的延時(latency) :時鐘從時鐘源(比如說晶振)出發(fā)到達(dá)觸發(fā)器時鐘端口的延時,稱為時鐘的延時,包含時鐘源延遲(source latency)和時鐘網(wǎng)絡(luò)的延遲(network latency)
時鐘源延遲(clock source latency),也稱為插入延遲(insertion delay),是時鐘信號從其實際時鐘原點到設(shè)計中時鐘定義點(時鐘的輸入引腳)的傳輸時間,上圖是3ns。
時鐘網(wǎng)絡(luò)的延遲( clock network latency)是時鐘信號從其定義的點(端口或引腳)到寄存器時鐘引腳的傳輸,經(jīng)過緩沖器和連線產(chǎn)生的延遲(latency),上圖是1ns。
我以前也看到過在FPGA中用內(nèi)部的邏輯,自己手寫了一個分頻器,然后供給了別的時序邏輯的時鐘端口(在always的敏感列表里面),這種方式是不建議的。因為自己手寫的邏輯生成的時鐘可能并不是很穩(wěn)定,存在亞穩(wěn)態(tài)的風(fēng)險,如果是setup和hold都留了較大的margin的話,應(yīng)該問題還是不大,另外就是這種方式的驅(qū)動能力的問題。所以Xilinx的FPGA有設(shè)計專門讓時鐘走的銅線。
多路復(fù)用時鐘
在一個系統(tǒng)里面,很有可能會用到多個時鐘輪流驅(qū)動一些觸發(fā)器,為了適應(yīng)不同的數(shù)據(jù)速率要求,進(jìn)行時鐘切換。有時為了節(jié)約功耗,也會把高速時鐘切換到低速時鐘,或者進(jìn)行時鐘休眠操作。另外我補充一下的就是功耗消耗在哪里,很大一部分就是消耗在reg的Q值翻轉(zhuǎn)上面。多路時鐘如下圖所示:
這樣的時鐘一般情況下也會導(dǎo)致一些問題,比如時鐘切換時導(dǎo)致后面驅(qū)動的寄存器建立時間不足,當(dāng)滿足一定的條件時,這種多路復(fù)用器的時鐘也是可以使用的。要么就是在clock1結(jié)束后處于一段復(fù)位時間。否則就有產(chǎn)生glitch的風(fēng)險,這在DFT可測試性分析中,就會遇到這種風(fēng)險。假設(shè)clock1和clock2都來自scan_clock的時候,就會有g(shù)litch,因此需要用scan_mode讓其固定的選擇一路信號。不懂DFT的就忽略我說的吧。
門控時鐘
如上圖所示,是最開始門控時鐘的思想,這里我先簡單介紹一下ICG,ICG的類別還是很復(fù)雜的。以后專門寫一篇文章來總結(jié)。畢竟本文的任務(wù)是DC的約束。上面與門,一個pin是異步的,所以這樣很容易產(chǎn)生glitch。這種方式的思想就是為了關(guān)閉后面的時鐘,從而減小了后續(xù)的reg翻轉(zhuǎn)。
因此我們就可以通過設(shè)置一種電路,讓門控使能信號在通過這個邏輯電路之后,僅僅在時鐘低電平的時候進(jìn)行翻轉(zhuǎn),而在時鐘高電平的時候,不能翻轉(zhuǎn)也就是保持。從而我們就想到了低電平觸發(fā)的鎖存器,使能信號通過低電平的鎖存器之后,如果使能信號在高電平跳變,鎖存器的輸出信號是不會改變的,電路圖如下所示:
當(dāng)門控使能信號是高電平有效的時候,也就是高電平打開門控時鐘,低電平關(guān)閉門控時鐘,那么就使用上面的電路,也就是:低電平觸發(fā)的鎖存器+與門。
當(dāng)門控使能信號是低電平有效的時候,那么就要換成:高電平觸發(fā)的鎖存器+或門。
一般情況,在進(jìn)行芯片設(shè)計的時候,我們不必自己設(shè)計門控時鐘,大多是ASIC/SoC生產(chǎn)商都有對應(yīng)的門控時鐘單元。這里可以通過command,來讓工具自動插入ICG。
行波時鐘
行波時鐘,也就是一個觸發(fā)器的輸出用作另一個觸發(fā)器的時鐘輸入,經(jīng)常用在異步計數(shù)器和分頻電路設(shè)計中,如下圖所示
這種連接的netlist,我還真的見過不少。但是非常困惑,這次明白了,原來真的有這種設(shè)計的。后續(xù)再來補充介紹。
雙邊沿時鐘
這種在DDR里面非常常見。
然而一般情況下,我們不建議使用雙邊沿時鐘,這是因為:
由于上下沿都用,要求時鐘的質(zhì)量很高,一般的時鐘源很難達(dá)到,成本高。
由于時鐘的抖動等不確定因素的存在,容易使時鐘的占空比發(fā)生改變,因此容易引起建立時間和保持時間的違規(guī)。
當(dāng)使用的雙沿時鐘之后,時鐘的約束變得復(fù)雜,此外當(dāng)某處發(fā)生違規(guī)之后,違規(guī)的路徑的查找難度比單沿時鐘大。
還有一點就是測試難度比較大,雙沿電路的測試電路必定有別與單沿的測試電路。進(jìn)行掃描測試時,上下沿的時鐘先都得插入多路復(fù)用器進(jìn)行選擇。
2、 DC中的時序約束
在默認(rèn)的情況下,邏輯綜合時,即使一個時鐘要驅(qū)動很多寄存器,DC也不會在時鐘的連線上加時鐘緩沖器(clock buffer)以加強驅(qū)動能力,時鐘輸輸入端直接連接到所有寄存器的時鐘引腳,也就是說,對于高扇出(high fanout)的時鐘連線,DC不會對它做設(shè)計規(guī)則的檢查和優(yōu)化。在時鐘連線上加上時鐘緩沖器或作時鐘樹的綜合(clock tree synthesis)一般由后端(back end)工具完成,后端工具根據(jù)整個設(shè)計的物理布局(placement)數(shù)據(jù),進(jìn)行時鐘樹的綜合。加入時鐘緩沖器后,使整個時鐘樹滿足skew, latency和transition的目標(biāo)。
圖1為preCTS ,圖2為postCTS
由于DC在邏輯綜合時候并不知道,(抖動)jilter,延遲(latency)和時鐘的偏差(skew)及轉(zhuǎn)變時間(transition)默認(rèn)值為零。顯然,理想時鐘網(wǎng)絡(luò)與實際的情況不同,使用理想時鐘網(wǎng)絡(luò)將產(chǎn)生過于樂觀的時間結(jié)果。為了能在綜合時比較準(zhǔn)確地描述時鐘樹,我們需要為實際的時鐘樹建模,使邏輯綜合的結(jié)果能與版圖(layout)的結(jié)果相匹配。
我們用下面的命令建立時鐘那幾個屬性模型:
create_clock
set_clock_uncertainty
set_clock_latency
set_clock_transition 分別進(jìn)行時鐘的周期、偏移、延時、轉(zhuǎn)換約束:
set_clock_uncertainty:對時鐘的偏移和抖動進(jìn)行建模,也就是對時鐘的偏差進(jìn)行建模,具體使用為:
假設(shè)時鐘周期為10ns,時鐘的建立偏差為0. 5ns,用下面命令來定義進(jìn)行約束:
create_clock -period 10 [get_ports CLK]
set_ clock_ uncertainty -setup 0.5 [get_clocks CLK]
set_ clock_ uncertainty -hold 0.5 [get_clocks CLK]
上述是對setup和hold的uncertainty進(jìn)行了建模:
理想的時鐘:
對建立時間的uncertain進(jìn)行約束:
對建立時間和保持時間都進(jìn)行約束:
還可以通過下面的方式對下降沿也進(jìn)行時序約束,如果是雙邊沿,比如DDR,那下面的方式肯定是需要的。
set_ clock_ uncertainty -rise 0.2 -fall 0.5 [get_clocks CLK]
時鐘轉(zhuǎn)換時間的建模:
由于時鐘并不是理想的方波,用set_ clock_ transition來模擬時鐘的轉(zhuǎn)換(transition)時間。默認(rèn)的上升轉(zhuǎn)換時間為從電壓的20%上升至80%的時間,下降的轉(zhuǎn)換時間為從電壓的80%下降至20%的時間。如果set_clock_transition命令中不加開關(guān)選項“-setup”或“-hold" ,那么該命令給時鐘賦予相同的上升和下降轉(zhuǎn)換時間。一般情況下,我們只約束最大的轉(zhuǎn)換時間,如最大轉(zhuǎn)換時間是0.2ns,那么就加上-max選項:
set_clock_transition -max 0.2 [get_clocks CLK]
時鐘延遲的建模:
時鐘從時鐘源(比如說晶振)出發(fā)到達(dá)觸發(fā)器時鐘端口的延時,稱為時鐘的延時,包含時鐘源延遲(source latency)和時鐘網(wǎng)絡(luò)的延遲(network latency)。我們使用set_clock_latency進(jìn)行時鐘延時的建模。一般情況下,我們把時鐘源延遲(source latency)和時鐘網(wǎng)絡(luò)的延遲(network latency)分開來,因為時鐘源延時需要建模,是因為DC是真的不知道這延時是多大,但是對于時鐘網(wǎng)絡(luò)的延遲,DC在布局布線前不知道,但是在布局布線后就可以計算出來時鐘網(wǎng)絡(luò)的延時了,因此在布局布線之后進(jìn)行綜合時,就沒有必要對時鐘網(wǎng)絡(luò)進(jìn)行延時,因此就要把這兩個延時分開來進(jìn)行約束。
先說布局布線之前:時鐘周期為10ns,時鐘源到芯片的時鐘端口時間是3ns,時鐘端口都內(nèi)部觸發(fā)器的時間是1ns,如下圖所示
那么就用下面的命令進(jìn)行建模:
create_clock -period 10 [get-ports CLK]
set_clock_latency -source 3 [get_clocks CLK]
set_clock_latency 1 [get_clocks CLK]
通常情況下,我們約束最大的延時,也就是加上-max的選項,表示最大延時是多少(如set_clock_latency -source -max 3 [get_clocks CLK] 就是時鐘源到芯片時鐘端口最大的時間是3ns)
transition就不介紹了,下面直接總結(jié)的pre CTS前后的模型基本command:
3、環(huán)境、設(shè)計規(guī)則和面積約束
在綜合之前,你必須要定義好你的設(shè)計期望處于一個怎么樣的環(huán)境之中,比如你的芯片是航天級別的芯片,那肯定工作環(huán)境是不一樣的,你如果不進(jìn)行約束,最后綜合出來的結(jié)果,你將無法在宇宙環(huán)境中實現(xiàn),所以這里再次提醒一句,DC相當(dāng)于就是你去告訴他現(xiàn)實是怎樣的一個環(huán)境,他根據(jù)你的實際環(huán)境盡量去建模,以期望綜合出來的芯片能夠在實際環(huán)境中工作。
如下圖所示, 定義一款芯片的環(huán)境是通過operatting condition ,system interface characteristics and wire load model(僅當(dāng)DC沒在topo模式下面時)
3.1 環(huán)境設(shè)置選擇set_operatting_condition
雖然我們foundry提供了三種不同的庫文件,slow nomal fast 三種,這三種庫文件都有規(guī)定的PVT,我們?nèi)绻岆娐吩诓煌凇皀ominal”電壓和或溫度的條件下工作,我們需要為設(shè)計設(shè)置工作條件(Operating Conditions),我們可以用set_operating_conditions命令把工作條件加入到設(shè)計上。綜合時,原來按"nominal”環(huán)境計算出的單元延遲和連線延遲,將按工作條件作適當(dāng)?shù)谋壤{(diào)整。
相當(dāng)于告訴DC工具,比如你現(xiàn)在工作溫度125度的高溫環(huán)境(slow),仍然滿足不了我,我現(xiàn)在要工作在一個溫度更高的環(huán)境比如150°,從而你去里面給我找符合我要求的cell出來綜合滿足我。
我的company的工藝庫位于
/rsc/library
指的是PVT: process、voltage、temperature
通常來說工藝角會考慮進(jìn)去,電壓的變化常常伴隨著復(fù)雜的計算,通常會被考慮為線性關(guān)系,溫度在一些亞微米工藝中有時候是非線性運算。通常,我們最常見的圖如下。注意,我所示的nominal就是每個操作環(huán)境下面的中間值
通過set_operating_condition 來指定工作環(huán)境。
3.2 設(shè)置線負(fù)載模型set_wire_load_model
在計算時序路徑時候,除了知道門單元的延遲外(由foundry的cell提供),還需要知道連線net的延遲,用wire load model—WLM估算,WLM是廠商根據(jù)多種已經(jīng)生產(chǎn)出來過的芯片進(jìn)行統(tǒng)計,在同樣的工藝下,計算比如負(fù)載扇出為2的平均長度是多少,負(fù)載扇出為3的平均長度是多少,也就是說她是根據(jù)負(fù)載的扇出的平均長度來估計的。
如果要查看工藝庫中的WLM,可以使用命令:report_lib $lib_name,進(jìn)行綜合時,綜合工具會默認(rèn)根據(jù)設(shè)計面積和節(jié)點處的負(fù)載自動選擇合適的連線負(fù)載模型,如果要關(guān)掉自動選擇WLM,那么可以使用命令:
set auto_wire_load_selection false
然后手動選擇線負(fù)載模型的命令是:
set_wire_load_model -name $WIRE_LOAD_MODEL -library $LIB_NAME
3.3 設(shè)置驅(qū)動強度(set_driving_cell)
驅(qū)動強度、電容負(fù)載這些約束是要經(jīng)驗的,一方面是對I/O口進(jìn)行約束,屬于I/O口的約束,為時序約束與時序分析提供了路徑,更是為輸入/輸出路徑延時約束的精確性提供保證;一方面是對I/O口對外的環(huán)境進(jìn)行約束,可以算是屬于環(huán)境約束
為input或者inout的端口設(shè)定驅(qū)動。Set_drive以電阻值為計量,0表示最大驅(qū)動強度,通常為時鐘端口;而set_driving_cell則以模擬端口驅(qū)動的器件形式計量,說明輸入端口是由一個真實的外部單元驅(qū)動。
為什么要需要為input或者inout的端口設(shè)定驅(qū)動?這是因為,對于輸入端,為了精確計算輸入電路的延時時間,DC需要知道到達(dá)輸入端口的轉(zhuǎn)換時間
在默認(rèn)情況下,DC假設(shè)輸入端口上的外部信號轉(zhuǎn)換時間是0 ,也就是從上升沿跳變到下降沿或者下降沿跳變到上升沿的時間是0,這是不符合實際情況的。通過設(shè)置驅(qū)動強度,就告訴DC這個設(shè)輸入端口實際上是由一個真實的外部單元驅(qū)動的,不是理想的;DC就會計算輸入信號的實際轉(zhuǎn)換時間,仿佛指定某一個庫單元正在驅(qū)動輸入端,下面是輸入端IN1 由FD1的輸出引腳驅(qū)動的例子:
3.4 設(shè)置電容負(fù)載(set_load)
3.4 設(shè)置設(shè)計規(guī)則約束
set_max_transition
set_max_fanout
set_max_capacitance
3.5 面積約束
什么是芯片的門如何衡量?
https://mp.weixin.qq.com/s?__biz=MzU5NzkxNzI0Mg%3D%3D&idx=1&mid=2247483980&scene=21&sn=c845204ef291d090244cd32206845b80#wechat_redirect
4 官方腳本解讀
以下腳本選自DC workshop 的Lab1,下面,我來逐個擊破講解介紹,往后有了自己的模板過后,這些就是填空即可,當(dāng)然,你得能看得懂,并且能記住個大概。更多的需要訓(xùn)練自己多一份耐心去查看syn2 和syn3手冊以及ug。
1、 set lib_name cb13fs120_tsmc_max
是變量名替換,一般用set,沒有用set_app_var就要懷疑是不是自己定義的變量名了。
2、current_design TOP
指定頂層文件是TOP,如果你只敲current_design就是查看當(dāng)前的設(shè)計是誰。
如果你想看你讀入了哪些設(shè)計,然后將其設(shè)置為current_design??梢允褂?strong>list_designs,如果你想要移出掉當(dāng)前指定的current_design,你可以remove_design
5、reset_design
代表重新設(shè)置針對該設(shè)計的所有的屬性、時鐘、路徑等約束
8、create_clock -period 2 [get_ports clk]
設(shè)置在port clk的時鐘周期約束,也可以定義占空比非50%的波形,如下圖所示,創(chuàng)建一個時鐘約束在PH1上面,周期為10ns ,波形 5ns的地方上升,9.5納秒的地方下降。值得注意的是 -waveform{ }里面第一個是上升沿,第二個是下降沿。
9、set_clock_uncertainty 0.2 [get_clocks clk]
關(guān)于這個值設(shè)置為多少?,下面我搜索了一些答案
https://www.zhihu.com/question/50599344
http://bbs.eetop.cn/thread-412544-1-1.html
12 supressed_message UID-401
用print_suppressed_messages,可以查看所有被壓制的message.
然后想要開啟這個message,可以取消壓制的這個message,使用unsuppress_message
13 set_driving_cell -library $lib_name -lib_cell sdcfq1 [remove_from_collection [all _ inputs ] [get_ports clk] ]
指定一個cell作為作為時鐘的驅(qū)動,這個我在我司的tcl中并沒有看到這樣的腳本,而且我如何判斷用哪一個cell作為輸入驅(qū)動呢?下面將會說明。
什么是為設(shè)計指定輸入端口的驅(qū)動強度?
我們需要知道的是一個的延遲與兩個內(nèi)容有關(guān)系,一個是output load。
因此,對于整個設(shè)計的輸入端口input port而言,input transition關(guān)乎著cell delay。
一般來說DC工具,默認(rèn)所有輸入端口設(shè)置合理的驅(qū)動能力或者transition時間非常重要。
這里DC提供了三種對input transition的方法:
1、set_driving_cell
定義輸入端口的驅(qū)動能力可以是標(biāo)準(zhǔn)單元庫中的一個緩沖器或者反向器件(buffer/inv)單元,實用set_driving_cell命令設(shè)置輸入端口前面是什么驅(qū)動單元驅(qū)動它的,EDA工具會從指定的庫中查找得出真實的transition。
2、set_drive
可以直接指定電阻值
3、set_input_transition
直接指定轉(zhuǎn)換時間
下面進(jìn)行詳細(xì)說明:
我在網(wǎng)上找到了如下討論:
set_driving_cell
應(yīng)用: Block Level
通常應(yīng)用于block,我們通過set_driving_cell命令來設(shè)置某個輸入端口前面是什么驅(qū)動單元來驅(qū)動它,EDA工具會從指定的庫中找出真實的transition時間來代替零transition。(如果是block與block之間的)
下面在ug里面有說明,使用set_driving_cell的時候你可以不用-library選項,工具會自動匹配符合操作環(huán)境的所有l(wèi)ibrary。
如下圖所示,因為我們的block設(shè)計人員對接好,輸出的cell是什么,如果是在chip層的話,建議使用inv或者buffer即可,如果沒有商量好的話,可以事先假設(shè)用inv、buffer或者驅(qū)動。
set_drivre的用法
應(yīng)用場景:chip level
set_drive命令通過為輸入端口指定電阻值的方法來為其定義外部驅(qū)動強度。對于芯片chip級別的設(shè)計(頂層設(shè)計而言),它的輸入端口的驅(qū)動能力很難用工藝庫中的某個驅(qū)動單元去量化,因此一般不在使用set_driving_cell來指定驅(qū)動強度。
由于在頂層,要驅(qū)動的是負(fù)載較大的IO單元,故需要的驅(qū)動能力較強,典型的值是0.05,單位取工藝庫中電阻的單位,一般為kΩ;
· 阻抗resistance:非負(fù)的驅(qū)動阻抗,該值越小表示驅(qū)動能力越大。(一個MOS管的開關(guān)模型是一個電阻串聯(lián)一個開關(guān),驅(qū)動一個MOS管柵極的是上一級MOS管的漏端,它總是通過該電阻連接到電源或者地,這里設(shè)置的是MOS管等效電阻的大小);
· 端口名列表port_list:設(shè)置為哪些輸入端口設(shè)置驅(qū)動電阻。
由于通常情況下,設(shè)計的時鐘和復(fù)位端都由驅(qū)動能力很大的單元或樹形緩沖來驅(qū)動,所以可以用set_drive命令將這兩個端口的驅(qū)動電阻設(shè)置為0,也就是驅(qū)動強度為無窮大(該命令對當(dāng)前設(shè)計有效)。
舉例:
例1:給設(shè)計的輸入端口A、B和C指定2.0 kΩ(單位一般是kΩ,跟庫中定義有關(guān))的電阻,可以用該命令:
set_drive 2.0 {A B C}
例2:為設(shè)計中的所有輸入端口指定12.3 kΩ的電阻,可以用該命令:
set_drive 12.3 [all_inputs]
例3:將ddfs的時鐘和復(fù)位端的驅(qū)動設(shè)為無窮大,即驅(qū)動阻抗設(shè)為零:
current_design ddfs
set_drive 0 {clk, reset}
set_input_transition命令
應(yīng)用場景:chip_level
我們可以用set_input_transition命令為輸入端口指定一個固定的transition時間,工具就會用該transition時間來計算它驅(qū)動的邏輯電路的延遲。
什么是驅(qū)動能力?
下面有兩條比較實用的建議:
http://bbs.eetop.cn/forum.php?mod=viewthread&tid=295634&page=1
https://www.cnblogs.com/ASIC-Horizon/p/10053487.html
總結(jié)
下面總結(jié)
set_driving_cell
set_drive
set_input_transition
的區(qū)別
以上三種方式都可以用來指定輸入端口的驅(qū)動。
set_driving_cell是首選的方法,因為他是最真實的模型,當(dāng)我們的設(shè)計是block時候,我們的設(shè)計前面一般還有其他的design,我們可以根據(jù)外圍電路的輸出cell來給自己的模塊指定驅(qū)動強度。這個就需要與其他的designer商量好,保險的方式,你可以暫時先用inv或者buffer來驅(qū)動。
采用設(shè)置輸入驅(qū)動能力,驅(qū)動能力越大,轉(zhuǎn)換時間越小,驅(qū)動能力越小,轉(zhuǎn)換時間越大
當(dāng)我們的設(shè)計是chip時候,芯片外圍電路要驅(qū)動的是負(fù)載較大的IO單元,因此一般驅(qū)動能力也比較強。,一般選擇set_drive命令。但是這個電阻也不太好衡量,一般時鐘port可以設(shè)置為0,無窮大。
但我看我司的腳本用的是set_input_transition來在chip層次設(shè)置固定的transition,沒有看到set_drive的命令,如果以后遇到了,再補充
講了這么多,現(xiàn)在又再次回到官方的腳本
14、 set_input_cell 0.1 -max -clock clk [remove_from_collection [all_inputs] [get_ports clk] ]
如下圖所示,時序路徑的約束有下面四種,現(xiàn)在我們要約束的是輸入端口到寄存器的值
路徑的特性是存在延時,也就是說,路徑1、2、3、4都存在有延時,延時最長的一條路徑稱為關(guān)鍵路徑。一般情況下,路徑1、2、3是最常見的,路徑4比較少見。
有人建議的原則是 3/7 原則,外面設(shè)置70%,里面留30%
所以有人給DD的建議是輸入輸出都采用DFF
我司的設(shè)置如下:
最后,總結(jié)得出設(shè)置在40%到60%之間,并且建議Design IC人員遵循輸入輸出采用DFF的形式,否則就會有一段不預(yù)期的組合邏輯存在。
參考:
https://mp.weixin.qq.com/s/5KaY0XY-WUznIn-JWn_0Ww
下面再來總結(jié)一下:set_input_delay
也就是說你告訴工具Tclk-q+Tm是多少,然后DC在綜合的時候會對組合邏輯N和第一個FF的延遲進(jìn)行優(yōu)化和約束(比如算法上簡化邏輯,比如選用更牛x的cell以滿足時序)等等,所以一般建議DD輸入輸出均選用DFF,這樣可以避免組合邏輯的N造成的延時。
此外還有多輸入路徑,以及負(fù)沿觸發(fā)等等不同的情況,詳細(xì)見:
https://mp.weixin.qq.com/s/5KaY0XY-WUznIn-JWn_0Ww
18、set_output_delay 1 -max -clock clk [all_outports]
我司腳本上,我看是50%的outputdelay
下面再來總結(jié)一下out_put_delay
我們通過指定外部邏輯用了多少時間,也就是Tt+Tsetup用了多長時間,從而退出留有多少時間給內(nèi)部邏輯。上圖可以簡化為如下:
不管是輸入還是輸出,只要把握好時序分析的經(jīng)典圖形,就可以很好的理解了。
另外其實有沒有發(fā)現(xiàn),不管是set_input_delay也好還是set_output_delay也好,都是等效于看作時序分析中的經(jīng)典兩級寄存器圖。對于input,就是通過DC去約束輸入reg和logic,對于output就是去通過DC約束輸出reg和logic
參考:
https://www.cnblogs.com/IClearner/p/6624722.html
上面圖里面懷疑表述錯誤,應(yīng)該是40%,不知怎么冒出來的20%
19、set_load [expr [load_of $lib_name/an02d0/A1] * 15] [all_outports]
參考:
https://blog.csdn.net/weixin_30929295/article/details/94959984?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param
命令掌握
以下命令,是本節(jié)博客中需要積累的。
list_libs [lib_list] 列出當(dāng)前在內(nèi)存中的吃進(jìn)去的lib
list_designs
查看當(dāng)前讀入了哪些設(shè)計
set_operating_conditions syn2 P2747
-max_library max_lib
Specifies the library containing definitions of the operating conditions for maximum delay analysis. This is either a library name or a collection. The tool selects the first library in the collection containing the definitions.
-max max_condition
Specifies the operating condition to use for maximum delay analysis.
set_driving_cell
set_input_transition
參考文章
為了表示對原創(chuàng)作者的尊重,特此聲明,并表示感謝
本博文主要參考了以下優(yōu)質(zhì)文章,并對其做了進(jìn)一步的讀解,和補充
參考文章:
https://www.cnblogs.com/IClearner/p/6624722.html
https://www.cnblogs.com/IClearner/p/6628729.html
https://www.cnblogs.com/IClearner/p/6440488.html
http://bbs.eetop.cn/forum.php?mod=viewthread&tid=295634&page=1
https://www.cnblogs.com/ASIC-Horizon/p/10053487.html
https://www.zhihu.com/question/50599344
http://bbs.eetop.cn/thread-412544-1-1.html
https://mp.weixin.qq.com/s?__biz=MzU5NzkxNzI0Mg%3D%3D&idx=1&mid=2247483980&scene=21&sn=c845204ef291d090244cd32206845b80#wechat_redirect
https://blog.csdn.net/weixin_30929295/article/details/94959984?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param
http://bbs.eetop.cn/thread-306407-6-1.html
https://www.cnblogs.com/IClearner/p/6624722.html
https://mp.weixin.qq.com/s/5KaY0XY-WUznIn-JWn_0Ww
另外我問了一個問題,verilog model是什么東東,每次都要吃這個。
下面總結(jié)一下就是說Verilog model包括有sram ip 模擬 三種情況都有可能,即使你是ip,你看不到里面的內(nèi)容,工具是可以看得到的。然后有了這個verilog model,工具就可以跑仿真。
下面說說模擬.v 文件,模擬的.v只是模擬的工程師根據(jù)DD的需要對verilog-a進(jìn)行建模,從而提供給DD的人員跑仿真,但是真正的具體實現(xiàn),需要另外再做,因此verilog-a可以寫不可綜合的語言,并且省略了模擬的很多細(xì)節(jié)東西。
總結(jié)
以上是生活随笔為你收集整理的DC使用教程系列2-时钟的概念与环境接口面积约束脚本的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DFT - DRC
- 下一篇: DFT命令脚本系列1-