數(shù)字設(shè)計中的時鐘與約束
本文作者 IClearner 在此特別鳴謝
最近做完了synopsys的DC workshop,涉及到時鐘的建模/約束,這里就來聊聊數(shù)字中的時鐘(與建模)吧。主要內(nèi)容如下所示:
·同步電路與異步電路;
·時鐘/時鐘樹的屬性:偏移(skew)與時鐘的抖動(jitter)、延時(latency)、轉(zhuǎn)換(transition)時間;
·內(nèi)部時鐘;
·多路復(fù)用時鐘;
·門控時鐘;
·行波時鐘;
·雙沿時鐘;
·Design Compiler中的時鐘約束。
·補充:時鐘分配策略
1、同步電路與異步電路
首先來談?wù)勍诫娐放c異步電路。那么首先就要知道什么是同步電路、什么是異步電路?
對于同步時序電路,不同的文章有不同的說法,大致有下面的定義方法:
①對于比較嚴(yán)格的定義:一個電路是同步電路,需要滿足一下條件:
·每一個電路元件是寄存器或者是組合電路;
·至少有一個電路元件是是寄存器;
·所有寄存器都接收同一個時鐘電路;
·若有環(huán)路,則環(huán)路至少包含一個寄存器。
在上面的嚴(yán)格定義下,可以得到下面的電路不是同步電路:
:是組合邏輯,不符合定義;:是組合邏輯和鎖存器,不符合定義;
下面的形式肯定是同步電路:
:寄存器的時鐘都是CLK
下面的電路嚴(yán)格上說不算是同步電路:
:因為右邊的時鐘經(jīng)過兩個反相器的延時,時鐘信號不同了。
②對于不算很嚴(yán)格的同步電路定義有:
·所有時鐘的時鐘來自同一個時鐘源:比如下面的(分頻)電路
CLKA、CLKC、CLKD、CLKE都是由300M這個時鐘源分頻而來,因此這個系統(tǒng)屬于同步電路系統(tǒng)。
·當(dāng)不是來自同一個時鐘源時,只要CLOCK的周期有倍數(shù)關(guān)系并且相互之間的相位關(guān)系是固定的就可以算是同步電路,比如, 電路中用了10ns, 5ns,
2.5ns
三個時鐘,這三個時鐘不是由同一個時鐘源分頻來的,但是這三個時鐘的周期有倍數(shù)關(guān)系并且相位關(guān)系固定:10ns是5ns的2倍,是2.5ns的兩倍,之間是整數(shù)倍關(guān)系;相位關(guān)系是固定的,因此也算是同步電路。
CLOCK之間沒有倍數(shù)關(guān)系或者相互之間的相位關(guān)系不是固定的,比如電路中用5ns, 3ns
兩個CLOCK,這兩個時鐘不是來自同一個時鐘源,兩者之間沒有周期關(guān)系,因此是異步電路。
關(guān)于是不是同步時鐘的問題,還要具體情況具體分析,在后面的垮時鐘域也會涉及有關(guān)同步時鐘的問題,這里就不再繼續(xù)闡述了,以免越解釋越麻煩。
此外也有的資料顯示:同步電路是由時序電路(寄存器和各種觸發(fā)器)和組合邏輯電路構(gòu)成的電路。同步時序邏輯電路的特點是各觸發(fā)器的時鐘端全部連接在一起,并接在系統(tǒng)時鐘端,只有當(dāng)時鐘脈沖到來時,電路的狀態(tài)才能改變。改變后的狀態(tài)將一直保持到下一個時鐘脈沖的到來,此時無論外部輸入
x 有無變化,狀態(tài)表中的每個狀態(tài)都是穩(wěn)定的。
2、時鐘/時鐘樹的屬性
一般的時鐘,我們都指的是全局時鐘,全局時鐘在芯片中的體現(xiàn)形式是時鐘樹。
時鐘樹,是個由許多緩沖單元(buffer cell)平衡搭建的時鐘網(wǎng)狀結(jié)構(gòu),如下圖所示:
首先不得不說,實際的時鐘除了周期/頻率、相位、沿、電平屬性外,還有其他的屬性,也就是:不是下面這樣子規(guī)規(guī)整整的:
為什么呢?那是因為時鐘有下面的屬性(“實際的buff”):
①時鐘的偏移(skew):時鐘分支信號在到達(dá)寄存器的時鐘端口過程中,都存在有線網(wǎng)等延時,由于延時,到達(dá)寄存器時鐘端口的時鐘信號存在有相位差,也就是不能保證每一個沿都對齊,這種差異稱為時鐘偏移(clock
skew),也叫時鐘偏斜。時鐘的偏移如下圖所示:
此外,時鐘skew與時鐘頻率并沒有直接關(guān)系,skew與時鐘線的長度及被時鐘線驅(qū)動的時序單元的負(fù)載電容、個數(shù)有關(guān)。
②時鐘抖動(jitter):相對于理想時鐘沿實際時鐘存在不隨時間積累的、時而超前、時而滯后的偏移稱為時鐘抖動,簡稱抖動,如下圖所示:
時鐘的抖動可以分為隨機抖動(Random Jitter,簡稱Rj)和固有抖動(Deterministic jitter):
·隨機抖動的來源為熱噪聲、Shot Noise和Flick
Noise,與電子器件和半導(dǎo)體器件的電子和空穴特性有關(guān),比如ECL工藝的PLL比TTL和CMOS工藝的PLL有更小的隨機抖動;
·固定抖動的來源為:開關(guān)電源噪聲、串?dāng)_、電磁干擾等等,與電路的設(shè)計有關(guān),可以通過優(yōu)化設(shè)計來改善,比如選擇合適的電源濾波方案、合理的PCB布局和布線。
也就是說:jitter與時鐘頻率無直接關(guān)系。
時鐘的偏移和時鐘的抖動都影響著時鐘網(wǎng)絡(luò)分枝的延遲差異(相位差異),在Design
Compiler里面,我們用時鐘的不確定性(uncertainty)來表示這兩種情況的影響。
③時鐘的轉(zhuǎn)換時間(transition)
:時鐘的上升沿跳變到下降沿或者時鐘下降沿跳變到上升沿的時間,這個時間并不是如左下圖所示那樣完全沒有跳變時鐘的,而是像右下圖那樣,時鐘沿的跳變時間就是時鐘的轉(zhuǎn)換時間(后面約束的時候會有相關(guān)的解釋)。
理想: 帶轉(zhuǎn)換時間的時鐘:
時鐘的轉(zhuǎn)換時間與與單元的延時時間(也就是器件特性)還有電容負(fù)載有關(guān)。
④時鐘的延時(latency) :時鐘從時鐘源(比如說晶振)出發(fā)到達(dá)觸發(fā)器時鐘端口的延時,稱為時鐘的延時,包含時鐘源延遲(source
latency)和時鐘網(wǎng)絡(luò)的延遲(network latency),如下圖所示:
時鐘源延遲(clock source latency),也稱為插入延遲(insertion
delay),是時鐘信號從其實際時鐘原點到設(shè)計中時鐘定義點(時鐘的輸入引腳)的傳輸時間,上圖是3ns。
時鐘網(wǎng)絡(luò)的延遲( clock network
latency)是時鐘信號從其定義的點(端口或引腳)到寄存器時鐘引腳的傳輸,經(jīng)過緩沖器和連線產(chǎn)生的延遲(latency),上圖是1ns。
OK,時鐘的附加的buff屬性差不多就是這樣了。
3、內(nèi)部時鐘
記得我剛剛學(xué)習(xí)FPGA的時候,在verilog代碼中,經(jīng)常使用內(nèi)部產(chǎn)生的時鐘,也就是用內(nèi)部的一個信號充當(dāng)另外一個always塊的時鐘沿敏感列表,如下圖所示:
實際上,這種內(nèi)部時鐘不建議使用,一個是因為產(chǎn)生內(nèi)部時鐘的邏輯是有延時的,導(dǎo)致A_clk產(chǎn)生也會延時,Data與A_clk會有延時,就會有亞穩(wěn)態(tài)的穩(wěn)壓;另外一個就是由觸發(fā)器生成A_clk的驅(qū)動能力問題。
4、多路復(fù)用時鐘
在一個系統(tǒng)里面,很有可能會用到多個時鐘輪流驅(qū)動一些觸發(fā)器,為了適應(yīng)不同的數(shù)據(jù)速率要求,進行時鐘切換。有時為了節(jié)約功耗,也會把高速時鐘切換到低速時鐘,或者進行時鐘休眠操作,多路時鐘如下圖所示:
這樣的時鐘一般情況下也會導(dǎo)致一些問題,比如時鐘切換時導(dǎo)致后面驅(qū)動的寄存器建立時間不足,當(dāng)滿足一定的條件時,這種多路復(fù)用器的時鐘也是可以使用的,要滿足的要求有:
·時鐘復(fù)用電路一旦上電工作之后,就不要對復(fù)用邏輯進行更改,以免更改之后產(chǎn)生不確定錯誤。
·在測試的時候,設(shè)計電路繞過時鐘多路邏輯來選擇普通的時鐘,也就是使用普通的時鐘進行測試。
·在時鐘進行切換的時候,寄存器要處于復(fù)位的狀態(tài),以免在切換之后建立時間不夠而進入亞穩(wěn)態(tài)。
·在時鐘切換的時候,可能會產(chǎn)生一些短暫的錯誤,但是這些錯誤對整個系統(tǒng)沒有影響。
對于系統(tǒng)要求非常嚴(yán)格的,比如時鐘切換很頻繁,有不能夠在復(fù)位的時候切換,而且也不允許有短暫的錯誤,那么時鐘就不能這樣子進行切換了,就要使用其他的時鐘切換方案或者進行時鐘同步了。至于多時鐘切換的方案,以后有時間再學(xué)習(xí)補充。
5、門控時鐘
門控時鐘可是低功耗設(shè)計的寵兒,關(guān)于門控時鐘的資料也有一大堆,下面就來寫寫門控時鐘吧。
門控時鐘也就是在使能信號有效的時候,把時鐘打開;使能信號無效的時候,時鐘關(guān)閉。時鐘關(guān)閉之后,它所驅(qū)動的寄存器就不會反正,因此也就降低了動態(tài)功耗。
門控時鐘最開始的電路是:
這種門控時鐘bug多,我們先來看看這種電路的bug波形是怎么樣的,也就是知道問題所在,好讓我們改進:
從波形圖中可以看到,門控使能信號如果在時鐘的高電平的時候開啟或者關(guān)閉,就會導(dǎo)致產(chǎn)生的門控時鐘高電平被截斷,變成毛刺;門控使能信號對在時鐘低電平時跳變對產(chǎn)生的門控時鐘沒有影響。因此我們的針對點就是高電平時的翻轉(zhuǎn)。
因此我們就可以通過設(shè)置一種電路,讓門控使能信號在通過這個邏輯電路之后,僅僅在時鐘低電平的時候進行翻轉(zhuǎn),而在時鐘高電平的時候,不能翻轉(zhuǎn)也就是保持。從而我們就想到了低電平觸發(fā)的鎖存器,使能信號通過低電平的鎖存器之后,如果使能信號在高電平跳變,鎖存器的輸出信號是不會改變的,電路圖如下所示:
波形如下所示:
這里需要注意的是:
當(dāng)門控使能信號是高電平有效的時候,也就是高電平打開門控時鐘,低電平關(guān)閉門控時鐘,那么就使用上面的電路,也就是:低電平觸發(fā)的鎖存器+與門。
當(dāng)門控使能信號是低電平有效的時候,那么就要換成:高電平觸發(fā)的鎖存器+或門。
PS:當(dāng)涉及毛刺的問題的時候,特別是由于使能信號與時鐘而產(chǎn)生的毛刺,鎖存器起很大的作用。
一般情況,在進行芯片設(shè)計的時候,我們不必自己設(shè)計門控時鐘,大多是ASIC/SoC生產(chǎn)商都有對應(yīng)的門控時鐘單元。
6、行波時鐘
行波時鐘,也就是一個觸發(fā)器的輸出用作另一個觸發(fā)器的時鐘輸入,經(jīng)常用在異步計數(shù)器和分頻電路設(shè)計中,如下圖所示:
異步計數(shù)器/分頻時鐘雖然原理簡單、設(shè)計方便,但級連時鐘(行波時鐘)最容易造成時鐘偏差,級數(shù)多了,很可能會影響其控制的觸發(fā)器的建立時間和保持時間,使設(shè)計難度加大;轉(zhuǎn)換的方法是采用同步計數(shù)器。
7、雙邊沿時鐘
雙邊沿時鐘的系統(tǒng)是指在時鐘的上升沿和下降沿都進行數(shù)據(jù)傳輸:
很顯然,這樣子數(shù)據(jù)的傳輸速率就增加一倍了。DDR就是采用雙邊沿傳輸數(shù)據(jù)的技術(shù),傳輸示意圖如下所示:
然而一般情況下,我們不建議使用雙邊沿時鐘,這是因為:
·由于上下沿都用,要求時鐘的質(zhì)量很高,一般的時鐘源很難達(dá)到,成本高。
·由于時鐘的抖動等不確定因素的存在,容易使時鐘的占空比發(fā)生改變,因此容易引起建立時間和保持時間的違規(guī)。
·當(dāng)使用的雙沿時鐘之后,時鐘的約束變得復(fù)雜,此外當(dāng)某處發(fā)生違規(guī)之后,違規(guī)的路徑的查找難度比單沿時鐘大。
·還有一點就是測試難度比較大,雙沿電路的測試電路必定有別與單沿的測試電路。進行掃描測試時,上下沿的時鐘先都得插入多路復(fù)用器進行選擇。
8、Design Compiler中的時鐘約束
對實際的時鐘進行建模/約束了,實際上就是對這幾個屬性進行設(shè)置,下面講解在Design Compiler中怎么進行約束。
在默認(rèn)的情況下,邏輯綜合時,即使一個時鐘要驅(qū)動很多寄存器,DC也不會在時鐘的連線上加時鐘緩沖器(clock
buffer)以加強驅(qū)動能力,時鐘輸輸入端直接連接到所有寄存器的時鐘引腳,也就是說,對于高扇出(high
fanout)的時鐘連線,DC不會對它做設(shè)計規(guī)則的檢查和優(yōu)化,如下左圖所示。在時鐘連線上加上時鐘緩沖器或作時鐘樹的綜合(clock tree
synthesis)一般由后端(back
end)工具完成,后端工具根據(jù)整個設(shè)計的物理布局(placement)數(shù)據(jù),進行時鐘樹的綜合。加入時鐘緩沖器后,使整個時鐘樹滿足skew,
latency和transition的目標(biāo)。時鐘樹綜合后的電路如右下圖所示。
左上圖的時鐘網(wǎng)絡(luò)是理想的,其延遲(latency)和時鐘的偏差(skew)及轉(zhuǎn)變時間(transition)默認(rèn)值為零。顯然,理想時鐘網(wǎng)絡(luò)與實際的情況不同,使用理想時鐘網(wǎng)絡(luò)將產(chǎn)生過于樂觀的時間結(jié)果。為了能在綜合時比較準(zhǔn)確地描述時鐘樹,我們需要為實際的時鐘樹建模,使邏輯綜合的結(jié)果能與版圖(layout)的結(jié)果相匹配。
好吧,上面都不是重點,下面才是內(nèi)容:
我們用下面的命令建立時鐘那幾個屬性模型:
create_cloclk、set_clock_uncertainty、set_clock_latency、set_clock_transition分別進行時鐘的周期、偏移、延時、轉(zhuǎn)換約束:
時鐘偏差的建模:
set_clock_uncertainty:對時鐘的偏移和抖動進行建模,也就是對時鐘的偏差進行建模,具體使用為:
假設(shè)時鐘周期為10ns,時鐘的建立偏差為0. 5ns,用下面命令來定義進行約束:
create_clock -period 10 [get_ports CLK]
set_ clock_ uncertainty -setup 0.5 [get_clocks CLK]
理想的時鐘:
只對建立時間的偏差時鐘建模:
如果對建立時間和保持時間都進行偏差建模,則有:
在默認(rèn)的情況下,“set-clock_uncertainty”命令如果不加開關(guān)選項“-setup”或“-hold”,那么該命令給時鐘賦予相同的建立和保持偏差值。
這是一種對偏差建模的方式,也就是對建立時間和保持時間進行建模的方式;除此之外,還可以對時鐘的上升沿和下降沿進行偏差建模,比如上升沿的偏差是0.2ns,下降沿的偏差是0.5ns,則有:
set_ clock_ uncertainty -rise 0.2 -fall 0.5 [get_clocks CLK]
一般情況下,我們只約束建立時間,也就是只用第一種方式進行時鐘偏差建模。
當(dāng)對建立時間偏差建模之后,這時,時鐘周期、時鐘偏差和建立時間的關(guān)系如下圖所示:
假設(shè)時鐘周期是10ns,建立時間偏差是0.5ns,觸發(fā)器的建立時間是0.2ns,這時候從圖中就可以看到,留給寄存器間的路徑的裕量就減少了,也就是說,對寄存器間的約束就變得更加嚴(yán)格了,寄存器的翻轉(zhuǎn)延時、組合邏輯延時與線網(wǎng)延時等這些延時的和必須小于9.3ns,否則就違反了FF2的建立時間。這一點是要注意的。
對于保持時間,在未考慮時鐘偏移之前,前面說了,組合邏輯的延時要大于觸發(fā)器的保持時間(具體原因參考前面的描述),當(dāng)對時鐘偏差建模之后,這時,時鐘周期、時鐘偏差和保持時間的時序關(guān)系如下所示:
時鐘轉(zhuǎn)換時間的建模:
由于時鐘并不是理想的方波,用set_ clock_
transition來模擬時鐘的轉(zhuǎn)換(transition)時間。默認(rèn)的上升轉(zhuǎn)換時間為從電壓的20%上升至80%的時間,下降的轉(zhuǎn)換時間為從電壓的80%下降至20%的時間。如果set_clock_transition命令中不加開關(guān)選項“-setup”或“-hold“
,那么該命令給時鐘賦予相同的上升和下降轉(zhuǎn)換時間。一般情況下,我們只約束最大的轉(zhuǎn)換時間,如最大轉(zhuǎn)換時間是0.2ns,那么就加上-max選項:
set_clock_transition -max 0.2 [get_clocks CLK]
時鐘延遲的建模:
時鐘從時鐘源(比如說晶振)出發(fā)到達(dá)觸發(fā)器時鐘端口的延時,稱為時鐘的延時,包含時鐘源延遲(source latency)和時鐘網(wǎng)絡(luò)的延遲(network
latency)。我們使用set_clock_latency進行時鐘延時的建模。一般情況下,我們把時鐘源延遲(source
latency)和時鐘網(wǎng)絡(luò)的延遲(network
latency)分開來,因為時鐘源延時需要建模,是因為DC是真的不知道這延時是多大,但是對于時鐘網(wǎng)絡(luò)的延遲,DC在布局布線前不知道,但是在布局布線后就可以計算出來時鐘網(wǎng)絡(luò)的延時了,因此在布局布線之后進行綜合時,就沒有必要對時鐘網(wǎng)絡(luò)進行延時,因此就要把這兩個延時分開來進行約束。
先說布局布線之前:時鐘周期為10ns,時鐘源到芯片的時鐘端口時間是3ns,時鐘端口都內(nèi)部觸發(fā)器的時間是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)。
布局布線之后:就可以計算實際的線網(wǎng)延時,就要使用
set_propagated_clock [ get_clocks CLK] 這個命令代替上面的
set_clock_latency 1 [get_clocks CLK]這個命令。
基本的時鐘建模就OK了,下面進行總結(jié)并給出我們這個例子中使用的約束腳本,理想時鐘和實際時鐘的對比,如下圖所示:
因此總結(jié)就是,對實際時鐘的建模/約束如下所示:
補充1:時鐘分配策略
時鐘的分頻從規(guī)劃初始就應(yīng)該考慮,也就是從系統(tǒng)層面上去考慮,而不是等到后端設(shè)計時再考慮。時鐘分配策略考慮因素有:
系統(tǒng)的時鐘分配計劃(主要是時鐘樹方案、各個模塊的時鐘頻率等);
時鐘的最小延時(主要是根據(jù)系統(tǒng)運行的速度來定義最小的延時要求,這個與時鐘分配計劃應(yīng)該是有重疊的地方,具體我不是很了解);
時鐘緩沖(這個是考慮負(fù)載的問題,往往也是在設(shè)計時鐘樹時應(yīng)該考慮的問題);
消除時鐘偏移(時鐘偏移總是存在的,如何降到最小或使其達(dá)到預(yù)期的效果,也是要考慮的);
門控時鐘、軟硬件協(xié)同設(shè)計等省電模式的考慮(這個需要具體問題具體分析了,還可以從低功耗設(shè)計的角度進行觀察)。
附注:
本文的參考文獻有:
Design Compiler 1 ,synopsys workshop
數(shù)字設(shè)計和計算機體系結(jié)構(gòu),(美)DavidMoneyHarris等
The art of Hardware Architecture ,Mohit Aroa
IC設(shè)計基礎(chǔ),西安電子科技大學(xué)出版社
-
FPGA
+關(guān)注
關(guān)注
1629文章
21729瀏覽量
602990 -
時鐘
+關(guān)注
關(guān)注
10文章
1733瀏覽量
131446 -
數(shù)字設(shè)計
+關(guān)注
關(guān)注
0文章
46瀏覽量
22295 -
同步電路
+關(guān)注
關(guān)注
1文章
60瀏覽量
13310 -
異步電路
+關(guān)注
關(guān)注
2文章
48瀏覽量
11099
發(fā)布評論請先 登錄
相關(guān)推薦
評論