IC基礎(四):設計中的時鍾


1、同步設計

 在同步設計中,由單個主時鍾單個主置位 / 復位信號驅動設計中所有的時序器件。

1)避免使用行波計數器

2)門控時鍾

3)雙邊沿或混合邊沿時鍾

4)用觸發器驅動另一個觸發器的異步復位端

 

2、 時鍾/時鍾樹的屬性

一般的時鍾,我們都指的是全局時鍾,全局時鍾在芯片中的體現形式是時鍾樹

時鍾樹,是個由許多緩沖單元(buffer cell)平衡搭建的時鍾網狀結構,如下圖所示:

首先不得不說,實際的時鍾除了周期/頻率、相位、沿、電平屬性外,還有其他的屬性,也就是:不是下面這樣子規規整整的:

為什么呢?那是因為時鍾有下面的屬性(“實際的buff”):

①時鍾的偏移(skew):時鍾分支信號在到達寄存器的時鍾端口過程中,都存在有線網等路徑延時,由於延時,到達寄存器時鍾端口的時鍾信號存在有相位差,也就是不能保證每一個沿都對齊,這種差異稱為時鍾偏移(clock skew),也叫時鍾偏斜。時鍾的偏移如下圖所示:

此外,時鍾skew與時鍾頻率並沒有直接關系,skew與時鍾線的長度被時鍾線驅動的時序單元的負載電容、個數有關。

 

②時鍾抖動(jitter):相對於理想時鍾沿,實際時鍾存在不隨時間積累的、時而超前、時而滯后的偏移稱為時鍾抖動,簡稱抖動,如下圖所示:

時鍾的抖動可以分為隨機抖動(Random Jitter,簡稱Rj)和固有抖動(Deterministic jitter):

  ·隨機抖動的來源為熱噪聲、Shot Noise和Flick Noise,與電子器件和半導體器件的電子和空穴特性有關,比如ECL工藝的PLL比TTL和CMOS工藝的PLL有更小的隨機抖動;

  ·固定抖動的來源為:開關電源噪聲、串擾、電磁干擾等等,與電路的設計有關,可以通過優化設計來改善,比如選擇合適的電源濾波方案、合理的PCB布局和布線

也就是說:jitter與時鍾頻率無直接關系。

 

時鍾的偏移和時鍾的抖動都影響着時鍾網絡分枝的延遲差異(相位差異),在Design  Compiler里面,我們用時鍾的不確定性(uncertainty)來表示這兩種情況的影響。

 

③時鍾的轉換時間(transition) :時鍾的上升沿跳變到下降沿或者時鍾下降沿跳變到上升沿的時間,這個時間並不是如左下圖所示那樣完全沒有跳變時鍾的,而是像右下圖那樣,時鍾沿的跳變時間就是時鍾的轉換時間(后面約束的時候會有相關的解釋)。

時鍾的轉換時間與單元的延時時間(也就是器件特性)還有電容負載有關。

 

④時鍾的延時(latency) :時鍾從時鍾源(比如說晶振)出發到達觸發器時鍾端口的延時,稱為時鍾的延時,包含時鍾源延遲(source latency)時鍾網絡的延遲(network latency),如下圖所示:

時鍾源延遲(clock source latency),也稱為插入延遲(insertion delay),是時鍾信號從其實際時鍾原點設計中時鍾定義點(時鍾的輸入引腳)的傳輸時間,上圖是3ns。

時鍾網絡的延遲( clock network latency)是時鍾信號從其定義的點(端口或引腳)到寄存器時鍾引腳的傳輸,經過緩沖器和連線產生的延遲(latency),上圖是1ns。

OK,時鍾的附加的buff屬性差不多就是這樣了。

 

3、內部時鍾

記得我剛剛學習FPGA的時候,在verilog代碼中,經常使用內部產生的時鍾,也就是用內部的一個信號充當另外一個always塊的時鍾沿敏感列表,如下圖所示:

 

 

 實際上,這種內部時鍾不建議使用,一個是因為產生內部時鍾的邏輯是有延時的,導致A_clk產生也會延時,Data與A_clk會有延時,就會有亞穩態的穩壓;另外一個就是由觸發器生成A_clk的驅動能力問題.

 

4、多路復用時鍾

