Clock Tree Synthesis(CTS)


言歸正傳,在P&R整個流程中,有兩個對於design的PPA(Power Performance Area)起決定性的步驟:Floorplan和CTS。雖然如此,在實際項目中,很多人可能工作數年也沒有機會做一次比較全面的CTS。一方面原因在於,P&R工具尤其是次世代的ICC2和Innovus對於相對簡單的clock tree都能夠很好的處理;另一方面的原因是,對於大多數無法接觸top的工程師來說,block內部的clock結構大概率是比較簡單的。因此就導致一些同學在做過幾個項目后面對復雜的clock仍然無從下手。

針對這個現象,我希望根據自己的經驗把CTS的基本思路的做法介紹給大家。如果大家以后遇到復雜的clock時發現這里的內容對實際工作多有裨益,本人也將不勝榮幸。

Clock Tree Synthesis,顧名思義,就是對design的時鍾樹進行綜合。主要的目的是讓每個clock都能夠在盡量短的時間內傳達到它們驅動的所有DFF(寄存器)。對於CTS,我們有三個指標希望能夠盡量做到更好:

每個clock到達其所驅動的sink(DFF)的latency都盡量短;

每個clock之內,以及有時序關系的clock之間的skew盡量小;

每個clock的common path盡量長。

對於大多數P&R工具,CTS的flow可以總結為以下形式:

 

 

CTS策略

這是CTS的第一步,雖然在流程中只是簡單的幾個字,但是針對復雜的clock,這里可能需要花費大量的時間分析clock的結構,找出潛在可能出現的問題和瓶頸,並針對我們上述提出的三個指標,決定如何去綜合時鍾樹。這一步如此重要卻又非常容易被忽略,以至於有些同學在遇到復雜的clock出現問題時無從分析,遑論如何改進。下面我將通過一個例子來說明,CTS策略到底是什么。

 

 

其中function clock從兩個PLL和兩個IO(FCLK1, FCLK2)進來,test clock從兩個IO(TCLK1, TCLK2)進來。從圖中可以看出,在分頻電路之后,進入A和D的clock不與其他模塊共享。

與此同時,我們假設芯片的floorplan可以表示為如下形式(注意clock source和模塊位置與clock結構的對應關系):

 

 

如果模塊之間的時序關系可以簡述為如下形式:

Block B <-> Macro1

Block C <-> Macro2

Macro1 <-> Macro2

Block A/D為獨立模塊

考慮到上述時鍾結構,floorplan和時序關系,我們該如何決定CTS策略呢?

在考慮策略之前,我們先回憶一下CTS的三個目標:latency盡量短;skew盡量小;common path盡量長。

先從最簡單的開始:鑒於Block A和D為獨立模塊,它們不與其他模塊產生時序關系,同時從clock結構圖可以看到進入A和D的clock在選擇器之后沒有與其他模塊有交集,因此,我們只需要把A和D的clock盡量做短即可。

我們也可以把一切交給EDA工具,但是這樣的做的結果不能保證得到我們想要的結果。最好的辦法是把進入到A、D兩個Block的clock選擇器以及其他clock分頻邏輯固定在這兩個block附近(下圖中紫色區域),這樣不僅能夠使clock line盡量以最短的距離到達Block,同時也能夠盡可能地增加common path的長度。

接下來考慮Block B/C和Macro/Macro2。鑒於他們之間的時序關系,我們希望它們之間的skew盡量短,同時common path要盡量長。在floorplan上我們可以看到它們被擺放成對稱 的形式,因此,最簡單直接的辦法就是將所有與這幾個block相關的邏輯都固定在兩個Macro上方的正中間(假設其clock port在黃色標識的部分),如下圖紅色方框所示:

 

 

到目前位置我們確定了需要preplace的邏輯以及其放置區域,接下來我們需要考慮如何實現我們的設想。其中首要的任務就是定義CTS的sdc。

對於CTS工具來說,要進行時鍾樹綜合,有一個必備的前提條件就是clock的定義,而后端設計者是可以根據自己的策略自己調整clock的定義的。讓我們再回憶以下clock的結構圖:

 

 

1.直接從所有的clock源頭定義,此方法基本可以從func/test的sdc中直接復制clock的定義:

create_clock -period 833.33 -name PLL1_CLK [get_pins PLL1/CLK] ;# 1.2GHz

create_clock -period 833.33 -name PLL2_CLK [get_pins PLL2/CLK] ;# 1.2GHz

create_clock -period 2000.00 -name FCLK1 [get_ports FCLK1]  ;# 500MHz

create_clock -period 2000.00 -name FCLK2 [get_ports FCLK2]  ;# 500MHz

create_clock -period 20000.00 -name TCLK1 [get_ports TCLK1]  ;# 50MHz

create_clock -period 20000.00 -name TCLK2 [get_ports TCLK2]  ;# 50MHz

 

第2段:clock sources ->各個選擇器
create_clock -period 833.33 -name PLL1_CLK [get_pins PLL1/CLK] ;# 1.2GHz

create_clock -period 833.33 -name PLL2_CLK [get_pins PLL2/CLK] ;# 1.2GHz

create_clock -period 2000 -name FCLK1 [get_ports FCLK1]  ;# 500MHz

create_clock -period 2000 -name FCLK2 [get_ports FCLK2]  ;# 500MHz

create_clock -period 20000.00 -name TCLK1 [get_ports TCLK1]  ;# 50MHz

create_clock -period 20000.00 -name TCLK2 [get_ports TCLK2]  ;# 50MHz

至於如何使工具在選擇器停止,我們將在接下來的文章中繼續討論。同時我們將會把上述思路和策略通過真實的腳本和命令反映出來,希望大家繼續關注。

另外,在本文中涉及的design通過上述幾幅圖可以了解到相對詳細的時鍾結構,但是在實際設計中我們如何事先得知clock的結構和時序關系呢?一般來說對於流程完善的大公司,繪制詳盡的時鍾結構是前端設計者的工作之一。但是在實際項目中,面對的大部分design的clock結構圖可能是十分簡單甚至完全沒有的情況,這時就需要后端工程師多一些耐心去分析design,並積極與前端和constraint設計者溝通,從而實現對design的時鍾結構快速把握。

至此,CTS的策略基本構建完成。在接下來的文章中,我們將繼續詳細討論這些策略的實現方法以及如何查看和debug clock的結果。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM