joy

joy的数字花园

一直游到海水变蓝
github

靜態時序分析基礎

前言#

本笔记仅介绍静态时序分析的基本概念,不包含:

  • 异步,即移除、恢复
  • 时序概念,即虚假路径、多周期路径等
  • 高级时序域知识
    • POCV, MCMM 等等

什麼是 STA#

由於時鐘頻率越快,晶片中的邏輯單元在單位時間內能夠完成的操作就越多,所以頻率與晶片性能成正相關。而晶片設計需要在 PPA 之間進行權衡,那麼如何才能知道一枚晶片正常工作的頻率極限到底是多少呢?這就引入了 STA 靜態時序分析的概念。

image.png
STA 用於驗證設計是否能夠安全運行在給定的時鐘頻率下且沒有時序違例。STA 存在以下特點:

  • 優點
    • 無需輸入激勵仿真
    • 完備的時序檢查
  • 缺點
    • 無法處理異步時序

STA 應用場景#

image.png

STA 可以應用於 PD 多個階段,並且分別具有不同特點,如:

  1. synthesis: 在邏輯設計階段,由於沒有與佈局有關的物理信息,因此可以假設互連線是理想狀態的,此階段會更關注查看導致最差路徑的邏輯。在這個階段使用的另一種技術是採用線負載模型(wireload model) 來估算互連線的長度,線負載模型會基於邏輯單元的扇出提供一個估計的 RC 值
  2. Pre-CTS: 在物理設計的一開始,時鐘樹被認為是理想的,即它們具有零延遲。而在 CTS 後,時鐘則具有實際的傳播延遲。
  3. Pre-Route: 在實際布線前,STA 用於計算延遲的金屬線寄生 RC 為估計值

image.png

單元#

單元可以是標準單元、IO 緩衝器或者是如 USB 內核這樣的複雜 IP。除時序信息外,庫單元描述中還包含一些其它屬性,例如單元面積和功能,這些屬性與時序無關,但在 RTL 綜合(synthesis)過程中會用到。

引腳電容#

單元的每個輸入和輸出都可以在引腳(pin)上指定電容。在大多數情況下,僅為單元輸入引腳指定電容,而不為輸出引腳指定電容,即大多數單元庫中的輸出引腳電容為 0。

image.png

上面的示例展示了輸入 INP1 引腳電容值的一般規格(specification)。在最基本的格式中,引腳電容被指定為單個值(在上面的示例中為 0.5 個單位)。電容單位通常為皮法拉(pF),一般在庫文件的開頭指定。單元描述中還可以為rise_capacitance(0.5 個單位)和fall_capacitance(0.45 個單位)分別指定值,這些值是指引腳 INP1 上發生電平上升和下降跳變時的值。也可以將rise_capacitancefall_capacitance的值指定為範圍,並在描述中指定下限值和上限值。

驅動強度#

輸入引腳電容定義在 liberty 中,而輸出引腳電容則由該單元驅動的所有下級單元所決定。當 CMOS 單元切換電平狀態時,切換的速度取決於輸出引腳上的電容被充放電的速度

image.png

通常來說,單元驅動強度決定了可以驅動的最大電容負載,最大電容負載又決定了扇出的最大數量,即可以驅動多少個其他單元。較高的輸出驅動對應較低的輸出上拉 / 下拉電阻,這使單元可以在輸出引腳上對較大的負載進行充電和放電

  • 驅動強度越大則單元面積越大,且 max_cap 也越大。
  • 驅動強度越大,對應的輸出電阻越小,延遲也就越小。

image.png|500image.png|500

  • 如果標準單元庫中只有小驅動強度的標準邏輯單元,則對時序有何影響?
    • 當整個庫只有小驅動單元時,首先想到的是每個單元的驅動能力弱,輸出電阻更大。
    • 如果一個反相器的驅動強度小,那麼它能夠驅動的最大負載電容也較小。如果設計中某些節點必須驅動較大的電容,比如長線或高扇出網絡,這時候小驅動單元可能無法滿足需求,從而導致建立時間或保持時間違規。

傳播延遲#

單元的傳播延遲 (propagation delay) 是由電平切換波形上的某些測量點定義的。這些閾值的單位是 Vdd 或電源的百分比,對於大多數標準單元庫,通常將50% 閾值用於計算延遲。

image.png

這裡的傳播延遲按照輸出信號的 rise/fall 分為兩種(不相等):

  • output rise delay: 從輸入信號到達下降沿閾值點開始,到輸出信號到達上升沿閾值點結束的這段時間延遲
  • output fall delay:與 output rise delay 相反

壓擺#

壓擺率 (slew rate) 的定義是電壓轉換速率。在 STA 中,通常會根據電平轉換的快慢來衡量上升波形或下降波形。壓擺 (slew) 通常是根據轉換時間 (transition time) 來定義的,轉換時間是指信號在兩個特定電平之間轉換所需要的時間。請注意,轉換時間實際上就是壓擺率的倒數,因此轉換時間越大,壓擺率就越低,反之亦然。

一般使用指定的閾值電壓來規定過渡時間計算的起點和終點。

image.png

Slew rate 和 Slew 非同一件事。Slew 為 transition 而 Slew rate 為其倒數。

時序弧#

時序弧描述了信號在單元引腳之間傳輸的延遲以及信號的跳變情況。

  • 像與門、或門、與非門、加法器這些組合邏輯單元,每個輸入引腳到每個輸出引腳都存在一條時序弧
  • 而像觸發器之類的時序邏輯單元除了有從時鐘引腳到輸出引腳的時序弧,還有相對於時鐘引腳的數據引腳時序約束 (timing constraint)

每個時序弧都具有特定的時序敏感 (timing sense), 即輸出如何針對輸入的不同跳變類型而變化。在非單邊 (non-unate) 時序弧中,僅僅從一個輸入引腳的跳變方向是無法確定輸出引腳電平將如何跳變的,還要取決於其他輸入引腳的狀態

