静态时序分析(STA)附秋招面试提问
什么是STA?
????????靜態(tài)時序分析(Static Timing Analysis):是分析、調(diào)試并確認(rèn)一個門級系統(tǒng)設(shè)計(jì)時序性能的方法。檢驗(yàn)門級電路的最大延遲,以保證在指定的頻率下,能否滿足建立時間的要求;檢驗(yàn)門級電路的最小延遲,以保證在指定的頻率下,能否滿足保持時間的要求。
????????STA需要檢查哪些東西:檢查sequential cell的setup/hold是否滿足要求;檢查Async Reset/Set recovery/removal是否滿足要求;檢查一個短脈沖,是否能被后續(xù)電路檢測到;Clock gate setup/hold;
????????還包括計(jì)算design是否滿足DRC(Design Rule Check)的要求:電路的最大電容不能超過設(shè)置的最大電容(capacitance)、電路的翻轉(zhuǎn)時間(transition)不能超過設(shè)置的最大值,電路的扇出(fanout)不能超過最大值。
STA要檢查很多內(nèi)容:包括DFF的setup hold check、ARST check、pulse check、clock gate
check等。
DFF setup/hold?
?
????????在時鐘上升沿到來的時候,為了保證數(shù)據(jù)能確確實(shí)實(shí)的被采到,時鐘對數(shù)據(jù)有建立時間(set up time)和保持時間(hold time)要求。CK to Q 的時間比 hold 時間長,就不會出現(xiàn)Metastable(亞穩(wěn)態(tài)),如果出現(xiàn) setup hold 不滿足需求,那么就會出現(xiàn) Metastable。
ARST check?
????????包括在復(fù)位的時候,復(fù)位信號從0到1的時候,如果和時鐘挨的太近,就會出現(xiàn)Metastable,時鐘上升沿那個時刻,不確定采ARST的值為0還是為1,在上面圖里ARST信號的recovery check Violation,所以時序不滿足要求。
????????復(fù)位信號(低電平有效)時序檢查,只檢查上升沿,因?yàn)槿绻仙爻霈F(xiàn)Metastable,可能會導(dǎo)致各個寄存器進(jìn)入工作狀態(tài)的時間不一致,有些寄存器開始工作了,有些寄存器還抓著ARST的低電平信號沒進(jìn)入工作狀態(tài),所以這種情況一定要進(jìn)行時序檢查,但是ARST下降的時候不用檢查,因?yàn)槟呐逻`例了,你要所有寄存器復(fù)位,只有一部分復(fù)位還有一部分在工作狀態(tài),一部分先進(jìn)入復(fù)位狀態(tài)一部分后進(jìn)入復(fù)位狀態(tài),不關(guān)先后最后都會進(jìn)入復(fù)位狀態(tài),不會影響功能結(jié)果。
Signal pulse check?
????????信號脈沖的寬度也要check timing,要檢查信號持續(xù)一段時間的長度夠不夠,比如上面提到的復(fù)位信號,如果復(fù)位信號拉低的時間不夠久,那么就有可能復(fù)位失敗。?
? ? ? ? 如果clk gate發(fā)生violation,比如clk_en在clk的下降沿才拉高,這樣組合邏輯或門的輸出clk_gate就會先低后高,產(chǎn)生一個非常短的毛刺,這就不行了,所以這里就要求clk_en在上升沿后面一點(diǎn)點(diǎn),在下降沿前面一點(diǎn)點(diǎn),這樣就不會clk gate violation。
具體分析時序之前,先講一講產(chǎn)生時序問題的來源到底和什么有關(guān)(延遲)
綜合 (synthesis):根據(jù)RTL設(shè)計(jì)和cell library,把RTL代碼映射到最基本的門級cells,根據(jù)STA的timing constraints,盡量保證映射后的gate level design滿足timing constraints。盡量把設(shè)計(jì)的面積和功耗優(yōu)化到最小(優(yōu)化面積和功耗,綜合工具有很多cell可以選擇,比如加法器就有行波進(jìn)位和超前進(jìn)位加法器,DC工具有很多選擇,具體選擇什么根據(jù)你的設(shè)計(jì)和約束來綜合) ,已經(jīng)盡量修復(fù)DRC violation(最大電容、最大扇出等),盡量讓門級的congestion最小(增加線路密度,減小芯片面積)。
綜合會涉及到一個工藝庫的概念,不同的工藝綜合出來的門電路的面積和延時都會不一樣
cell library簡介
????????各種工藝的library至少會提供三種library,slow/typical/fast三種,在slow工藝下主要關(guān)注setup分析,因?yàn)樾盘柋容^慢,容易setup violation,而在fast的時候主要關(guān)注hold的violation。現(xiàn)在的先進(jìn)工藝還會提供不同的Vt工藝的cell library,分為:LVT、RVT、SVT(?Standard V threshold?)、HVT (?High V threshold?)?在每個VT下也至少會給出三種opration conor。不同的VT工藝下器件的delay是不同的LVT的器件delay是很小的,閾值電壓越低,因?yàn)轱柡碗娏髯冃?#xff0c;所以速度性能越高;但是因?yàn)槁╇娏鲿兇?#xff0c;因此功耗會越大。速度大小按快到慢依次排列為SLVT, LVT, RVT, HVT。 功耗大小卻正好相反。(不要覺得是工藝部分自己就可以不用看了,在修復(fù)set up/hold violation的時候,就可以通過改變器件工藝角的方式來修復(fù),所以需要知道LVT、RVT、HVT各自的區(qū)別)????????
????????如果用RVT的工藝角做了一塊芯片最高跑到380M頻率,而我們想讓他跑到400M,那么就可以用更快速的LVT工藝的器件,替換一些critical path 上的器件,這樣就能讓電路整體的頻率高一點(diǎn),對應(yīng)的也會犧牲一些功耗的代價。HVT什么時候用呢,在那些delay很小不是critical path的路徑上把RVT的一些器件換成HVT的,在不影響電路速度的情況下就可以降低功耗。
????????對于一個cell的延遲,它延遲具體取多少,在cell library里是有具體設(shè)置顯示的,并且他的查找方式是通過查找表的形式來的。
????????DRC在檢查DC里面max?capacitance和max loading 的設(shè)置時,最大值不能超過類似上面表的cell library規(guī)定的最大值。
時鐘特性
同步時鐘是能夠明確定義多個時鐘間如下關(guān)系的時鐘:
????????① 時鐘頻率
????????② 時鐘高低電平的持續(xù)時間(duty cycle)
????????③ 各個時鐘的相位(waveform)
????????④ 時鐘的input latency
異步時鐘:不能明確定義多個時鐘間以上關(guān)系的時鐘源。
clock有很多參數(shù),頻率、占空比等,這里介紹一下和時鐘有關(guān)的參數(shù)。
clock period (時鐘周期):芯片上的時鐘為了準(zhǔn)確,一般都是由晶振生成。
clock jitter :就是指兩個時鐘周期之間存在的差值,這個誤差是在時鐘發(fā)生器內(nèi)部產(chǎn)生的,和晶振或者PLL內(nèi)部電路有關(guān),布線對其沒有影響。,這個一般問題不大,因?yàn)楫a(chǎn)生jitter的是晶振,可能晶振這個時鐘周期為100ns,下一個時鐘周期為101ns,產(chǎn)生了1ns的jitter,但是這也不會對時序有很大的影響,因?yàn)榫д袷菚r鐘樹的源頭,寄存器A有jitter,寄存器B也有jitter,大家都有clock jitter。
duty cycle :占空比,高電平占整個時鐘周期的比例。
transition time:時鐘的翻轉(zhuǎn)不是直上直下的,其實(shí)有一個傳輸延時,傳輸延時定義是從時鐘的10%~90%所花的時間(上升傳輸延時)和從時鐘的90%~10%所花的時間(下降傳輸延時)。
phase 相位:第一個上升沿和第一個下降沿的位置,相對于零時刻的時間。
input latency:輸入終點(diǎn)相對于時鐘源頭的延遲,latency,(走線導(dǎo)致的延時)
clock skew:clock tree 到不同的寄存器的距離是不同的,因?yàn)檫@些距離的不同到達(dá)寄存器的時間也不同,同一個時鐘的同一個沿,到達(dá)不同寄存器的時間差異稱為clock skew。
clock uncertainty:clock jitter + pessimistic (悲觀量)
在SDC里創(chuàng)建一個時鐘(用Tcl腳本寫的)?
port:頂層設(shè)計(jì)的端口
pin:input/output???of a cell(not the top design)
STA??Timing Path:① 輸入到寄存器??② 寄存器到輸出??③ 寄存器到寄存器??④ 輸入到輸出
STA??Start/End Points
Start Points:input ports、Clock pins of sequential cells(clocks)
End Points:output ports、Data pins of sequential cells、Clock pins of sequential cells(clocks)
set up check
????????如果有兩個寄存器相連,set up 滿足要求的條件是:前一個寄存器在clock 第一個上升沿發(fā)出的數(shù)據(jù),能被后一個寄存器在第二個上升沿抓到(如果不能被第二個上升沿抓到,那就是delay太大了)。
hold check
????????如果有兩個寄存器相連,hold滿足要求的條件是:前一個寄存器在clock 第一個上升沿發(fā)出的數(shù)據(jù),不能被后一個寄存器在第一個上升沿抓到(如果被第一個上升沿抓到,那就是delay太小了,數(shù)據(jù)很快就到第二個寄存器了)。?
setup check 計(jì)算
????????如圖所示的紫色路徑數(shù)據(jù)從clk端,到達(dá)寄存器C的D端所需要的時間為:
data_arrive_time = clk_latency + clk_path1_delay + ck_to_q + logic_delay;
????????數(shù)據(jù)到達(dá)時間為時鐘的延遲、時鐘從外部到clk端的路徑延遲、從clk端到數(shù)據(jù)輸出有一個延遲、再加上組合邏輯延遲。
????????相應(yīng)的寄存器C還有一個數(shù)據(jù)要求時間,如果數(shù)據(jù)延遲小于require那就沒問題,如果大于require(數(shù)據(jù)來晚了)就會出現(xiàn)setup violation。
data_require_time = clk_period+clk_latency + clk_path2_delay - dff_set_up - clk_uncertainty;
數(shù)據(jù)需求時間:加一個時鐘周期,因?yàn)镃要求的數(shù)據(jù)是上一個周期的數(shù)據(jù)。
????????綜合工具就會進(jìn)行setup check:
?????????????????????????????setup_slack =?data_require_time - data_arrive_time?
?????????????????????????????if( setup_slack??>= 0)
????????????????????????????????????setup meet;
????????????????????????????else?
????????????????????????????????????setup violated;
????????因?yàn)槟銛?shù)據(jù)到達(dá)的時間必須小于數(shù)據(jù)需求時間,也就是數(shù)據(jù)要在下一個時鐘沿抓數(shù)據(jù)之前到達(dá)下一個寄存器且滿足下一個寄存器的setup要求。
hold check 計(jì)算
????data_arrive_time = clk_latency + clk_path1_delay + ck_to_q + logic_delay;
????數(shù)據(jù)到達(dá)時間為時鐘的延遲、時鐘從外部到clk端的路徑延遲、從clk端到數(shù)據(jù)輸出有一個延遲、再加上組合邏輯延遲。
????hold check的是寄存器C不能再當(dāng)前時鐘上升沿抓到寄存器B當(dāng)前時鐘上升沿的數(shù)據(jù)。
????data_require_time = clk_latency + clk_path2_delay +?dff_hold?+ clk_uncertainty;
????綜合工具會進(jìn)行hold?check:
????????????????????????????hold_slack =?data_arrive_time -?data_required_time
????????????????????????????if( hold_slack?> = 0 )
????????????????????????????????????hold meet;
????????????????????????????else
????????????????????????????????????hold violated;
????????數(shù)據(jù)到達(dá)時間要比數(shù)據(jù)要求時間長,因?yàn)槭峭粋€時鐘的數(shù)據(jù),數(shù)據(jù)不能到的太快,不能在同一個時鐘沿被后一個寄存器抓到,數(shù)據(jù)實(shí)際的到達(dá)時間要在窗口之后,不能被同一個時鐘沿抓到。
????????setup check的時候,要走一個組合邏輯路徑比較長的路徑,這樣容易setup violation,hold check的時候,要走一個組合邏輯路徑比較短的路徑,這樣容易hold violation,就是在兩種check階段都要考慮最壞情況。
????????上面講的setup check和hold check 針對的是來自同一個時鐘的check,如果兩個寄存器的時鐘來源于兩個不同的時鐘源?
????????對于setup check 還是用他的含義去理解,A寄存器在一個時鐘沿的數(shù)據(jù),在B寄存器的一個時鐘沿抓到,但是兩個時鐘是異步時鐘,不確定相位,所以綜合工具就會找兩個時鐘相距最近(這里最近是找waveform波形最近的地方)的地方去做check。
????????異步時鐘的STA分析里的hold分析,取setup check point 前一個上升沿作為hold check point,hold間隔最近的地方做hold check,如下圖:
setup hold都會去找最差的情況去做check。
????????兩個不同源的時鐘,我們不希望他去分析STA,就可以下false_path,因?yàn)楹芏噙@樣的violation是假的violation,我們不希望花很多的算力優(yōu)化這些不會出錯的地方上,就可以下false_path。
下約束的TCL,創(chuàng)建一個時鐘:
下 input_delay:
input_delay 下的是外部信號的delay,內(nèi)部還有的裕量是clock_period - input_delay,一般在邏輯的頂層,下的外部邏輯的delay。比如:
set_input_delay -clock CLK $dly [get_ports D]
下 output_delay也是一樣
對于input_delay和output_delay都可以下最大值和最小值的delay constraint。最大值用于setup分析,最小值用于hold分析。
set_input_delay
例如給輸入下最大6ns延遲和最小2ns延遲?
看第二個時鐘上升沿,在第二個時鐘上升沿過了2ns后數(shù)據(jù)開始不穩(wěn)定,因?yàn)閏lock delay最快是2ns,過了6ns后數(shù)據(jù)就穩(wěn)定了,因?yàn)闀r鐘最大delay是6ns,超過這個6ns后,數(shù)據(jù)就穩(wěn)定了。
如果沒有分別設(shè)置 max數(shù)值和min數(shù)值,那么綜合工具就默認(rèn)兩個數(shù)值相同。
set_output_delay ,是設(shè)置端口外部的delay,所以留給內(nèi)部的delay就只有T-$delay,當(dāng)然這里注意:約束的output_delay也可以是負(fù)數(shù),負(fù)數(shù)的意思就是,模塊內(nèi)部連接到外部部分的delay,必須大于這個負(fù)數(shù)的絕對值,比如:
set_output_delay -clock CLK -min -3 [get_ports OUT]
設(shè)置了output_delay是負(fù)數(shù),那么你內(nèi)部邏輯到output的delay必須大于3ns,這樣,內(nèi)部delay+外部delay > 0?才合理。可以理解為外部接了一個寄存器,然后寄存器的hold是3ns,在同一個時鐘沿,前一個寄存器在該時鐘沿的數(shù)據(jù)不能被后一個寄存器抓到,所以數(shù)據(jù)到后一個寄存器的delay必須大于該寄存器的hold time,否則就出現(xiàn)hold violation。設(shè)置外部delay為負(fù)數(shù),其實(shí)目的是為了約束內(nèi)部delay 必須大于這個負(fù)數(shù)的絕對值。
set_false_path
如果我們下了這個路徑,意思就是不讓工具做STA分析,例如:
set_false_path -from A -to B
※A→B之間的路徑不check timing;但是B→A之間的路徑仍需要進(jìn)行check timing。
set_multicycle_path
如果數(shù)據(jù)持續(xù)兩個周期,也就是setup分析的時候,前一個寄存器第一個時鐘上升沿的數(shù)據(jù)可以被后一個寄存器第三個時鐘上升沿抓到,不希望setup分析按默認(rèn)的來,那就下set_multicycle_path,例如:
set_multicycle_path 2 -setup -from A -to B;
set_multicycle_path 1 -hold -from A -to B;?
????????一般來說,如果用set_multicycle_path,setup約束和hold約束往往成對出現(xiàn)。比如上面設(shè)置了setup延遲一個周期(set_multicycle_path 2),還設(shè)置hold提前一個周期(set_multicycle_path 1)。這意思就是,數(shù)據(jù)在第一個上升沿發(fā)出,能被下一個寄存器第三個上升沿抓到(setup滿足),數(shù)據(jù)在第一個上升沿發(fā)出,不能被下一個寄存器同一個上升沿抓到(hold滿足),如果set_multicycle_path 2 -hold -from A - to B 那就是 數(shù)據(jù)在第一個上升沿發(fā)出,不能被下一個寄存器第二個上升沿抓到(hold滿足)。
高級STA概念
on-chip-Variation:OCV
同一個芯片,不同位置的cell的PVT不一致,在STA分析setup的時候,在計(jì)算data_arrive_time時,故意用延遲大一點(diǎn)的工藝,讓數(shù)據(jù)延時變大,而在下一個寄存器的時鐘路徑上用延時小的工藝,即讓setup更容易違例。
但是這種方式有些過于悲觀,原本能跑很高頻率的電路,給這樣悲觀的分析,跑了一個低頻率,所以實(shí)際上一般都是在延遲的基礎(chǔ)上加一個5%的悲觀量,這個具體多少人為設(shè)定。
common-Path-Pessimism-Remove :CPPR
在共同的clock路徑上,cell的delay是一樣的。比如計(jì)算setup的時候走了一條clock path經(jīng)過了一個buffer,計(jì)算下一個寄存器的data_require_time的時候走了另一條clock path也經(jīng)過了這個buffer那么兩條路徑都經(jīng)過了這個buffer,按照OCV,我們不可能給這個buffer同時用好的工藝和壞的工藝來做悲觀,所以這種情況下就可以把這個共同路徑上的cell設(shè)為同樣的工藝,即同樣delay。
STA算例1:?
????????Setup路徑計(jì)算,取最長的延時,最大的延時的路徑要在第二個時鐘沿前到來,且應(yīng)滿足setup需求(data_required 中減去setup時間,因?yàn)閿?shù)據(jù)要在setup窗口之前到達(dá))。
slack = 8.75ns,代表setup還有這么多的裕量。
Hold路徑計(jì)算,數(shù)據(jù)到達(dá)時間要比hold窗口還慢,保證數(shù)據(jù)不能被同一個時鐘沿采到?
STA算例2:
計(jì)算data_require_time 再計(jì)算data_arrive_time 然后計(jì)算裕是否夠。
第一題,求最大工作頻率(setup 分析):
時鐘頻率影響的只有setup分析,之前在寫路徑的時候,setup的data_require_time里是有一個clock_period的,所以setup分析是與時鐘頻率有關(guān)的,且容易推斷出時鐘頻率越快,越容易出現(xiàn)setup violation。
每個寄存器都得分析setup的裕量
對寄存器1 來說:
????????寄存器1 的data_arrive有兩條路徑,一條是從din直接到D端的Path1,另一條是從F2的Q端到D端Path2。
Path1 :0.5 + 2 = 2.5 ns(din + Tandgate)
Path2 :1 + 1 + 2 + 2 = 6ns (兩個buffer+Tcq+Tandgate)
data_require = Tcycle + Tbuffer- Tsu = Tcycle + 1 - 3 = Tcycle - 2
最長的delay為Path2,Path2的delay要小于data_require所以有不等式:
6 =< Tcycle - 2????從而有????T cycle >= 8ns
對寄存器2來說:
只有一條數(shù)據(jù)路徑
data_arrive_time =??1 + 2 + 2 + 2 + 2 = 9ns
data_require_time = Tcycle + 1 + 1 - 3 = Tcycle - 1
data_require_time >= data_arrive_time 所以,Tcycle >= 10ns
綜上,所以Tcycle >= 10ns 所以時鐘最大工作頻率為100MHz;
第二題,判斷時鐘10MHz時,是否有timing violation(hold 分析):
????????首先,電路的最大工作頻率是100MHz,所以時鐘為10MHz時,一定沒有setup的violation,但是有沒有hold 的violation我們不知道, 所以需要計(jì)算兩個寄存器的hold是否會出現(xiàn)時序問題。
對寄存器1來說:
path1 :0.5 + 2 = 2.5 ns
path2 : 1 + 1 + 2 + 2 = 6ns
data_require_time = 1 + 2 = 3ns
hold分析要求數(shù)據(jù)延時要在時鐘上升沿之后到來,所以data_arrive_time >= data_require_time
對于path1來說 2.5ns < 3ns,所以路徑1會出現(xiàn)hold violation。
對寄存器2來說:
data_arrive_time = 1 + 2 + 2 + 2 + 2 = 9 ns
data_require_time = 1 + 1 + 2 = 4ns
9 > 4 滿足要求,所以寄存器2不會hold violation。
????實(shí)際上的STA分析是EDA工具幫我們分析的,工具會幫我們分析各條路徑的setup/hold是否滿足要求,所以對我們實(shí)際工程來說,我們只需要看timing報告就可以了,看是否有出現(xiàn)violation,如果有出現(xiàn),要知道原因,以及如何修復(fù)violation。
STA自測
1.如果芯片tape out了,測試懷疑有setup violation,怎么確認(rèn)?(降低時鐘頻率,clock_period 就變大了,setup check 的不等式就更容易滿足了,如果降低了時鐘頻率結(jié)果電路從不能工作變到穩(wěn)定工作了,那就很可能是setup violation了,如果PLL做死了,不能調(diào)時鐘頻率,那還可以調(diào)ck_to_q(用不同的工藝庫,PVT),和logic_delay)
2.如果芯片tape out了,測試懷疑有hold?violation,怎么確認(rèn)(和setup 檢測一樣,如果hold violation了,那就是不等式不成立,那我們就想辦法讓不等式成立,同樣的可以改PVT,也可以增加 logic delay,)?
3.什么是setup time 什么是hold time
4.寫出setup check和hold check的判斷公式
5.如果出現(xiàn)setup violation了怎么處理?
6.如果出現(xiàn)hold violation了怎么處理?(根據(jù)不等式調(diào)參數(shù),比如換PVT,修改logic_delay)
7.clock jitter 和clock skew有什么區(qū)別?
8.同步時鐘,異步時鐘的區(qū)別
9.不希望兩個異步時鐘之間做STA怎么辦?怎么下約束?
10.如果從寄存器A到寄存器B之間有多條組合邏輯路徑,setup和hold分析的時候怎么分析?
11.設(shè)置output_delay的時候,delay可以是負(fù)數(shù)嗎?為什么?
12.如果給你電路圖,讓你分析setup和hold時序是否滿足要求,你能分析嗎?如果讓你判斷該電路能跑的最高時鐘頻率為多少,能計(jì)算嗎?
總結(jié)
以上是生活随笔為你收集整理的静态时序分析(STA)附秋招面试提问的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 冷启动问题——协同过滤(推荐系统)
- 下一篇: C++功能模块2:mkdir()创建文件