時序收斂

時序收斂（Timing closure）是現場可編程邏輯門陣列、特殊應用積體電路等集成電路設計過程中，調整、修改設計等迭代性的設計流程，確保在時鐘驅動的同步電路中所有電磁信號滿足邏輯閘的時序要求（與系統時鐘相關的時序約束、時鐘頻率等），保證目標時鐘頻率下正確的數據傳輸和可靠運行。為了完成上述過程，工程師常常需要在電子設計自動化工具輔助下工作。「時序收斂」一詞有時也用於表達這些要求最終被滿足的狀態。

同步電路由兩類原語元件構成：無記憶地處理邏輯函數的組合邏輯門（如非門、與門、或門、與非門、或非門、異或門等），以及能存儲數據並由時鐘信號觸發的時序邏輯電路元件（如觸發器、鎖存器、寄存器）。通過時序收斂，可以通過改進布局和重構網表等手段來調整電路，以減少路徑延遲並確保邏輯門的信號在所需的時鐘時序之前完成有效作用。

隨著集成電路設計變得日益複雜，包含數十億個電晶體和高度互聯的邏輯，確保所有關鍵時序路徑滿足約束的任務也變得愈發困難。未能滿足這些時序要求可能導致功能性故障、不可預測的後果或系統級失效。

因此，時序收斂並不是一個簡單的最終驗證步驟，而是一項全面的迭代優化流程，包括持續改進設計的邏輯結構和物理實現，例如調整門級邏輯結構、精煉放置與互連，以便在整片晶片範圍內可靠地滿足所有時序約束。

## 概述

簡單情況下，設計師可以手工計算元件之間的路徑延遲。但當設計包含十幾個或更多元件時，這種做法就不切實際了。例如，從一個D觸發器的輸出經由組合邏輯門到下一個D觸發器輸入的路徑延遲，必須滿足（小於）同步到兩級觸發器的時鐘脈衝之間的時間間隔。當這些元件間的延遲大於時鐘周期時，電路將無法正常工作。因此，修改電路以消除時序失敗（並消除關鍵路徑）是邏輯設計工程師的重要工作之一。關鍵路徑是指設計中兩個時序元件之間延遲最長的路徑（以延遲計）；它也定義了所有寄存器到寄存器路徑中的最大延遲，且該最大延遲不得大於時鐘周期時間。

## 時序約束

在IC設計過程中，IC布局應滿足幾何約束和時序約束。幾何約束指物理設計中由封裝/製造工藝強加的規則，例如單元對齊的正確性和最小布線間距。時序約束指所有信號路徑應滿足的時序要求。通常，在觸發器輸出信號於時鐘沿發生改變之前，該信號在元件內還應保持穩定一段時間，這稱為建立時間（setup time）。在電磁信號到達下一級觸發器並在時鐘沿被採樣之後，信號在存儲元件中還應保持穩定一段時間，這稱為保持時間（hold time）。時序約束分為兩類：

建立時間約束（長路徑約束）：

這類約束規定在觸發器時鐘沿之前數據輸入信號應保持穩定的時間長度，以便數據有足夠時間通過一條邏輯路徑傳播並在下一個時鐘沿之前到達下一級觸發器。如果路徑延遲過長，可能違反建立時間約束，導致錯誤數據被鎖存。

保持時間約束（短路徑約束）：

這類約束規定在觸發器時鐘沿之後數據輸入信號應保持穩定的時間長度。違反保持時間約束可能導致亞穩態或其他不期望的行為。

保持時間約束公式：$t_{logic}>t_h-t_{c{-}q}$

建立時間約束公式：$t_{logic}<t_{CLK}-t_{c{-}q}-t_{su}$

其中：

- $t_{logic}$：組合邏輯延遲
- $t_{CLK}$：時鐘周期
- $t_{su}$：建立時間（setup time）
- $t_h$：保持時間（hold time）
- $t_{c{-}q}$：觸發器的clock-to-Q延遲

## 時序收斂的迭代過程

時序收斂是確保所有信號在所需時間內到達目標，從而使電路可靠工作的關鍵步驟。設計者從寄存器傳輸級（RTL）抽象以及描述電路的Verilog或VHDL代碼開始。該描述被綜合為網表（netlist），網表是邏輯門和連線的集合，並用於配置FPGA硬體。