image.png

時序模型#

邏輯單元的時序模型 (timing model) 旨在為設計中的各種單元實例 (instance) 提供準確的時序信息。

  • 每個時序弧都有時序模型
  • 時序模型由詳細電路仿真所得

對於一個 inverter 而言其存在兩種延遲:分別為輸出上升沿延遲 $T_{r}$ 和輸出下降沿延遲 $T_{f}$。

image.png

通過 inverter 的 delay and output transition 主要取決於:

  • 輸出負載,即反相器輸出引腳上的電容負載
  • 輸入信號的過渡 (transition) 時間
  • 晶體管版圖設計:可忽略

一個邏輯單元的信號輸入,如同在水槽上來了水流,水流首先推動藍色水車運轉(類似於輸入變換時間),然後把水池(輸出電容)灌滿後,才能推動紅色水車的運作(下一個邏輯單元)。

image.png|625

延遲值與負載電容有直接關係:負載電容越大,延遲越大。在大多數情況下,延遲也會隨著輸入信號過渡時間的增加而增加。PS: 非絕對。

NLDM#

邏輯單元的時序模型可以簡單理解為以 input slew 和 output load 為參數的函數,但簡單的線性時序模型在應用於亞微米技術時並不準確。因此,目前大多數單元庫都使用更複雜的非線性延遲模型 (non-linear delay model)。

大多數單元庫都包括表格模型 (table model),用於為單元的各種時序弧指定延遲並進行時序檢查。這些表格模型被稱為 NLDM (Non-Linear Delay Model),可用於延遲、輸出壓擺計算或其他時序檢查。表格模型中提供了:在單元輸入引腳處輸入過渡時間和輸出引腳處輸出負載電容的各種組合下通過單元的延遲。

image.png

根據延遲表,輸入下降過渡時間為 0.3ns 且輸出負載為 0.16pf 時,反相器的上升延遲為 0.1018ns。由於輸入的下降沿跳變導致反相器輸出的上升沿跳變,因此當輸入引腳發生下降沿跳變時,應該去查詢 cell_rise 延遲表。注意,表格模型也可以是 3 維的,例如一個具有互補輸出 Q 和 QN 的觸發器。

NLDM 模型不僅可以用於計算延遲,而且還可用於計算邏輯單元輸出引腳的過渡時間,該時間同樣由輸入過渡時間和輸出負載電容來表徵。

所以通過 NLDM 模型可計算:

  1. Rise Delay
  2. Fall Delay
  3. Rise Slew
  4. Fall Slew

另外,如果沒有表中對應索引,可通過插值計算結果。

降額#

跳過

壓擺值 (slew) 基於的是在庫中指定的測量閾值點,大多數上一代的庫 (0.25um 或更舊的庫) 都使用 10% 和 90%(對應波形的線性部分)作為壓擺 (或稱過渡時間) 的測量閾值點。

隨著技術的發展,實際波形最線性的部分通常在 30% 至 70% 之間。因此,大多數新一代時序庫都將壓擺測量閾值點指定為 Vdd 的 30% 和 70%。但是,由於之前測得的過渡時間在 10% 至 90% 之間,因此在填充庫時,通常將測得的 30% 至 70% 的過渡時間加倍,這由壓擺降額系數 (slew derate factor) 指定,通常指定為 0.5。壓擺測量閾值點為 30% 和 70% 且壓擺降額系數為 0.5,等效於測量閾值點為 10% 和 90%。

組合邏輯單元#

對於兩輸入與門:共有四種 delay 以及四種 output transition。

  • 上升下降 * 兩個輸入引腳 = 4
  • 而在 FPGA 中,每個邏輯單元的所有延時信息基本是固定的,所以每一種邏輯單元都分別擬合一個固定的延遲(例如 LUT 是 0.1ns,DSP 是 1.3ns 等)。

image.png

通用組合邏輯塊#

考慮以下這個具有三輸入和兩輸出的通用組合邏輯塊 (General Combinational Block):

image.png
像這樣的組合邏輯塊可以具有多個時序弧。通常,從塊的每個輸入到每個輸出都有一條時序弧

時序邏輯單元#

時序邏輯單元的時序弧如下:

image.png|500

對於引腳 D, SI 和 SE 的同步輸入信號,存在以下時序弧(both rise and fall):

  • 建立時間檢查時序弧
  • 保持時間檢查時序弧

對於引腳 Q 的同步輸出信號,存在以下時序弧:

  • CK to Q or QN 傳播延遲弧

對於引腳 CDN 的異步輸入信號,存在以下時序弧:

  • 移除時間檢查時序弧
  • 恢復時間檢查時序弧

此外,對於時鐘引腳和異步引腳還存在

  • 脈衝寬度時序檢查

建立和保持#

建立時間和保持時間的同步時序檢查用於確保數據能夠正確通過時序單元傳播。這些時序檢查可驗證輸入的數據在時鐘有效沿上是否為確定的邏輯狀態,並且在有效沿上將正確的數據鎖存下來。

二維表格模型是根據約束引腳 constrained_pin (D) 和相關引腳 related_pin (CK) 處的過渡時間確定的。

image.png

setup and hold 詳細內容在後文介紹。

異步時序檢查#

跳過

狀態相關的時序模型#

跳過

輸入和輸出之間的時序弧取決於模塊中其他引腳的邏輯狀態。

黑盒的接口時序模型#

跳過

高級時序模型#

跳過

非線性延遲模型 (NLDM) 這類的時序模型是基於輸出負載電容和輸入過渡時間來表示通過時序弧的延遲的。實際上,單元輸出的負載不僅包括電容還應當包括互連電阻 (interconnect resistance)

由於 NLDM 方法假設輸出負載為純電容,因此互連電阻成為了一個問題。即使互連電阻不為零,但當互連電阻的影響較小時,仍使用了這些 NLDM 模型。在互連電阻存在的情況下,延遲的計算方法通過在單元的輸出端獲得等效的有效電容 (effective capacitance) 來改進 NLDM 模型。延遲計算工具中使用的 “有效” 電容法獲得的等效電容可保證單元輸出延遲與具有 RC 互連的單元輸出延遲相同

由於 NLDM 無法很好地處理互連電阻帶來的誤差,所以提出了如 CCS (Composite Current Source) 等更高級的時序模型。

時鐘#

偏斜#

偏斜 (skew) 是指兩個或多個信號 (數據或者時鐘) 之間的時序之差。例如,如果一個時鐘樹 (clock tree) 有 500 個終點,並且有 50ps 的偏斜,則意味著最長時鐘路徑和最短時鐘路徑之間的延遲差為 50ps

時鐘樹的起點通常是定義時鐘的節點,時鐘樹的終點通常是同步元件 (例如觸發器) 的時鐘引腳。時鐘延遲 (clock latency: Source + Insertion) 是指從時鐘源到終點所花費的總時間,時鐘偏斜 (clock skew) 是指到達不同比時鐘樹終點的時間差。

image.png

理想時鐘樹是假定時鐘源具有無限驅動力,時鐘可以無延遲地驅動無限個終點。另外,假定時鐘樹中存在的任何邏輯單元都具有零延遲 (zero delay)。在邏輯設計的早期階段,STA 通常使用理想的時鐘樹來執行,因此分析的重點是數據路徑 (data path)。通過 set_clock_latency 可顯示指定時鐘樹延遲。

不確定性#

set_clock_uncertainty 命令為時鐘沿的出現指定了一個窗口。時鐘邊沿時序的不確定性將考慮多個因素,例如時鐘周期抖動 (jitter) 和用於時序驗證的額外裕量 (slack)。實際上是不存在理想時鐘的,所有時鐘都具有一定的抖動量,並且在指定時鐘不確定度時應包括時鐘周期抖動。

在時鐘樹被實現 (implement) 之前,時鐘不確定度還必須包括預期的時鐘偏斜。而保持時間檢查不需要將時鐘抖動包括在內,因此通常為保持時間檢查指定較小的時鐘不確定度

實際中的時鐘信號#

實際的時鐘信號包括上升沿和下降沿:

image.png
將兩種時鐘信號結合得到理想情況下的眼圖,此時為只有 transition 的理想時鐘:

image.png

但實際上時鐘信號存在不同的到達時間(jitter),此時的眼圖為:

image.png

此外,時鐘還會因為電源供應變化導致電壓下降和接地反彈。

image.png

最終得到實際情況下的時鐘信號:

image.png

針對電平波動,定義 noise margin, 允許一定失真:

image.png
時鐘信號無抖動區域稱為 window where data is reliable:

image.png

而時鐘信號存在抖動的區域稱為 jitter: Jitter has to be accounted for in the timing reports. We model this using one more parameter called Uncertainty.

image.png
示例:不確定性 = 90ps = 0.09ns

image.png

時鐘域#

一個時鐘通常驅動許多觸發器,由同一時鐘驅動的一組觸發器稱為其時鐘域 (clock domain)。下圖即存在兩個時鐘域:

image.png

需要關注一個問題:兩個時鐘域是相關的還是彼此獨立的?答案取決於是否存在一條從一個時鐘域開始並在另一時鐘域結束的數據路徑,如果沒有這樣的路徑,我們可以肯定地說這兩個時鐘域彼此獨立,這意味著沒有時序路徑從一個時鐘域開始而在另一時鐘域結束。

若存在跨時鐘域的數據路徑 (如下圖所示),則必須確定這些路徑是否為真實 (real) 路徑:例如一個兩倍頻時鐘驅動的觸發器發起數據,再由一倍頻時鐘驅動的觸發器捕獲數據,這條路徑就是一條真實路徑。

而虛路徑 (false path) 的一個例子是設計人員將時鐘同步器 (clock synchronizer) 邏輯明確放置在兩個時鐘域之間。在這種情況下,即使好像存在從一個時鐘域到下一時鐘域的時序路徑,但這也不是真實的時序路徑,因為數據沒有被約束要在一個時鐘周期之內通過同步器邏輯傳播。這樣的路徑稱為虛路徑(不是真實的),因為是由時鐘同步器來確保數據正確地從一個時鐘域傳遞到另一個時鐘域。

  • false path belongs to timing exceptions, so skip it.
  • 在設計中,有些路徑是不可能存在的,或者不可能發生的,這種路徑稱為虛路徑。虛路徑通常發生在異步電路以及跨時鐘域;或者電路內部邏輯複雜,推導後發現其實是常量,不會發生變化。

image.png

實際出現跨時鐘域的情況往往是雙向的,即從 USBCLK 時鐘域到 MEMCLK 時鐘域,以及從 MEMCLK 時鐘域到 USBCLK 時鐘域,這兩種情況都需要在 STA 中正確理解和處理。

SDC#

正確的約束對於分析 STA 結果很重要,只有準確指定設計環境,STA 分析才能夠識別出設計中的所有時序問題。STA 的準備工作包括設置時鐘、指定 IO 時序特性以及指定虛路徑和多周期路徑

image.png

為了對這種設計執行 STA,需要指定觸發器的時鐘、以及進入設計和退出設計的所有路徑的時序約束

指定時鐘#

要定義時鐘,我們需要提供以下信息:

  1. 時鐘源 (Clock source):它可以是設計的端口,也可以是設計內部單元的引腳 (通常是時鐘生成邏輯的一部分)。
  2. 週期 (Period): 時鐘的週期。
  3. 占空比 (Duty cycle): 高電平持續時間 (正相位) 和低電平持續時間 (負相位)。
  4. 邊沿時間 (Edge times): 上升沿和下降沿的時刻。