在一個系統里面,很有可能會用到多個時鍾輪流驅動一些觸發器,為了適應不同的數據速率要求,進行時鍾切換。有時為了節約功耗,也會把高速時鍾切換到低速時鍾,或者進行時鍾休眠操作,多路時鍾如下圖所示:

這樣的時鍾一般情況下也會導致一些問題,比如時鍾切換時導致后面驅動的寄存器建立時間不足,當滿足一定的條件時,這種多路復用器的時鍾也是可以使用的,要滿足的要求有:

  1. 時鍾復用電路一旦上電工作之后,就不要對復用邏輯進行更改,以免更改之后產生不確定錯誤。
  2. 在測試的時候,設計電路繞過時鍾多路邏輯來選擇普通的時鍾,也就是使用普通的時鍾進行測試。
  3. 在時鍾進行切換的時候,寄存器要處於復位的狀態,以免在切換之后建立時間不夠而進入亞穩態。
  4. 在時鍾切換的時候,可能會產生一些短暫的錯誤,但是這些錯誤對整個系統沒有影響。

  對於系統要求非常嚴格的,比如時鍾切換很頻繁,有不能夠在復位的時候切換,而且也不允許有短暫的錯誤,那么時鍾就不能這樣進行切換了,就要使用其他的時鍾切換方案或者進行時鍾同步了。至於多時鍾切換的方案,以后有時間再學習補充。

5、門控時鍾

門控時鍾可是低功耗設計的寵兒,關於門控時鍾的資料也有一大堆,下面就來寫寫門控時鍾吧。

門控時鍾也就是在使能信號有效的時候,把時鍾打開;使能信號無效的時候,時鍾關閉。時鍾關閉之后,它所驅動的寄存器就不會翻轉,因此也就降低了動態功耗。

門控時鍾最開始的電路是:

這種門控時鍾bug多,我們先來看看這種電路的bug波形是怎么樣的,也就是知道問題所在,好讓我們改進:

從波形圖中可以看到,門控使能信號如果在時鍾的高電平的時候開啟或者關閉,就會導致產生的門控時鍾高電平被截斷,變成毛刺;門控使能信號對在時鍾低電平時跳變對產生的門控時鍾沒有影響。因此我們的針對點就是高電平時的翻轉。

因此我們就可以通過設置一種電路,讓門控使能信號在通過這個邏輯電路之后,僅僅在時鍾低電平的時候進行翻轉,而在時鍾高電平的時候,不能翻轉也就是保持。從而我們就想到了低電平觸發的鎖存器,使能信號通過低電平的鎖存器之后,如果使能信號在高電平跳變,鎖存器的輸出信號是不會改變的,電路圖如下所示:

波形如下所示:

 

這里需要注意的是:

  當門控使能信號是高電平有效的時候,也就是高電平打開門控時鍾,低電平關閉門控時鍾,那么就使用上面的電路,也就是:低電平觸發的鎖存器+與門

  當門控使能信號是低電平有效的時候,那么就要換成:高電平觸發的鎖存器+或門

PS:當涉及毛刺的問題的時候,特別是由於使能信號與時鍾而產生的毛刺,鎖存器起很大的作用。

一般情況,在進行芯片設計的時候,我們不必自己設計門控時鍾,大多是ASIC/SoC生產商都有對應的門控時鍾單元。

 

6、行波時鍾

行波時鍾,也就是一個觸發器的輸出用作另一個觸發器的時鍾輸入,經常用在異步計數器和分頻電路設計中,如下圖所示:

 

 

異步計數器/分頻時鍾雖然原理簡單、設計方便,但級連時鍾(行波時鍾)最容易造成時鍾偏差,級數多了,很可能會影響其控制的觸發器的建立時間和保持時間,使設計難度加大。

轉換的方法是采用同步計數器

 

7、雙邊沿時鍾

雙邊沿時鍾的系統是指在時鍾的上升沿和下降沿都進行數據傳輸:

很顯然,這樣數據的傳輸速率就增加一倍了。DDR就是采用雙邊沿傳輸數據的技術,傳輸示意圖如下所示:

然而一般情況下,我們不建議使用雙邊沿時鍾,這是因為:

  1. 由於上下沿都用,要求時鍾的質量很高,一般的時鍾源很難達到,成本高。
  2. 由於時鍾的抖動等不確定因素的存在,容易使時鍾的占空比發生改變,因此容易引起建立時間和保持時間的違規。
  3. 當使用的雙沿時鍾之后,時鍾的約束變得復雜,此外當某處發生違規之后,違規的路徑的查找難度比單沿時鍾大
  4. 還有一點就是測試難度比較大,雙沿電路的測試電路必定有別與單沿的測試電路。進行掃描測試時,上下沿的時鍾先都得插入多路復用器進行選擇。

 

8、Design Compiler中的時鍾約束

對實際的時鍾進行建模/約束了,實際上就是對這幾個屬性進行設置,下面講解在Design Compiler中怎么進行約束。

在默認的情況下,邏輯綜合時,即使一個時鍾要驅動很多寄存器,DC也不會在時鍾的連線上加時鍾緩沖器(clock buffer)以加強驅動能力,時鍾樹輸入端直接連接到所有寄存器的時鍾引腳,也就是說,對於高扇出(high fanout)的時鍾連線,DC不會對它做設計規則的檢查和優化,如下左圖所示。

在時鍾連線上加上時鍾緩沖器作時鍾樹的綜合(clock tree synthesis),一般由后端(back end)工具完成,后端工具根據整個設計的物理布局(placement)數據,進行時鍾樹的綜合。加入時鍾緩沖器后,使整個時鍾樹滿足skew、latency和transition的目標。時鍾樹綜合后的電路如右下圖所示。
  

 

左上圖的時鍾網絡是理想的,其延遲(latency)和時鍾的偏差(skew)及轉變時間(transition)默認值為零。顯然,理想時鍾網絡與實際的情況不同,使用理想時鍾網絡將產生過於樂觀的時間結果。為了能在綜合時比較准確地描述時鍾樹,我們需要為實際的時鍾樹建模,使邏輯綜合的結果能與版圖(layout)的結果相匹配。

好吧,上面都不是重點,下面才是內容:

    我們用下面的命令建立時鍾那幾個屬性模型:
    create_cloclkset_clock_uncertaintyset_clock_latencyset_clock_transition分別進行時鍾的周期、偏移、延時、轉換約束:

 

1)時鍾偏差的建模:

set_clock_uncertainty:對時鍾的偏移抖動進行建模,也就是對時鍾的偏差進行建模,具體使用為: 

假設時鍾周期為10ns,時鍾的建立偏差為0. 5ns,用下面命令來定義進行約束:

create_clock -period 10 [get_ports  CLK]

set_ clock_ uncertainty  -setup  0.5  [get_clocks CLK]

理想的時鍾:

  只對建立時間的偏差時鍾建模:

   如果對建立時間和保持時間都進行偏差建模,則有: 

 在默認的情況下,"set_clock_uncertainty”命令如果不加開關選項“-setup”或“-hold",那么該命令給時鍾賦予相同的建立和保持偏差值。

這是一種對偏差建模的方式,也就是對建立時間和保持時間進行建模的方式;除此之外,還可以對時鍾的上升沿和下降沿進行偏差建模,比如上升沿的偏差是0.2ns,下降沿的偏差是0.5ns,則有:

 set_ clock_ uncertainty  -rise  0.2 -fall 0.5  [get_clocks CLK]

 一般情況下,我們只約束建立時間,也就是只用第一種方式進行時鍾偏差建模。

當對建立時間偏差建模之后,這時,時鍾周期、時鍾偏差和建立時間的關系如下圖所示:

假設時鍾周期是10ns,建立時間偏差是0.5ns,觸發器的建立時間是0.2ns,這時候從圖中就可以看到,留給寄存器間的路徑的裕量就減少了,也就是說,對寄存器間的約束就變得更加嚴格了,寄存器的翻轉延時、組合邏輯延時與線網延時等這些延時的和必須小於9.3ns,否則就違反了FF2的建立時間。這一點是要注意的。

對於保持時間,在未考慮時鍾偏移之前,前面說了,組合邏輯的延時要大於觸發器的保持時間(具體原因參考前面的描述),當對時鍾偏差建模之后,這時,時鍾周期、時鍾偏差和保持時間的時序關系如下所示:

 2)時鍾轉換時間的建模:

由於時鍾並不是理想的方波,用set_ clock_ transition來模擬時鍾的轉換(transition)時間。默認的上升轉換時間為從電壓的20%上升至80%的時間,下降的轉換時間為從電壓的80%下降至20%的時間。