由於FPGA的邏輯和布線具有靈活性，信號延遲可能會變化。如果信號到達得太晚，設計可能無法滿足時序。設計者首先在SDC（Synopsys設計約束）格式中定義準確且現實的時序約束，以反映系統的性能目標。這些約束可能包括時鐘周期、輸入/輸出延遲、多周期路徑以及建立/保持要求。基於設計內部的邏輯結構和路徑延遲，必須認真分析這些約束是否可實現。這些約束將指導下游的全部時序分析與優化流程。

## 時序收斂與靜態時序分析中的問題

在時鐘驅動的同步電路中，主要考慮三類延遲：

門延遲（Gate delays）：指輸入端發生變化後傳播到輸出端所需的時間。通常計算為輸入發生變化與輸出隨之變化之間的時間間隔。

線延遲（Wire delays）：也稱為互連延遲，指數據信號在同步電路中通過金屬互連線從一個電路元件傳輸到另一個電路元件所需的時間。延遲主要由導線的電阻和電容引起。

時鐘偏移（Clock skew）：指來自同一時鐘源的時鐘信號，在同步電路不同部分的到達時間差異。當時鐘信號從其源（如振盪器或時鐘發生器）經由電路中多條不同路徑傳播時，會經歷不同的傳播延遲，從而產生時鐘偏移。在下圖中，晶片上點$i$和$j$的時鐘偏移定義為：$\delta( i,j)=t_i-t_{j}$，其中位置$i$和$j$可以不同。圖示說明了時鐘偏移的概念，即不同觸發器上時鐘信號到達時間的差異。理想情況下，所有時鐘信號應同時到達目的地；然而由於布線路徑、負載和物理布局的差異，這幾乎不可能完全實現。

在邏輯綜合和約束分析之後，設計會經歷靜態時序分析（STA），這是驗證電路是否滿足其定義的時序約束的基本、迭代過程（在FPGA中亦然）。在STA中，通常假設時鐘偏移可以忽略，並在後續時鐘樹綜合階段再處理。靜態時序分析工具（如Cadence Tempus、Synopsys PrimeTime、Intel Timing Analyzer等）能夠在無需仿真的情況下評估設計中的所有時序路徑，因此非常適合進行可擴展且全面的分析。在靜態時序分析中，組合電路可表示為有向無環圖（DAG），其中每個節點的權重對應於導線（或邏輯門）的延遲。

在此過程中，靜態時序分析引擎會計算：

- 路徑延遲（Path delays）：從一個寄存器經過組合邏輯到另一個寄存器的總延遲。
- 餘量（Slack）：所需到達時間與實際到達時間之間的差值。
- 關鍵路徑（Critical paths）：餘量最小（或為零）的最長路徑。
- 違例（Violations）：餘量為負的路徑，表示時序不滿足。

特別對於餘量（Slack），靜態時序分析會假設最壞情景，即每個邏輯門都發生轉換。此時可以為每個節點計算餘量：

$$\mathrm{Slack} = \mathrm{RAT} - \mathrm{AAT}$$

其中：

- RAT = 所需到達時間（required arrival time）
- AAT = 實際到達時間（actual arrival time）

RAT指信號在時序要求下最遲可以發生轉換的時間；AAT指信號實際發生轉換的最遲時間（在每個節點的輸出端定義）。若某一輸出的餘量為負，則表示電路未能滿足時序；若所有輸出的餘量為正，則表示電路滿足時序。

## 物理設計

一旦生成靜態時序分析報告，工程師就可以利用時序優化技術或設計自動化工具來檢查報告，以識別需要關注的關鍵或違例路徑。同時他們也會通過調整放置與布線來優化物理布局。這個循環會反覆進行，直到所有時序約束都得到滿足。

通過邏輯綜合和初步時序優化，晶片的物理布局應被映射出來。通過放置（placement）、時鐘樹綜合（clock tree synthesis）和布線（routing）等關鍵步驟，物理設計會被修改，從而使時序行為發生顯著變化，從而減少路徑延遲並提升電路時序性能。

### 放置（Placement）

EDA工具為每個標準單元（邏輯門、觸發器等）和金屬連線在矽片上分配物理位置。將相互連通的單元放得更靠近可以減少路徑延遲。

### 時鐘樹綜合（CTS）

要構建一個平衡的時鐘分配網路，將時鐘信號均勻且同步地傳遞到所有時序元件（觸發器）。CTS 可以最小化時鐘偏斜（即時鐘信號在不同點的到達時間差），並可以精確控制時鐘延遲（提高時鐘信號傳遞到所有時序元件的及時性），同時要滿足最大轉換與最大電容等約束，以確保時鐘網路符合設計限制。時鐘偏斜通常會影響保持時間和建立時間，並且時鐘偏斜通常由局部時鐘偏斜和全局時鐘偏斜組成。