image.png

創建時鐘的例子:create_clock -name SYSCLK -period 20 -waveform {0 5} [get_ports SCLK];該時鐘名為 SYSCLK,並在端口 SCLK 上定義。SYSCLK 的週期指定為 20 個單位,如果未指定,默認時間單位為納秒(通常,時間單位會在技術庫中進行指定)。waveform 中的第一個自變量指定出現上升沿的時刻,第二個自變量指定出現下降沿的時刻。

時鐘不確定度#

可以使用 set_clock_uncertainty 約束來指定時鐘周期的時序不確定度 (uncertainty),該不確定度可用於對可能會減少有效時鐘周期的各種因素進行建模。這些因素可能是 jitter 以及可能需要在時序分析中考慮的任何其它悲觀度。

set_clock_uncertainty -setup 0.2 [get_clocks CLK_CONFIG];注意,建立時間檢查的時鐘不確定度將減少可用的有效時鐘周期。對於保持時間檢查,時鐘不確定度將用作需要滿足的額外時序裕量

image.png

時鐘延遲#

可用以下命令設置時鐘延遲,如 set_clock_latency 1.8 -rise [get_clocks MAIN_CLK]

時鐘延遲有兩種類型:網絡延遲 (network latency) 和源延遲 (source latency):觸發器時鐘引腳上的總時鐘延遲是源延遲和網絡延遲之和。在時鐘樹綜合完成後,從時鐘源到觸發器時鐘引腳的總時鐘延遲是源延遲加上時鐘樹從時鐘定義點到觸發器的實際延遲

  • 網絡延遲是指從時鐘定義點 (create_clock) 到觸發器時鐘引腳的延遲。
    • CTS 後忽略
  • 源延遲也稱為插入延遲 (insertion delay):是指從時鐘源到時鐘定義點的延遲,源延遲可能代表片上或片外延遲
    • CTS 後保留

image.png

源延遲和網絡延遲之間的一個重要區別是:一旦為設計建立了時鐘樹,就可以忽略網絡延遲 (假設指定了 set_propagated_clock 命令)。

約束輸入路徑#

觸發器 UFF0 在設計的外部,並向設計內部的觸發器 UFF1 提供數據。數據通過輸入端口 INP1 連接兩個觸發器。

image.png

CLKA 的時鐘定義指定了時鐘週期,這是兩個觸發器 UFF0 和 UFF1 之間可用的總時間。外部邏輯所需的時間為 Tclk2q (數據發起觸發器 UFF0 的 CK 至 Q 延遲) 加上 Tc1 (通過外部組合邏輯的延遲),因此輸入引腳 INP1 上的延遲定義指定了 Tclk2q 加上 Tc1 的外部延遲

以下是輸入延遲的約束 (可分別定義 minmax):

  • set Tclk2q 0.9
  • set Tc1 0.6
  • set_input_delay -clock CLKA -max [ expr Tclk2q + Tc1] [ get_ports INP1]

約束輸出路徑#

約束輸出路徑與約束輸入路徑類似,可通過命令 set_output_delay 來指定外部延遲:

image.png

時序路徑組#

設計中的時序路徑可以視為路徑的集合,每個路徑都有一個起點和一個終點。

image.png

時序路徑可以根據與路徑終點相關的時鐘分類為不同比時序路徑組 (path groups)。因此,每個時鐘都有一組與之相關的時序路徑。還有一個默認時序路徑組,其中包括了所有非時鐘 (異步) 路徑

image.png

外部屬性建模#

儘管 create_clockset_input_delayset_output_delay 足以約束設計中用於執行時序分析的所有路徑,但這些並不足以獲取該模塊 IO 引腳上的準確時序

對於輸入,需要在輸入端口處指定壓擺:

  • set_drive
  • set_driving_cell
  • set_input_transition

對於輸出,需要指定輸出引腳的負載電容:

  • set_load

驅動強度建模#

總之,設計人員需要指定輸入端的壓擺值來確定輸入路徑中第一個單元的延遲。在沒有該約束的情況下,將假設為理想過渡值 0,這顯然是不現實的。

set_driveset_driving_cell 約束用於對驅動模塊輸入端口的外部單元的驅動強度進行建模。在沒有這些約束的默認情況下,假定所有輸入都具有無限的驅動強度,即輸入引腳的過渡時間為 0

image.png

set_drive 明確指定了 DUA 輸入引腳上的驅動電阻值,該電阻值越小,驅動強度越高,電阻值為 0 表示無限的驅動強度。輸入端口的驅動強度用於計算第一個單元的過渡時間。指定的驅動強度還可用於計算在任何 RC 互連情況下從輸入端口到第一個單元的延遲值

  • 延遲值 = (驅動強度 * 網絡負載) + 互連線延遲。

set_driving_cell 約束提供了一種更方便,更準確的方法來描述端口的驅動能力。 set_driving_cell 可用於指定驅動輸入端口的單元類型。但由於輸入端口上的電容性負載而導致驅動單元的增量延遲被視為輸入上的附加延遲被包括在內。

image.png

作為上述方法的替代方法,set_input_transition 約束提供了一種在輸入端口表示過渡時間的便捷方法,並且可以指定參考時鐘。

image.png

負載電容建模#

指定輸出上的負載很重要,因為該值會影響驅動輸出的單元的延遲。在沒有該約束的情況下,將假設負載為 0,這顯然是不現實的。

set_load 約束在輸出端口上設置了電容性負載,以模擬由輸出端口驅動的外部負載。默認情況下,端口上的電容性負載為 0。可以將負載顯式地指定為電容值或某個單元的輸入引腳電容

image.png

DRV#

STA 中兩個常用的設計規則是最大過渡時間-max_transition和最大電容-max_capacitance。這些規則將會檢查設計中的所有端口和引腳是否滿足過渡時間和電容的規定約束

