本篇文章將給大家?guī)頃r序分析相關的東西。
課程大綱如下所示:
1、Sequential Clocking對于絕大部分數(shù)字電路而言,其都采用同步電路的設計方法。這種設計方法基于寄存器為主體,描述數(shù)據(jù)在寄存器和寄存器之間的傳輸。因此描述其的語言也被稱為RTL,即寄存器傳輸級。同步電路可以消除組合邏輯中的競爭冒險,此外設計相對簡單,EDA工具支持良好,因此目前普遍采用該方式。我們假定所有的寄存器都是D-Flip Flops,時鐘上升沿觸發(fā)。其有以下幾個關鍵的指標。
首先就是tcq。其描述了在時鐘上升沿到達以后,數(shù)據(jù)多久才可以從D端到達Q端,為什么不叫tdq呢?因為CLK實際上才是數(shù)據(jù)的開關,其上升沿以后數(shù)據(jù)才開始從D端流動到Q端。
學過數(shù)字電路都知道,實際的電路不是理想的,不可能時鐘上升沿一到來,出口數(shù)據(jù)就發(fā)生了變化。具體的時序如下圖所示。
我們再來看一下什么是建立時間。大家可以簡單的這么理解,對于寄存器而言,其有兩個工作狀態(tài),一個是高電平,一個是低電平。在低電平的時候,其入口是開啟的,一旦進入高電平,其會關閉自己的入口。
因此就需要你在入口開啟之前將數(shù)據(jù)維持穩(wěn)定。同樣電路不是理想的,不可能說你一穩(wěn)定,馬上就把你的數(shù)據(jù)采樣進寄存器了,其需要一個時間,這個時間我們就可以理解成建立時間,其時序圖如下圖所示。
同樣的,當電平為高電平的時候,入口會關閉。其關閉也不是馬上的,大家可以理解為開門關門,都是需要一個時間的。所以在關門的這段時間你的數(shù)據(jù)應該維持不變,如果你的數(shù)據(jù)變了,那可以采樣到的數(shù)據(jù)就不是你希望的數(shù)據(jù)了。這個上升沿之后還需要維持數(shù)據(jù)的時間,就是所謂的保持時間了。
基于上述的分析我們可以發(fā)現(xiàn)。在時鐘上升沿之前和上升沿之后,我們都需要數(shù)據(jù)維持在我們希望的那個數(shù)據(jù)上。這就引入了兩個概念,Max Delay和Min Delay。
什么是Max Delay呢?根據(jù)上面的描述我們知道,電路需要在時鐘上升沿的建立時間之前,將數(shù)據(jù)穩(wěn)定下來。那又為什么會出現(xiàn)數(shù)據(jù)不穩(wěn)定呢?那就是你在一個時鐘周期內(nèi),結(jié)果還沒算出來,或者是還沒有傳到寄存器的入口處,這樣就出現(xiàn)了建立時間違例。
可以看到,建立時間違例和時鐘周期是緊密相關的。這就好比,你需要每個時鐘周期從一個門到另外一個門,這里的一個個的門就是寄存器。你如果沒有在規(guī)定時間趕到,門就關上了,那自然也就出錯了。
而什么是保持時間違例呢?那就是上面說的數(shù)據(jù)沒有維持住,在時鐘上升沿以后過了一下下就變了。為什么沒有維持?因為數(shù)據(jù)更新的太快了,這就好比你和另外一個人都需要從一個門到另外一個門。按理來說你始終比他領先一個門,但你趕在關門之前到了某一個門,他突然一下就到了你面前,這個時候你們誰過去呢?這就出現(xiàn)了數(shù)據(jù)亞穩(wěn)態(tài)。
為什么會有上述的原因?可能是因為你后面那個人走了捷徑,或者是跑的太快了。對應到數(shù)字電路就是其data path太短了?梢钥吹,建立時間違例跟時鐘周期沒有關系。
我們結(jié)合實際的電路去理解上述的概念。在時鐘上升沿到來以后,經(jīng)過tcq" role="presentation" style="display: inline-block;line-height: normal;word-spacing: normal;overflow-wrap: normal;float: none;direction: ltr;max-width: none;max-height: none;min-width: 0px;min-height: 0px;border-width: 0px;border-style: initial;border-color: initial;">???的時間,數(shù)據(jù)呈現(xiàn)在寄存器的Q端,然后又需要經(jīng)過組合邏輯,到達另外一個寄存器的D端。其本質(zhì)上我們可以看作一個跑步競賽。
數(shù)據(jù)必須在下一個時鐘上升沿的建立時間之前,到達下一個寄存器的D端。我們將其稱為發(fā)射和捕獲。
我們再細化一下上面的概念,根據(jù)下面的電路圖,很顯然可以劃分為兩條路徑。一個是Capture Path即捕獲路徑,一個是Launch Path即發(fā)射路徑。下一個時鐘上升沿到來之前,這個寄存器的輸入端必須是已經(jīng)穩(wěn)定了的數(shù)據(jù)。大家可以類比上面的關門例子。
通常來說,如果發(fā)生建立時間違例,通常都是組合邏輯太長導致的,組合邏輯太長,導致數(shù)據(jù)沒辦法在下一個時鐘上升沿之前到達R2寄存器的D端,數(shù)據(jù)走的太慢了!因此用了一只烏龜作為示例,根據(jù)下圖我們也可以得出這個結(jié)論。
我們再來看一下保持時間帶來的約束。我們也將其稱為Min Delay。值得注意的是,此時兩個寄存器看到的都是同一個時鐘上升沿,出現(xiàn)保持時間違例的關鍵在于數(shù)據(jù)到的太快了,B寄存器還沒有把門關上,你就到了,這不是希望看到的。我們可以結(jié)合下面的時序圖和電路圖來理解。
為什么會造成這個原因呢?基本上是因為布局布線沒做的特別好,兩個寄存器太近了,中間也沒有什么組合邏輯。數(shù)據(jù)嗖的一下就到了另外一個寄存器。因為用了一個人跑步來做示例。Hold Violation其實很好解決。既然你走的太快了,那就中間插入一點不影響邏輯功能的邏輯,讓你走慢一點,就好像插入一個緩沖帶;蛘呔妥屜乱患壍臅r間到的早一點,可以理解為讓門早點關上。(使用該方法要慎重,其相當于人為引入clock skew,什么是clock skew后面再解釋)
綜上分析,我們可以得到下面的公式,其本質(zhì)就是描述數(shù)據(jù)到D的時間和時鐘到CLK的時間的關系。
我們來做一個總結(jié),其實簡單來說。關鍵是看兩個路徑,一個是數(shù)據(jù)什么時候到寄存器D端,一個是時鐘上升沿什么時候到寄存器的時鐘端口。
2、Static Timing Analysis接下來我們看一個非常重要的概念,靜態(tài)時序分析即STA。
靜態(tài)時序分析會將路徑視為一條一條的向量,如下圖的箭頭所示。然后檢查相應的時間是否出現(xiàn)違例。其不會分析功能的正確性,其判斷的僅僅是時序。
我們來給時序路徑做一個定義。時序路徑包括一個起始點,一個結(jié)束點。起始點有兩種情況,一個是整個設計的輸入端口,另外一個就是寄存器的Clock pin。而結(jié)束點的話為寄存器的輸入pin(不包括clock pins),或者是整個設計的輸出端口。因此一共就有2x2=4種情況。具體的我們往后接著看。
我們直接看下圖,靜態(tài)時序分析的路徑被劃分為四種。最最常見的是reg2reg。即從一個寄存器的CLK pin到另外一個寄存器的D(或者en) pin。
我們來看一下靜態(tài)時序分析的目標;诩s束條件,檢查max delay和min delay是否都符合規(guī)則。這里PPT講的不太清楚,我們往下接著看幾個實際的例子,就清楚了。
我們假定一個非常簡單的邏輯,從ab到e。對于STA工具,會將其轉(zhuǎn)換為圖去分析。因此我們有很多節(jié)點和邊,如下圖所示。我們假設這個模塊就是整個設計了。從原始輸入到每個SP,我們認為消耗時間為0。從EP到輸出,我們認為消耗時間也是0。
對于時序分析而言,我們采用基于節(jié)點的分析方式,我們不會把每一條路徑都羅列出來。這樣當節(jié)點增大的時候,會出現(xiàn)數(shù)據(jù)爆炸。相對的,我們基于節(jié)點分析,找到相對于該節(jié)點最差的路徑。
由此引出了兩個概念,一個是數(shù)據(jù)到達節(jié)點的時間,一個是數(shù)據(jù)應該需要什么時候到達節(jié)點。如果到達節(jié)點的時間晚于需要到達的時間,則會出現(xiàn)時序違例。(我們在這里只分析max delay,min delay暫時不談)
我們將逐級的分析ATs和RATs。下面這個圖還不是特別直觀,我們直接看個例子。
假設我們已經(jīng)有了下面的模型,時鐘周期是12的話,下面這個電路是否滿足要求呢?我們基于上面的概念進行分析。
首先,我們構(gòu)建好圖。下面的數(shù)字代表AT,即數(shù)據(jù)到達時間。從SRC到a,b,c時間為0,這個前面已經(jīng)談過。從a到d的時間為1,從d到g的時間為3,則g的AT為3+1=4。對于f,其可以從d過來,也可以從b過來。從d過來到達時間為5+1=6,從b過來時間為0+4=4,我們選最晚到達的時間,所以f的AT為6。
基于此,可以逐步得到到達SNK的AT為15。
對于RAT,我們要從右向左看,SNK的RAT為12,則j,k,h的RAT也都為12。對于h而言,如果要滿足k的要求,則其RAT應該為10,如果要滿足n的要求,則其RAT應該為12-5=7。我們?nèi)≥^小的值,則h的RAT為7;诖艘(guī)則,我們可以填上所有的RAT。
很顯然,此時我們可以得到關鍵路徑是哪一條,并且發(fā)現(xiàn)這個關鍵路徑是違例的。
我們再來看一個概念,F(xiàn)alse Path。即虛假路徑,為什么這么叫呢?因為這條路徑實際上是不會經(jīng)過的。比如下圖,兩個MUX一個用SEL,一個用~SEL。那么這樣的話,其不可能做出同樣的選擇(比如左邊圖的都選擇SEL=0的情況)。
左邊那條路徑實際上是肯定不會走的,這種路徑就是False Path。但STA工具不知道這一點,因此我們需要自己手動設置。
3、Design Constraints我們再來看一個非常重要的概念,設計約束。
上一篇文章已經(jīng)提到了,綜合工具是基于約束條件去做綜合。而不是漫無目的的去做綜合。這個約束條件需要我們自己提供,通常我們采用SDC語法。該語法是TCL語言的超集。
通過約束我們給芯片一個指定的工作環(huán)境。告訴芯片工作在什么頻率啊,時鐘信號怎么樣啊,你面積應該有多大啊等等。然后綜合工具就會往這個方向去努力綜合,讓芯片可以在這個約束條件工作起來。
這里提一個重要的概念,集合。SDC中的collection和TCL中的列表不一樣。collection的元素本質(zhì)上是一個個的指針,指向你想要的元素。想使用具體的元素,應該用下面的語法。這里其實就需要大家自己去看相應的視頻教程和官方文檔了。
我們來看一些設計目標的一些名稱。在寫設計約束的時候,這些名詞會被反復調(diào)用,比如get_ports 等。對于一個模塊,其頂層名稱就是我們的design。其對外引出的端口叫做port。調(diào)用的模塊稱為reference,例化的實例叫做cell。具體的大家看一下下面的代碼和對應的概念即可。
有了上述的概念,就可以做很多事了,比如下面的語法。這里舉個例子,想要獲取所有的叫做clk的端口,設置成為理想始終網(wǎng)絡,便可以使用下面的語法。更加具體的用途大家可以找?guī)讉sdc看一看,有了這篇文章的說明,大家結(jié)合查資料。大概可以搞清楚到底是在約束什么。
set_ideal_network [get_ports clk]
我們再來看一下時鐘定義,時鐘定義可以說是綜合最重要的東西了。涉及到時鐘的信號一定要聲明好,否則會被視為普通信號,從而不會進行相應的時序分析,后果很嚴重。
我們來看一下怎么創(chuàng)建時鐘,如下圖所示。
下面這個generated clock稍微復雜一點,我解釋一下,其中create_generated_clock是SDC中的一個命令,用于定義一個由設計中某個現(xiàn)有的時鐘信號生成的派生時鐘(derived clock)。這個命令通常用于以下幾種情況:
當設計中存在時鐘分頻器時,需要為分頻后的時鐘定義派生時鐘。
當時鐘網(wǎng)絡中存在時鐘樹時,需要為時鐘樹的分支定義派生時鐘。
整個命令的意思是:創(chuàng)建一個名為gen_clock的派生時鐘,其源時鐘是設計中的clk端口,該派生時鐘是源時鐘的一半頻率,并且這個派生時鐘用于作用名為FF1的觸發(fā)器的輸出引腳Q。
有關時鐘的定義還有以下一些語法,我這里分別解釋一下。
set_ideal_network命令是用來指定一個網(wǎng)絡(通常是時鐘或復位信號)應該被綜合工具視為理想網(wǎng)絡。這意味著這個網(wǎng)絡被假設為沒有延遲和抖動,并且具有無限的能力來驅(qū)動負載。在實際的硬件實現(xiàn)中,時鐘網(wǎng)絡總是會有一定的延遲和抖動,因此set_ideal_network命令不適用于描述真實世界的時鐘行為。隨著設計流程的進展,會用更準確的時鐘模型來替換這個理想模型,以便進行更精確的時序分析和優(yōu)化。
set_clock_transition命令用于指定時鐘信號在邏輯電平之間轉(zhuǎn)換的時間。這個轉(zhuǎn)換時間通常被稱為時鐘的邊沿斜率(edge slope),它表示時鐘信號從低電平跳變到高電平或從高電平跳變到低電平時所需的時間。
set_clock_uncertainty命令用于指定時鐘信號的不確定性。時鐘不確定性是由于時鐘信號在傳播過程中的各種因素(如時鐘偏斜、時鐘抖動、環(huán)境噪聲等)導致的時鐘邊沿到達時間的不確定性。當考慮不確定性的時候,自然會讓綜合變得更加困難,如果考慮不確定性都能PASS,那在理想時鐘下更加會PASS。
set_propagated_clock命令用于指定一個時鐘信號是一個已傳播的時鐘。已傳播的時鐘通常是指在設計中通過時鐘網(wǎng)絡傳播后的時鐘信號,它可能包含了時鐘樹綜合(clock tree synthesis)后的延遲。
談完了時鐘的約束以后,我們再來看一下IO的約束。其實把時鐘約束好以后,reg2reg的路徑都已經(jīng)解決了,但我們還有三種路徑?jīng)]有解決,因此我們要定義好輸入輸出約束,簡單來說就是要定義好輸入延遲和輸出延遲。
此外還有一種替代方式,如下所示。
上述概念的具體圖示如下所示,這里簡單解釋一下。
首先是input delay,該概念非常簡單,之前我們認為輸入進來的時候剛好對應時鐘的上升沿,沒有任何的延遲,但實際上肯定不現(xiàn)實,肯定是過了一會才來的。這個值如果設的很高的話,則意味著輸入信號要很久才到來,那后面能做邏輯的時間就很短了。
然后是output delay,這個稍微難理解一點。其描述了模塊輸出到下一級模塊需要多少延遲,也可以理解為在捕獲沿到來時,數(shù)據(jù)已經(jīng)存在的時間。我們想一想,這個延遲如果設的很大,那么我們數(shù)據(jù)就應該提前很久已經(jīng)算出來了,能做的邏輯又減少了。因此對于這兩個delay,一般不要設的太大,否則布局布線會很困難,當然也不可能亂設置,具體還是取決于上級模塊和下級模塊。此外我們還要考慮min delay path,這個大家可以自己思考。
除此之外輸入驅(qū)動和輸出負載,可以視為電阻或電容模型。
我們回顧一下false path,其語法設置如下所示。這里我詳細解釋一下。set_false_path命令用于指定設計中某些路徑不會影響時序分析的結(jié)果。這通常用于那些不依賴于時鐘周期或不需要滿足特定時序要求的路徑,例如復位路徑、異步信號路徑或某些測試路徑。
命令set_false_path through [get_pins mux1/I0] through [get_pins mux2/I0]的含義如下:
set_false_path:用于標記一些路徑為“假路徑”(false paths),即這些路徑上的時序違例不會被報告為設計錯誤。through [get_pins mux1/I0]:這指定了假路徑的第一個點,即mux1的輸入引腳I0。get_pins是一個SDC函數(shù),用于選擇設計中的特定引腳。
through [get_pins mux2/I0]:這指定了假路徑的第二個點,即mux2的輸入引腳I0。
綜合以上,這個命令告訴時序分析工具,從mux1的輸入引腳I0到mux2的輸入引腳I0的路徑是一個假路徑。這意味著在這兩個引腳之間的任何時序違例都不會被視為設計錯誤,時序分析工具在分析時序時會忽略這條路徑。
上面講的是不會走的路徑。此外還有跨時鐘域的時鐘約束。這里我重點解釋一下最后那個。
set_multicycle_path命令用于指定某些特定的時序路徑可以超過一個時鐘周期來完成數(shù)據(jù)的建立(setup)或保持(hold)。
命令set_multicycle_path setup from F1/CP to F2/D 2的含義如下:
set_multicycle_path:用于設置多周期路徑約束。
setup:這指定了約束的類型是建立時間,即數(shù)據(jù)必須在時鐘邊沿到達之前在輸入端穩(wěn)定的時間。
from F1/CP:這指定了路徑的起始點,即從觸發(fā)器F1的時鐘引腳CP開始。
to F2/D:這指定了路徑的終點,即到觸發(fā)器F2的數(shù)據(jù)引腳D結(jié)束。
2:這指定了允許的最大時鐘周期數(shù)。在這個例子中,它表示從F1到F2的路徑可以有最多兩個時鐘周期的延遲。
綜合以上,這個命令告訴時序分析工具,從F1的時鐘引腳到F2的數(shù)據(jù)引腳的路徑是一個多周期路徑,并且在建立時間分析中允許有最多兩個時鐘周期的延遲。這意味著F2可以在F1的時鐘邊沿之后的第二個時鐘周期內(nèi)采樣到穩(wěn)定的數(shù)據(jù)。
這種約束通常用于以下情況:
長路徑:在某些情況下,由于路徑過長,數(shù)據(jù)無法在一個時鐘周期內(nèi)到達目的地,因此需要多個時鐘周期。
特殊邏輯:某些復雜的邏輯操作可能需要多個時鐘周期來完成。
[/ol]使用set_multicycle_path命令可以幫助時序分析工具更準確地評估設計的時序性能,并確保在允許的時鐘周期內(nèi)數(shù)據(jù)能夠穩(wěn)定。
很多時候,設計中的某些值會是一個常數(shù),用于表示特定的工作狀態(tài)。一旦這樣設置,很多路徑就是false path了。比如0送到mux的sel端。為了解決這種情況,使用下面的方法。
set_case_analysis命令用于指定一個信號或端口在綜合或時序分析期間的固定邏輯值。這個命令通常用于模擬某些特定的設計狀態(tài),例如測試模式或配置模式,而不需要實際改變硬件的物理連接。
命令set_case_analysis 0 [get_ports TEST_MODE]的含義如下:
set_case_analysis:這是SDC命令,用于設置案例分析約束。
0:這指定了信號或端口的固定邏輯值。在這里,它表示TEST_MODE端口被固定為邏輯0。
[get_ports TEST_MODE]:這是一個SDC函數(shù),用于選擇設計中的特定端口。在這里,它指定了TEST_MODE端口。
綜合以上,這個命令告訴綜合或時序分析工具,在進行分析時,將TEST_MODE端口視為固定為邏輯0。這意味著在分析過程中,工具會假設TEST_MODE端口始終輸出邏輯0,而不管實際電路中的信號如何變化。
這種約束通常用于以下情況:
測試模式:在設計驗證期間,可能需要模擬某些測試條件,通過固定某些測試模式控制信號的值來簡化測試過程。
安全性分析:在某些安全性關鍵的系統(tǒng)中,可能需要分析在特定配置下的系統(tǒng)行為,例如在故障安全模式下的操作。
配置設置:對于可配置的邏輯,可能需要分析不同的配置設置對性能的影響。
[/ol]使用set_case_analysis命令可以幫助設計者在不同的設計狀態(tài)下進行分析,而不需要對硬件進行物理上的修改。這有助于提高設計的驗證覆蓋率和確保在各種操作模式下設計的穩(wěn)定性。
此外還有DRV約束,比如最大扇出啥的,具體的大家看下圖即可。
本節(jié)課后面還有如何看報告以及MMMC講解。但講的比較粗略,并且報告是cadence的報告,我也沒接觸過,這里就不寫了,感興趣的可以自己看一下。
下一篇文章將進入芯片后端。
系列文章入口——
【芯片設計】SoC 101(一):緒論 | 【芯片設計】FIFO漫談(零)從無處不在的FIFO開始說起 | 【芯片設計】計算機體系結(jié)構(gòu)(一)虛擬內(nèi)存 | 【芯片設計】深入理解AMBA總線(零)緒論
| 【芯片設計】握手協(xié)議的介紹與時序說明 | 【芯片設計】復位那些小事 —— 復位消抖 | 【芯片設計】快速入門數(shù)字芯片設計(一)Introduction | 【芯片驗證】UVM源碼計劃(零)下定決心讀源碼前的自測環(huán)節(jié)
| 【芯片設計】異步電路碎碎念(一) 到底什么是異步電路
| 【芯片設計】從RTL到GDS(一):Introduction
| 其他文章鏈接——
【芯片驗證】sva_assertion: 15道助力飛升的斷言練習 | 【芯片驗證】可能是RTL定向驗證的巔峰之作 | 【芯片驗證】RTL仿真中X態(tài)行為的傳播 —— 從xprop說起 | 【芯片驗證】年輕人的第一個systemVerilog驗證環(huán)境全工程與解析 |
【芯片設計】verilog中有符號數(shù)和無符號數(shù)的本質(zhì)探究
| 【芯片設計】論RTL中always語法的消失術(shù) | 【芯片設計】代碼即注釋,注釋即代碼 | 【芯片設計】700行代碼的risc處理器你確實不能要求太多了 |
入職芯片開發(fā)部門后,每天摸魚之外的時間我們要做些什么呢 | 如何計算系統(tǒng)的outstanding 和 burst length? | 芯片搬磚日!け扑缽娖劝Y的關鍵詞不對齊事件 | 熟人社會里,一群沒有社會價值的局外人 |
|