常見的三種CTS類型包括：

#### 單點時鐘樹（Single-point CTS）

單點時鐘樹由單一時鐘源出發，以樹狀結構將時鐘信號分發到所有時序元件。該方法易於實現，適用於低頻或多時鐘的設計。但對於高頻或大規模設計不太適合，因為路徑不對稱會導致較大的時鐘偏移。

#### 時鐘網格（Clock mesh）

時鐘網格通過類似網格的結構分發時鐘信號，可提供更好的時鐘平衡和更小的偏斜，適合高頻設計。然而，構建時鐘網格會帶來更高的功耗和面積開銷，並增加設計複雜度。

#### 多源時鐘樹（Multi-source CTS）

多源時鐘樹結合了單點時鐘樹和時鐘網格的優點。將設計劃分為多個子模塊，每個子模塊擁有自己的局部時鐘源。該結構在降低偏斜的同時減少功耗與面積消耗，因而非常適合大規模設計。

### 布線（Routing）

放置完成後，設計自動化工具會生成連線，將單元在物理上連接起來。實際布線會引入真實的寄生電阻—電容（RC）效應，這些寄生會影響信號延遲。此外，最終布線給出了導線長度與擁塞資訊，從而使時序分析更加精確。

## 時序優化技術

一種常見的提升電路性能的方法是採用時序優化技術，例如在關鍵路徑的組合邏輯之間插入寄存器（流水化）。這可能提高最大工作頻率，但會增加電路的總體延遲（即從輸入到輸出路徑上寄存器的最大數量）。

實際的時序優化技術通常包括物理綜合（physical synthesis），通過一系列時序優化來消除負餘量（negative slack）。物理綜合包括制定時序預算（timing budgets）並實施時序修正（timing corrections）。通常，時序預算包含在放置、布線階段以及時序修正操作中沿路徑或網線分配目標延遲。時序修正包括以下幾類方法：

### 門尺寸調整（Gate sizing）

門尺寸調整是用不同驅動能力的等效邏輯門替換現有邏輯門。較大的門可以更快地驅動較大的負載，從而降低關鍵路徑的延遲。此技術是在速度與占用面積/功耗之間進行權衡。

舉例：有三種尺寸的邏輯門，滿足$Size(Vc) > Size(Vb) > Size(Va)$。尺寸越大的門，其輸出電阻越小，因此有$R_{out}(V_c) < R_{out}(V_b) < R_{out}(V_a)$。根據RC延遲公式$t = R_{out} \times C_{load}$，其中$t$表示傳播延遲，$R_{out}$表示輸出阻抗，$C_{load}$表示負載電容。

因此當負載電容較大時，較大的邏輯門更容易驅動較大的負載：$t(V_c) < t(V_b) < t(V_a)$

而當負載電容較小時，較小的邏輯門驅動較小負載時可能更高效：$t(V_c) > t(V_b) > t(V_a)$。

### 緩衝器插入（Buffer insertion）

用於分斷長線並減少RC電路（電阻-電容）延遲，尤其適用於高扇出或物理距離較遠的連接。緩衝器也可以用於調整路徑時序以修正保持時間違例。圖中所示的緩衝器通常由兩個串聯的反相器組成；在電路圖中，三角形通常表示邏輯門，三角形後面的圓圈表示邏輯反相。

改進方向包括：

- 提速或作為延遲元件：緩衝器能通過更好地驅動長線與大負載電容來降低路徑延遲。在關鍵路徑中插入緩衝器可以減小等效電阻，從而改善信號傳播性能。另一方面，緩衝器也可以有意放置以引入固定延遲，用於時序對齊。
- 改善轉換陡峭度（改變上/下沿時間）：上/下沿緩慢的信號會引起不穩定開關和時序違例。緩衝器可以「銳化」信號邊緣，改善躍變斜率，從而使數字行為更穩定，減少毛刺、直通電流和誤觸發。
- 屏蔽電容性負載（緩解大負載）：若某邏輯門驅動大量下游門或長導線，總負載電容會很大，導致該門輸出響應變慢。在該門與其重負載之間插入緩衝器，可以將負擔轉移到緩衝器上，使原門僅需驅動緩衝器，而不必直接驅動全部負載。但可能以增大使用面積，提高功耗為代價。

### 網表重構（Netlist restructuring）