此外,還可以為設計指定其他設計規則檢查,比如: set_max_fanout (指定設計中所有引腳的扇出約束) 以及 set_max_area (用於設計)。但是,這些檢查適用於綜合 (synthesis) 而非 STA

延遲計算#

延遲計算基本概念#

由上文可知,每個單元的輸入引腳都存在引腳電容,所以每條 net 都將具有容性負載,其值為所有 fanout 的引腳負載電容及互連線的寄生電容之和。

考慮如下設計:

image.png

對於 NET0, 在不考慮互聯寄生的情況下,其電容等於 UAND1UNOR2 的輸入引腳電容之和。由此,可將上圖等價為:

image.png

輸出 O1 的負載電容等價於輸出端口負載(未指定,可通過 set_load 指定)加上 UNOR2 輸入引腳負載電容(已在庫中指定),所以此時只要為輸入 I1 指定壓擺(或 set_drive),即可獲得單元 UAND1 相對於該 input transition 的 propagation delay and output transition(知道了上級的 output transition, 則又可以得到下級單元的 input transition)。

由於多輸入單元存在不同輸入到輸出的多條 timing arc, 所以 output transition 的值由 slew merge 結果來決定。

有效電容計算單元延遲#

當單元輸出端的負載包含互連電阻時,NLDM 模型不可直接使用。因此,採用 “有效” 電容法來處理電阻的影響

有效電容法試圖找到一個可以用作等效負載的電容,以使原始設計與具有等效電容負載的設計在單元輸出的時序方面表現一致。這個等效電容被稱為有效電容 (effective capacitance)。

image.png

即在實際情況下,互連寄生不能忽略電阻的影響,此時可將 RC 互連建模為更精簡的 PI model。由於 NLDM 只接受電容,所以將 RC 計算為一個等效的 $C_{eff}$ ,進而可以繼續使用 NLDM 查表得到單元延遲。那如何計算得到這個 $C_{eff}$ 則存在不同算法:如二階 AWE, Arnoldi 算法等。

注意:雖然能夠得到近似的單元延遲,但 output slew 與單元實際輸出波形並不一致

Net Delay#

對於有大學簡單電路背景的同學應該很熟悉,走線延遲的本質是由導通的電路是可以等效為電阻電容(R 與 C),其上信號傳遞的延遲可以簡化為 RC Delay。總體而言,走線的延遲取決於線寬、線長(Wire length)、工藝、扇出分支(Fanout)。而在不同 EDA 階段,我們可以通過不同模型去預估兩個引腳之間的走線延遲。

image.png

  1. 邏輯綜合:如 Synopsys 的 Design Compiler,是基於走線負載模型(Wire Load Model,WLM)預估兩個信號引腳之間的走線延遲。在這個設計環節,晶片設計還沒走到佈局布線,因此沒有相對位置來具體的走线路徑。因此 WLM 是根據扇出數量來估計網絡的長度,從而獲得延遲的(誤差可想而知,畢竟扇出少的邏輯路徑也可能在佈局時被扯得很遠)。WLM 通常是由對應的 ASIC/FPGA 廠商會提供,然後設計者基於自己的設計進行微調即可,在一個設計中,不同層次位置、不同的走線可以配置不同的 WLM,從而逼近實際延遲。
  2. 佈局:佈局期間知道了每個邏輯單元的具體位置,因此我們可以充分利用位置信息來推測路徑:我們首先估計兩個相連的邏輯單元之間線長是多少,隨後通過線長,預估延遲。需要留意的是,雖然理論上走線越長,延遲越長,但是並不完全是線性關係,畢竟從廣州北京,走高速開始開縣道還是不同的。通常而言,以 Cadence Innovus 的布線前、佈局後(Post-placement pre-route)的時序估計是基於所謂的 TrialRoute(嘗試布線)或 Early Global Route (前期全局布線)去估計布線情況,然後基於這個粗糙的布線情況,進行 RC 寄生參數的提取,然後將這些寄生參數與驅動單元的輸入引腳電容相加,從而獲得走線延遲。其中最重要的是如何獲得一個準確的布線估計,一個準確的估計可以實現很小的布線前後的時序跳躍 (Timing Jump)
  3. 布線:在這期間不僅知道位置,還知道了具體的金屬走線。因此此時可以直接的提取 RC 參數,然後跑時序分析引擎即可。

Elmore 模型計算互連延遲#

Elmore 是用於在特定條件的 RC 互連結構下計算 net delay 的延遲模型。

壓擺合併 (TBD)#

路徑延遲計算#

回顧幾個概念:timing path, timing arc

理論上的 timing path 存在一個 start point 和一個 end point:

  • start point: input port and clk pin
  • end point: d pin and output port

所以,一共存在四種 timing path: r2r, i2o, i2r and r2o

而 timing arc 用於描述:

  • pin to pin 之間的信號傳輸關係(傳輸延遲以及如何變化)
  • timing constraints: setup/hold etc..

所以,一但使用 timing arc annotate whole design, 則計算路徑延遲即將所有 net arc and cell arc 相加

I2O#

第一種時序路徑,即 input port to output port。

image.png

而從輸入端口到第一個 load cell 需要特殊處理,即可以指定第一個反相器輸入端的過渡時間 (或壓擺),若沒有此類指定的話,就假定過渡時間為 0(相當於理想情況)。

  • 在 OpenSTA 中如果不指定的話第一個 cell 的 load slew 為 0。在 seedRootSlew 時可以計算出 root 到第一個 cell 的 load delay & load slew。

此外,可根據第一個 cell 輸出處的 RC 負載情況計算得到一個等效電容,進而查表得到第一個 cell delay 和 output slew。

當計算得到第一個 cell 的 output slew 後,又可以得到下級單元的 input slew, 以此循環。

注意,和第一级輸入類似,最後一级輸出需要手動 set_load, 否則僅使用網絡 N3 的線負載。