如果set_clock_transition命令中不加開關選項“-setup”或“-hold" ,那么該命令給時鍾賦予相同的上升和下降轉換時間。

一般情況下,我們只約束最大的轉換時間,如最大轉換時間是0.2ns,那么就加上-max選項:

  set_clock_transition  -max    0.2    [get_clocks  CLK]

 

3)時鍾延遲的建模:

時鍾從時鍾源(比如說晶振)出發到達觸發器時鍾端口的延時,稱為時鍾的延時,包含時鍾源延遲(source latency)時鍾網絡延遲(network latency)

我們使用 set_clock_latency 進行時鍾延時的建模。

一般情況下,我們把時鍾源延遲(source latency)和時鍾網絡的延遲(network latency)分開來。

時鍾源延時需要建模,是因為DC是真的不知道這延時是多大但是,對於時鍾網絡的延遲,DC 在布局布線前 不知道,但是 在布局布線后 就可以計算出來時鍾網絡的延時了,因此在布局布線之后進行綜合時,就沒有必要對時鍾網絡進行延時,因此就要把這兩個延時分開來進行約束。

先說布局布線之前:時鍾周期為10ns,時鍾源到芯片的時鍾端口時間是3ns,時鍾端口到內部觸發器的時間是1ns,如下圖所示,

 

 那么就用下面的命令進行建模:

create_clock  -period  10  [get-ports CLK]

set_clock_latency  -source  3  [get_clocks CLK]

set_clock_latency 1  [get_clocks CLK]

通常情況下,我們約束最大的延時,也就是加上-max的選項,表示最大延時是多少(如set_clock_latency  -source -max  3  [get_clocks CLK] 就是時鍾源到芯片時鍾端口最大的時間是3ns)。

布局布線之后:就可以計算實際的線網延時,就要使用 set_propagated_clock  [ get_clocks CLK] 這個命令代替上面的 set_clock_latency 1  [get_clocks CLK]這個命令。

基本的時鍾建模就OK了,下面進行總結並給出我們這個例子中使用的約束腳本,理想時鍾和實際時鍾的對比,如下圖所示:

因此總結就是,對實際時鍾的建模/約束如下所示: 

版圖前時鍾模型:

create_clock  -period  10  [get-ports CLK]    // 時鍾周期

set_clock_uncertainty  0.5  CLK        // 時鍾偏差的建模:給時鍾賦予相同的建立和保持偏差值

set_clock_transition  0.2  CLK         // 時鍾轉化時間的建模

set_clock_latency -source  4  CLK       // 時鍾延遲的建模:時鍾源延時(source latency)

set_clock_latency  2  CLK            // 時鍾延遲的建模:時鍾網絡延時(network latency)

 

版圖后時鍾模型: 

create_clock  -period  10  [get-ports CLK]    // 時鍾周期

set_clock_uncertainty  0.5  CLK        // 時鍾偏差的建模:給時鍾賦予相同的建立和保持偏差值

set_clock_transition  0.2  CLK         // 時鍾轉化時間的建模

set_clock_latency -source  4  CLK       // 時鍾延遲的建模:時鍾源延時(source latency)

set_propagated_clock  2  CLK           // 時鍾延遲的建模:時鍾網絡延時(network latency)

  

補充1:時鍾分配策略

  時鍾的分頻從規划初始就應該考慮,也就是從系統層面上去考慮,而不是等到后端設計時再考慮。

  時鍾分配策略考慮因素有:

  1.   系統的時鍾分配計划(主要是時鍾樹方案、各個模塊的時鍾頻率等);
  2.   時鍾的最小延時(主要是根據系統運行的速度來定義最小的延時要求,這個與時鍾分配計划應該是有重疊的地方,具體我不是很了解);
  3.   時鍾緩沖(這個是考慮負載的問題,往往也是在設計時鍾樹時應該考慮的問題);
  4.   消除時鍾偏移(時鍾偏移總是存在的,如何降到最小或使其達到預期的效果,也是要考慮的);
  5.   門控時鍾、軟硬件協同設計等省電模式的考慮(這個需要具體問題具體分析了,還可以從低功耗設計的角度進行觀察)。

 


免責聲明!

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



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