網表重構是指在不改變邏輯功能的前提下修改已有門級電路結構的過程，旨在通過重組或轉換現有門的連接或表示來優化時序、面積或功耗。常見變換包括：

- 克隆（Cloning）：複製門以減少負載電容或在多條路徑間平衡負載。
- 重構輸入/輸出樹（Redesigning the I/O tree）：改變信號分配或接收方式以改善時序或減輕擁塞。
- 交換可交換埠（Swapping commutative pins）：對可交換輸入（如AND、OR）的輸入重新排序，以優化關鍵路徑並改變連接關係。
- 門分解（Gate decomposition）：將複雜門拆解為更簡單的門，例如用NAND-NAND代替 AND-OR，並利用CMOS反相器簡化實現以縮短路徑延遲。
- 布爾重構（Boolean restructuring）：應用布爾代數規則簡化或重表達邏輯式，常能最小化路徑延遲或得到更小的實現。

### 逆向變換

若對總體設計指標（例如面積或功耗）有利，也可以執行逆向操作，例如門尺寸縮小（downsizing）、合併或簡化先前擴展的邏輯結構。

這些技術通常由物理綜合和放置與布線工具（如 Synopsys IC Compiler、Cadence Innovus、Intel Quartus等）自動應用，但設計者也可以通過約束和優化指令手動引導這些優化。

## 設計流程

### 在迭代驗證與確認中使用靜態時序分析

在布線步驟完成後，設計的物理細節（包括導線長度、電容和電阻）將被檢查並確定。需要對設計進行全面的功能驗證與確認，例如使用靜態時序分析（STA），以保證時序優化後的功能完整性，幫助識別時序違例和延遲，並驗證最近一次時序收斂和優化的有效性。設計者還可以使用仿真、形式驗證和硬體測試來驗證設計的功能與性能。如果電路未能滿足時序要求，則需要將整個電路從頭重新送入STA流程，進行迭代改進與驗證。

### 後時序分析（Post-implementation timing analysis）：

當設計在FPGA上實現完成後，需進行實現後時序分析以驗證所有時序目標是否已滿足。該分析作為時序收斂的最終檢查，確認時序收斂過程是否成功，並考慮任何與實現相關的特定因素。

## 工具與技術使用建議

許多時候，邏輯電路的改動（例如時序優化手段）由使用者的電子設計自動化（EDA）工具在設計者準備的時序約束指令引導下自動完成。術語「時序收斂」也常用於表示已實現的目標：當設計流程走到盡頭且其時序要求得到滿足時，稱該設計已達成時序收斂。

在現有技術條件下，所有設計步驟都需要具備「時序感知」（timing-aware），才能使設計正確滿足時序要求；而在微米級工藝時代，只有邏輯綜合類的 EDA 工具有這種先決條件。

儘管從邏輯綜合沿用的一些成熟原則已將「時序感知」擴展到整個流程，時序收斂過程的邏輯階段與物理階段仍由不同的設計團隊和不同的 EDA 工具分別處理。舉例來說，Synopsys的Design Compiler、Cadence的Encounter RTL Compiler、Magma的BlastCreate是邏輯綜合工具的例子；而Synopsys的IC Compiler、Cadence的SoC Encounter、Magma的Blast Fusion則是能執行時序感知放置、時鐘樹綜合與布線、用於物理時序收斂的工具示例。

當使用者要求電路滿足極其苛刻的時序約束時，可能需要利用機器學習程序（例如Plunify的InTime）來搜索一組最優的FPGA綜合、映射、放置與布線工具配置參數，從而確保電路能閉合時序。要讓EDA工具處理一個時序要求，必須將該要求翻譯為工具能識別的靜態時序約束。

近年來，時序收斂流程逐步將邏輯綜合與物理實現整合到統一平台以便更好地進行優化。比如Synopsys Fusion Compiler、Cadence的Genus-Innovus流程提供端到端的解決方案，在單一環境中結合了邏輯綜合、放置、時鐘樹綜合和布線。此外，像OpenROAD和OpenSTA這樣的開源工具鏈在學術界與創業原型開發中也日益受到重視，因為它們支持時序感知的設計閉合工作流。這些現代工具旨在通過對性能、面積與功耗（PPA）之間的折衷進行自動化處理，應對納米級電路日益增長的複雜性，並在RTL→GDSII的設計流中更早地發現與解決時序違例。

## 相關

- 設計收斂
- 電子設計自動化
- 設計流程
- 集成電路設計
- 靜態時序分析
- 非同步電路