I2R#

類似計算。

image.png

R2R#

類似計算。

image.png

時序圖#

STA 將設計分解為時序路徑,計算沿每條路徑的信號傳播延遲,並檢查設計內部和輸入 / 輸出接口的時序約束違例。

時序路徑#

timing path 存在 start and end point, 定義分別如下:

image.png

根據 start point 和 endpoint 可將 timing path 分為四類:

  • input port to d pin, I2R
  • clk pin to output port, R2O
  • clk pin to d pin, R2R
  • input port to output port, I2O

image.png

時序路徑為一段段時序弧的集合,除了可以根據起點和終點分類外,還可以 By signal type or timing check: Data pathclock pathclock-gating pathasynchornous path

image.png

時序圖#

考慮如下網表:

image.png

將上述電路轉換為 'Direct Acyclic Graph (DAG)' 如下所示:

image.png

OpenSTA 時序圖#

時序圖是一個平坦的 DAG,雖然 OpenSTA 具有完整的層次網表。

以下網表為例:
image.png|425

image.png

將其轉換為時序圖:

image.png

vertex 定義為:Each Vertex corresponds to one network pin.

  • 包括了 internal pin (圖中未畫出),

edge 定義為:There is one Edge between each pair of pins that has a timing path between them.

每條 edge 有自己的 timing role: 代表這條 edge 可能是 cell delay or wire delay, 亦或是各種類型的 timing analysis。

image.png|275

此外,一條 edge 上存儲了一組 timing arc: A timing arc set is a group of related timing arcs between from/to a pair of cell ports.  Wire timing arcs are a special set owned by the TimingArcSet class。

時序分析方式#

以分析的方式區分,可分為 Path-BasedBlock-Based 兩種,他們的主要區別在於對特定邏輯單元的 Transition Time(電平轉換時間)的處理不同

實際上,在電路工作過程中,一個邏輯單元收到的輸入電平變換時間是由前級邏輯單元所影響的

image.png|500

C pin 的 input transition 取決於上一级邏輯單元的 output transition, 而經不同輸入引腳變換而引起的 output transition 不同,從而影響 C 的 input transition。如何確定這個 C 處的電平轉換時間是時序分析算法的差異。

Graph Base#

基於圖的靜態時序分析(GBA)是大多數工具默認的分析模式,它在從標準邏輯單元庫(Standard Cell Library)中讀取單元延遲時基於最差情況的電平轉換時間進行計算。例如在上面的例子中,不管 A\B 如何跳變,都会取對 C 處電平延遲最大的電平轉換時間,例如 12ps。因此即使某個時序路徑下,A 的信號一直不變的,變化都只發生在 B 引腳,後面的藍色或非門理應用 B 引腳引起的 9ps 電平轉換時間,在 GBA 的分析算法中,仍將使用 12ps。因此,GBA 模式往往比較悲觀,可能導致某些路徑上的時序違例,因為實際跳變很可能不會導致每個邏輯單元都恰好引腳跳變引起最差電平轉換時間。為了解決這種悲觀性並提高準確性,引入了基於路徑的靜態時序分析(Path-based Analysis, PBA)。

Path Based#

PT 采用 path based 時序分析方法,將分析所有 timing path。

與 GBA 相比,PBA 則會遍歷所有可能的時序路徑,(理論上)枚舉所有可能的輸入跳變組合來進行時序評估,因此可以獲得最準確的時序分析結果。在上圖的示例中,如果針對在 B 引腳的跳變,則 PBA 會實實在在地用 B 引腳的 9ps 跳變來計算下級藍色或非門的延遲。但因為相比於 GBA,遍歷了更多的情況,導致算法的運行時間極其慢,在複雜用例中,可能 PBA 會比 GBA 慢上一個數量級。

GBA Vs PBA#

對於同一個 combinational design, GBA vs PBA 如下所示:

  • min_delay_in_GBA <= min_delay_in_PBA
  • max_delay_in_GBA >= max_delay_in_PBA

image.png

image.png

在 GBA (Graph Base Analysis) 中,取代選擇 2 組合的 AND 門 (1) 延遲,即 (Combination_1: 0.5ns, 1.5ns ; Combination_2: 0.2ns, 1.2ns) 我們選擇極端邊界,即min delay = 0.2ns and max delay = 1.5ns.

在 PBA (Path base Analysis) 中,我們使用輸入引腳和輸出組合之間的實際延遲(意味著選擇兩組延遲的組合)。

  • Combination_1: 0.5ns, 1.5ns
  • Combination_2: 0.2ns, 1.2ns

你可能會認為這不是準確的(意味著為什麼在 GBA 我們錯過了 2 值),我們在計算中添加了不必要的延遲。很高興地告訴你,你是對的。 :) 我們這樣做的原因是從工具的角度來看 - 根據GBA 進行分析或計算非常快,相比於 PBA工具的運行時間非常低。而唯一的區別是我們在計算中添加了悲觀性

  • GBA 是更快的比 PBA
  • GBA 是更悲觀的比 PBA

基於上述特性,GBA 和 PBA 在靜態時序分析中具有不同的用途。GBA 可以實現快速但粗糙的分析,如果未檢測到任何違規,那麼因為 GBA 這麼悲觀都沒有違例,PBA 分析的結果則理應沒有違規。如果 GBA 存在違規,我們則可以使用 PBA,但無需再分析所有的時序路徑,只需要分析 GBA 模式下產生違規的路徑即可(當然也可以全局進行 PBA)。

GBA 延遲計算#

每個 cell arc 不管 rise fall or min max, 都取極端值,這使得計算更加簡單快速,但因更加悲觀而不夠準確。

image.png

PBA 延遲計算#

PBA 會穷盡一條 timing path 上的所有 arc combination。

image.png

基於圖的靜態時序分析原理#

假設所有鎖存器都是統一時間收到時鐘上升沿(即忽略因佈局引起的 Clock Skew)。在這一系列的簡化下,STA 問題可以退化為:求有向圖中,所有時序終點離最遠的時序起點有多遠(理論上講是指 Arrival Time,信號從源頭到某個節點的延遲),即最長路徑問題(參考:有向無環圖中單源最長路徑如何求?,這裡解決多源多匯最長路徑),如下圖所示。算法的簡單描述就是從所有起點開始,遍歷所有節點,更新節點距離起點的最遠距離:

ArrivalTime[i]=maxArrivalTime[Predessor[i,j]]+CellDelay[j]+NetDelay[i,j]ArrivalTime[i] = max{ArrivalTime[Predessor[i, j]]+CellDelay[j]+NetDelay[i,j]}

其中 i 為當前節點編號,$Predecessor [i, j]$ 是指 i 節點的第 j 個前序節點的編號,$ArrivalTime [Predecessor [i, j]]$ 為源頭信號抵達該前序節點的時間,$CellDelay [j]$ 為前序節點的邏輯時延,$NetDelay [i,j]$ 為經過該前序節點到節點 i 的走線延遲,可以根據該兩個節點的坐標位置獲取的。

image.png|550

網表分級#

由於佈局一動就需要重新評估時序情況,所以在佈局算法運行期間,針對多源多匯的最長路徑算法會被頻繁調用。由上面的遞推公式可以知道,計算節點 i 的 $ArrivalTime [i]$ 之前,我們需要先已經獲得它的前序節點的 ArrivalTime,否則這些 ArrivalTime 的計算不能確保是最長的。而電路劃分是為了進行並行化運算,即我們需要把電路中節點染色分塊,每一塊子圖中的節點互不依賴(即互相之間沒有連邊,圖不一定是聯通的),對於每一塊子圖中的節點,我們可以並行計算

為了實現滿足這種特性的電路劃分,基本的算法原理:在隊列中存儲所有的時序起點,並且將它標記為 level=0。隨後開始 BFS,更新有向圖中,每個節點離時序起點的最遠距離,隨後有向圖會被標記:

image.png|675

基於分層同步 BFS 的時序傳遞#

正向 BFS 計算到達時間#

可以留意到分層後 level=i 中的所有節點:(1)除了 level=0 的特例(level=0 的起點單元會被強制標記為 ArrivalTime=0,不進行計算),它們之間沒有相互連邊,即它們的時序計算之間沒有依賴;(2)如果我們按照從 level=0~i 的順序計算 ArrivalTime,當遍歷直至 level=i 時,level=0~i-1 的節點都已經完成 ArrivalTime 的計算。即 level=i 的所有節點能同時進行它們的 Arrival time 計算,這時候我們就可以調用 openmp 等並行化框架進行加速。我們初始化所有的節點的 Arrival time 為 0,然後跑上面提及的最長路徑算法,即可推出下圖中的時延信息:(右圖中第三級最左邊的節點 arrival time 應該為 10)。

image.png

反向 BFS 計算 RAT#

如上一節中的前向時延分析之後,我們就知道每一個終點離起點有多遠了。但是可能設計者對於每個終點有不同的約束,它們可能希望其中某些信號早些抵達特定的時序終點,因此這時候會有時序裕量(Timing Slack)的概念:

TimingSlack=RequiredArrivalTime(用戶指定的)ArrivalTime(實際抵達時間)Timing Slack = Required Arrival Time (用戶指定的) - Arrival Time(實際抵達時間)

如果 Timing Slack 小於 0,則說明信號來遲了,存在時序違例。其中 Arrival Time 是在前向時序傳遞完成了計算。通常對於時序終點,Required Arrival Time(RAT)為時鐘周期減去建立時間(Clock Period - Setup Time)。但是對於中間每一個時序節點,設計者通常是不會設置 RAT 的。因此在 STA 中,我們需要做反向的時序傳遞,從而讓除了終點外的每一個節點,都知道自己實際上被要求多早獲得信號,就很像我們上班時候的項目管理,每個任務節點都需要自己要在什麼時間前完成才不给後續大伙挖坑。

而反向時序傳遞的基本方法與正向傳遞基本一致,只是之前正向公式為:

ArrivalTime[i]=maxArrivalTime[Predecessor[i,j]]+CellDelay[j]+NetDelay[i,j]ArrivalTime[i] = max{ArrivalTime[Predecessor[i, j]]+CellDelay[j]+NetDelay[i,j]}

而反向為:

RequiredArrivalTime[i]=minRequiredArrivalTime[Successor[i,j]]NetDelay[i,j]CellDelay[i]RequiredArrivalTime[i] = min{RequiredArrivalTime[Successor[i, j]] - NetDelay[i,j]} - CellDelay[i]

其中 $RequiredArrivalTime [i]$ 為節點 i 的 RAT,而 $RequiredArrivalTime [Successor [i, j]]$ 是指節點 i 的第 j 個後序節點的 RAT,$NetDelay [i,j]$ 為兩個節點之間的走線延遲,而 $CellDelay [i]$ 是指節點 i 的邏輯時延。

根據上面公式的變換,我們也需要反向重新進行網表分層,如下圖:

image.png

我們初始化所有的節點的 RAT 為無窮大,而終點節點的 RAT 則為設計者指定,然後跑我們上面提及的最長路算法,即可推出下圖中的 RAT 信息,其中我們假設所有終點 RAT 為 20

image.png

增量式時序分析#

如果在佈局時進行局部調整,則沒必要進行全局 STA, 因為全局分析緩慢低效,而很多節點的時序可能是沒變的。這時候我們的正向、反向的分層都不需要動,我只需根據出現變化的節點,將他們的所有前序節點和後續節點重新放到上面的 BFS 流程中,就可以實現快速增量式時序分析。

image.png

當紅色節點被移動時,只有藍色和橙色覆蓋的節點需要重新進行 STA。

時序分析#

時序分析主要關注建立和保持違例,分別對應最差和最優情況。此外,還需掌握以下命令的使用:

  • set_input_delay
  • set_output_delay
  • set_drive, set_driving_cell and set_input_transition
  • set_load

建立#

輸入的數據必須在有效時鐘沿之前保持穩定的最短時間稱為建立時間 (setup time)。注意:這是根據最晚的 (the latest) 數據信號超過其閾值 (通常為 Vdd 的 50%) 到有效時鐘沿超過其閾值 (通常為 Vdd 的 50%) 的時間間隔測量的。

image.png

在時鐘的有效沿到達觸發器之前,數據應在一定時間內保持穩定,即觸發器的建立時間,該要求將確保數據可靠地被捕獲到觸發器中

  • 注意,建立時間檢查允許 launch 和 capture 归属不同时钟域。

建立案例 1#

以下圖為例,時鐘 CLKM 週期為 $T_{cycle}$

  • 對於 launch path: 時鐘 CLKM 到達觸發器 UFF0 時鐘引腳的時間 $T_{launch}$ + 觸發器 UFF0 自身的 propagation delay ($T_{ck2q}$) + Data path delay ($T_{dp}$)
  • 對於 capture path: 時鐘 CLKM 到達觸發器 UFF1 時鐘引腳的時間 $T_{capture}$ + 時鐘週期 $T_{cycle}$

image.png|500

由於在 capture 建立時間約束要求數據信號相對於時鐘信號需要至少提前一個建立時間保持穩定,所以需要滿足公式:

Tlaunch+Tck2q+Tdp<Tcycle+TcaptureTsetupT_{launch} + T_{ck2q} + T_{dp} < T_{cycle} + T_{capture} - T_{setup}

到達和要求在建立中#

image.png

已知 setup check 需滿足:(上圖為具體的 case,下式為 generic 公式)

Tlaunch+Tck2q+Tdp<Tcycle+TcaptureTsetupT_{launch} + T_{ck2q} + T_{dp} < T_{cycle} + T_{capture} - T_{setup}

則 require 和 arrival time 定義如下:

  • require time: capture path delay
  • arrival time: launch path delay

由於 slack 需要 >= 0, 則有如下公式:

Tcycle+TcaptureTlaunch(Tck2q+Tdp)Tsetup>=0 T_{cycle} + T_{capture} - T_{launch} - (T_{ck2q} + T_{dp}) - T_{setup} >= 0

R2R 建立檢查#

解析下述時序報告:

  • start point & end point 都是觸發器,且由時鐘 CLKM 上升沿觸發
  • path group: 由 capture ff 決定
  • path type: max, i.e. setup time check
  • clock network delay is zero as it's ideal clock network
    • i.e. $T_{launch}$ and $T_{capture}$ is zero
  • clock uncertainty
    • jitter
    • setup time

image.png

時鐘網絡延遲#

時序報告中的時鐘網絡延遲 (clock network delay) 是什麼?為什麼將其標記為理想 (ideal)?時序報告中的這一行表明時鐘樹被認為是理想的,時鐘路徑中的任何緩衝器 (buffer) 都假定為零延遲。一旦構建了時鐘樹,就可以將時鐘網絡標記為 “已傳播”(propagated),從而使得時鐘路徑顯示實際延遲值。

  • 時鐘網絡延遲用於在建立時鐘樹之前 (即在時鐘樹綜合之前) 對通過時鐘路徑的延遲進行建模。一旦建立了時鐘樹並標記為 “已傳播”(propagated),便會忽略此時鐘網絡延遲約束。set_clock_latency 命令也可用於對從主時鐘到其衍生時鐘的延遲進行建模。

image.png

此外,如果是顯示的時鐘樹,即插入了 clock buffer:

image.png|475

第一個 cell 的 delay 需要知道自己的 input transition,所以需要通過 set_drive, set_driving_cell or set_input_transition 來顯式指定,否則認為其 input transition 為 0。

此外,clock source latency, i.e. insertion delay 的定義為:時鐘源端到 DUA 時鐘定義點的延遲。通過命令 set_clock_latency -source

  • this command will set clock network delay if w/o source option.

image.png

I2R 建立檢查#

  • 設置相對於虛擬時鐘或實際時鐘的外部輸入延遲:set_input_delay

從輸入端口到寄存器的時序路徑可由虛擬時鐘或實際時鐘觸發,如下:

該時鐘可以被認為是驅動設計輸入端口 INA 的虛擬觸發器,該虛擬觸發器的時鐘為 VIRTUAL_CLKM。此外,從該虛擬觸發器的時鐘引腳到輸入端口 INA 的最大延遲指定為 2.55ns,在報告中顯示為 input external delay。

image.png

輸入延遲也可以相對於實際時鐘來指定, 並不一定必須相對於虛擬時鐘來指定。實際時鐘可以是設計中的內部引腳或者輸入端口上的時鐘。

image.png

R2O 建立檢查#

  • set_output_delay
  • set_load

與上述輸入端口約束類似,可以相對於虛擬時鐘或設計中的內部時鐘來約束輸出端口,或者可以相對於實際的輸入時鐘端口或輸出時鐘端口來約束輸出端口。

為了確定最後一個單元連接到輸出端口的延遲,需要指定該端口上的負載,上面使用了 set_load 命令來指定輸出負載。請注意,端口 ROUT 可能在 DUA 內部具有負載,而 set_load 約束指定的是額外的負載,即來自 DUA 外部的負載。

image.png

注意在 R2O 路徑中,其 endpoint 的建立檢查計算為 $T_{period} - T_{output}$。

I2O 建立檢查#

設計也可以具有從輸入端口到輸出端口的純組合邏輯路徑。

image.png

保持#

保持時間 (hold time) 是在 ** 時

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。