首先上思維導圖:
如果要問“芯片中怎么復位才對?”
很多人都會回答“異步復位同步釋放”。
但是為什么要用異步復位同步釋放,是不是所有的芯片都必須采用這種方式,估計很少人能回答上來。那么讓我們從為什么要復位開始。
1. 復位的目的
復位信號在數(shù)字電路里面的重要性僅次于時鐘信號。對一個芯片來說,復位的主要目的是使芯片電路進入一個已知的,確定的狀態(tài)。主要是觸發(fā)器進入確定的狀態(tài)。在一般情況下,芯片中的每個觸發(fā)器都應該是可復位的。在某些情況下,當在高速應用程序中使用流水線觸發(fā)器(移位寄存器觸發(fā)器)時,為了實現(xiàn)更高的性能設計,可能會從某些觸發(fā)器中消除復位。這種類型設計需要在復位激活期間,運行預先確定數(shù)量的時鐘周期,以使ASIC處于已知的狀態(tài)。
1.1 為什么需要復位呢?
1)復位可以使電路從確定的初始狀態(tài)開始運行:
上電復位:上電的時候,為了避免上電后進入隨機狀態(tài)而使電路紊亂,這個時候就需要上電復位。
中間復位:有時候,要求電路從初始狀態(tài)開始執(zhí)行電路的功能,要對電路進行復位,讓它從最初的狀態(tài)開始運行。
- 復位可以使電路從錯誤狀態(tài)回到可以控制的確定狀態(tài):
如果電路發(fā)生了異常,比如狀態(tài)不正常,中斷異常,firmware程序跑飛,這個時候就可以對電路進行復位,讓它從錯誤的狀態(tài)回到一個正常的狀態(tài)。
- 電路仿真時需要電路具有已知的初始值
在仿真的時候,信號在初始狀態(tài)是未知狀態(tài)(也就是所謂的x,不過對信號初始化之后的這種情況除外,因為仿真的時候對信號初始化就使信號有了初始值,這就不是x了)。
對于數(shù)據(jù)通路(數(shù)字系統(tǒng)一般分為數(shù)據(jù)通路和控制通路,數(shù)據(jù)通路一般是對輸入的數(shù)據(jù)進行處理,控制通路則是對運行的情況進行操作),在實際電路中,只要輸入是有效數(shù)據(jù)(開始的時候可能不是有效的),輸出后的狀態(tài)也是確定的;在仿真的時候,也是輸入數(shù)據(jù)有效了,輸出也就確定了。也就是說,初始不定態(tài)對數(shù)據(jù)通路的影響不明顯。
對于控制通路,在實際電路中,只要控制通路完備(比如說控制通路的狀態(tài)機是完備的),即使初始狀態(tài)即使是不定態(tài),在經過一定的循環(huán)后,還是能回到正確的狀態(tài)上;然而在仿真的時候就不行了,仿真的時候由于初始狀態(tài)為未知態(tài),控制電路一開始就陷入了未知態(tài);仿真跟實際電路不同,仿真是“串行”的,仿真時控制信號的初始不定態(tài)會導致后續(xù)的控制信號結果都是不定態(tài),也就是說,初始的不定態(tài)對控制通道是致命的。
1.2 不需要復位的情況
復位信號很重要,但是并不是每一部分的電路都需要復位電路,一方面是復位電路也消耗邏輯資源、占用芯片面積,另一方面是復位信號會增加電路設計的復雜性(比如要考慮復位的策略、復位的布局布線等等)。
當某個電路的輸出在任何時刻都可以不受到復位信號的控制就有正確的值時,比如說數(shù)據(jù)通路中的對數(shù)據(jù)進行處理的部分。在某些情況下,當流水線的寄存器(移位寄存觸發(fā)器)在高速應用中時,應該去掉某些寄存器的復位信號以使設計達到更高的性能,因為帶復位的觸發(fā)器比不帶復位的觸發(fā)器更復雜,反應也更慢。
2. 同步復位
2.1 同步復位的實現(xiàn)方式
同步復位的前提是,復位信號只會在時鐘的有效邊沿去影響或者復位flip-flop。Reset可以作為組合邏輯的一部分送給FF的D端。這種情況下,編碼方式必須是if/else 優(yōu)先級的方式,而且reset只能放在if條件下,其他組合邏輯放到else邏輯下。
正確的方式去構建同步復位FF的verilog代碼如下:
如果沒有嚴格遵守這種方式,會有兩個問題:
1、一些仿真器中,基于邏輯方程,邏輯可能組織復位到達觸發(fā)器。這只是一個仿真問題,不是硬件問題。但是復位的一個主要目的,就是仿真的時候將電路置于一個已知的確定狀態(tài)。
2、由于復位樹的高扇出,復位信號可能是一個相對于時鐘周期的“延遲到達信號”,盡管復位將從復位緩沖區(qū)樹中進行緩沖,但明智的做法是限制復位到達本地邏輯后必須經過的邏輯量。就是說必須對復位信號少做邏輯。
下面的列子是一個同步復位的,帶進位的計數(shù)器(loadable counter with synchronous reset)
它的電路圖如下:
圖1 Loadable counter with synchronous reset
同步復位的有一個問題就是,綜合工具不能很好的把reset信號和其他的信號區(qū)分開。比如上面的電路也可能被綜合成另外的電路,如下所示:
圖2 Loadable counter with synchronous reset style 2
圖1和圖2是完全相同的。唯一的區(qū)別是圖2的reset信號被提前到了MUX之前。通過rst_n拉低,可以強制MUX的兩個分支的輸入為0,但是如果ld是未知的(X),并且MUX模型是悲觀的,則會保持未知(X) 不會被復位。注意,這只是在仿真過程中出現(xiàn)的問題! 實際的電路可以工作正確并將其重置為0。
Synopsys提供編譯器指令sync_set_reset,該指令告訴綜合工具給定信號是同步reset(or set)。合成工具將這個信號“拉”到盡可能接近觸發(fā)器,防止這種初始化問題的發(fā)生:
// synopsys sync_set_reset "rst_n"
這個命令只會影響綜合,不會影響邏輯行為,所以推薦在同步復位每個模塊都加上這個信號。
另外,可以在讀取RTL之前將合成變量hdlin_ff_always_sync_set_reset設置為-true,這樣就可以得到相同的結果,而不需要在代碼本身中執(zhí)行任何指令。
2.2 同步復位的優(yōu)點和缺點
同步復位的優(yōu)點如下
(1) 同步復位會綜合成更小的觸發(fā)器,特別當reset生成邏輯電路作為觸發(fā)器D輸入,但是這種情況下組合邏輯電路的數(shù)量變多,所以總的門電路節(jié)省不是那么顯著。
(2) 同步復位確保電路100%是同步的。
(3) 同步復位確保復位只發(fā)生在時鐘有效邊沿,對小的復位毛刺來說,時鐘就像濾波器。
(4) 在一些設計中,復位必須由內部條件產生。同步復位能過濾時鐘間邏輯等式的毛刺。
(5) 通過使用同步重置和預先確定的時鐘數(shù)量作為復位過程的一部分??梢栽趶臀痪彌_區(qū)樹中使用觸發(fā)器,來幫助將緩沖樹的時序保持在一個時鐘周期以內。
同步復位的缺點如下:
(1) 不是所有的庫都有自帶同步reset的FF, 但是可以通過把reset當作數(shù)據(jù)輸入來解決;
(2) 同步復位需要一個脈沖延伸器保證復位脈沖足夠寬,能夠被有效時鐘沿采集到;特別是在多時鐘設計中;
(3) 同步復位電路必須要有一個時鐘來復位。如果用門控時鐘來省電,那么沒有時鐘的時候就不能復位;
(4) 如果電路中有三態(tài)總線,那么上電時必須用異步復位,如果用同步復位,reset必須能夠復位三態(tài)信號的enable信號。如下所示
3. 異步復位
3.1 異步復位的實現(xiàn)
異步復位觸發(fā)器則是在設計觸發(fā)器的時候加入了一個復位引腳,也就是說復位邏輯集成在觸發(fā)器里面。(一般情況下)低電平的復位信號到達觸發(fā)器的復位端時,觸發(fā)器進入復位狀態(tài),直到復位信號撤離。帶異步復位的觸發(fā)器電路圖和RTL代碼如下所示:
關于異步復位的綜合約束,推薦將輸入reset設置為
set_ideal_network + false path
3.2 異步復位的優(yōu)點
1.異步復位的最大優(yōu)點是,vendor庫里面有異步復位FF, 這樣datapath就十分干凈。不用把reset與數(shù)據(jù)做邏輯,這樣復位路徑上就不會有額外的延時,也不會受外部信號的干擾。
異步復位的進位計數(shù)器如下:
綜合后的電路如下:
可以看到,reset路徑上十分干凈,直接由外部pin來控制,不受其他信號影響。
2.異步復位的另一個優(yōu)點是電路reset和時鐘無關,不管有沒有時鐘,都可以reset。好處是可以實時復位,也可以加在門控時鐘里面。門控時鐘是低功耗設計的重要方法。
3.異步復位不需要加入綜合指令,綜合工具就能自動識別。
3.3 異步復位的缺點
1.異步重置的最大問題是它們是異步的,在復位階段和解復位階段(復位撤離)都是異步的。復位階段不是問題,解復位才是問題。如果在觸發(fā)器的活動時鐘邊緣或附近釋放異步復位,則觸發(fā)器的輸出可能變?yōu)閬喎€(wěn)態(tài),這樣電路的復位狀態(tài)可能會丟失,解復位失敗。
如下圖所示, 異步復位信號復位解除時是和時鐘信號完全異步的。
這種情況下有兩個問題:(1)復位恢復時間(reset recovery time) 違例
(2) 復位解除(reset removal) 發(fā)生在不同的觸發(fā)器的不同時鐘周期
下面先解釋一下兩個概念:復位恢復時間(reset recovery time)和復位解除時間(reset removal time)
復位恢復時間: 解除復位信號時,復位邊沿(當然是從有效變成無效的跳變時刻,通常是0->1那個時間點)與下一個有效時鐘沿之間的這段時間。對應建立時間
復位解除時間: 解除復位信號時,復位邊沿與上一個有效時鐘沿之間的這段時間。對應保持時間
異步復位的復位信號必須滿足一定的恢復時間和解除時間,否則沒法確定時鐘沿是否起作用了,即判斷不了到時是復位了還是沒復位。D觸發(fā)器如果不復位,那么輸出就是輸入的數(shù)據(jù)。
1). 不滿足復位恢復時間或者撤離時間,可能會導致亞穩(wěn)態(tài)問題。(注意是可能)因為如果輸出本身就是復位后的值,即使當前時鐘沿不能判斷是否復位,輸出也是復位值,這時候就不會產生亞穩(wěn)態(tài),因為已經是復位態(tài)了。
2). 不滿足復位恢復時間或者撤離時間可能會導致不同F(xiàn)F復位狀態(tài)不一致的問題。復位信號和時鐘信號一樣,通過復位網(wǎng)絡到達各個觸發(fā)器。復位網(wǎng)絡具有非常大的扇出和負載,到達不同的觸發(fā)器存在不同的延時,不滿足復位恢復或者解除時間的情況下,就有可能在不同的觸發(fā)器的不同時鐘周期內進行解復位。注意,這里的假設條件是復位樹和時鐘樹已經做成立平衡狀態(tài),不再考慮復位樹和時鐘樹沒做好的情況。
既然同步復位和異步復位都有問題,那么到底應該怎么復位呢?能不能即有同步復位和異步的優(yōu)點,而沒有同步復位和異步復位的缺點呢?小孩子才做選擇,成年人就是我都要。所以解決方案就是: 異步復位同步釋放。
4. 異步復位同步釋放
異步復位的同步釋放電路也稱為復位同步器。
規(guī)則:每個異步復位的電路,必須包含一個復位同步器。代碼和電路如下:
復位和解復位都是通過pad_rst_n來實現(xiàn)的,第一級FF的輸入是拉成高(固定為“1”),第二級的FF用來消除解復位時可能帶來的的亞穩(wěn)態(tài)。
為什么兩級FF就不會出現(xiàn)亞穩(wěn)態(tài)呢?第一級FF輸入是1, 輸出的reset值是0,而reset又是異步的,如果reset剛好在clock邊沿附近,就會出現(xiàn)亞穩(wěn)態(tài)。
但是加上了第二級FF就不會出現(xiàn)亞穩(wěn)態(tài)。這是因為第二級的FF的輸入比第一個FF延時了一個cycle,這樣第一個FF在解復位時候,即使有亞穩(wěn)態(tài),那么也只是影響下一個周期的Q1輸出,下一個周期Q1可能為0也可能為1,但是當前Q1還是為低(0), 因為這時第一個FF還是復位狀態(tài)。這樣第二個FF當前周期的輸入是0,復位輸出也是0,所以能不能復位成功都不會改變輸出為0,即當前周期不會產生亞穩(wěn)態(tài)。下一個周期的Q1輸出雖然可能是0也可能是1,但是已經穩(wěn)定,是一個確定的值,所以第二個FF輸出也是穩(wěn)定的值。如下圖所示:
(手畫的,見諒)
5.異步復位的抖動或毛刺
由于異步復位和時鐘無關,任何一個毛刺都可以引起復位。這是一個reset源的問題。下面的電路可以過濾毛刺,主要原理是把輸入源與上它的延時來消除毛刺。
但是這并不是一個很完美的設計,主要原因是delay單元的實現(xiàn),因為不同溫度不同制程下,delay值可能會不同。
有的庫里面包含Delay宏,有的沒有;沒有的話就需要手動增加delay或者插buffer,同時增加約束讓delay不被綜合掉。
同時rst_n 輸入也必須是一個史密斯觸發(fā)器pad,進一步消除抖動。
并不是所有的系統(tǒng)都需要增加防抖,要根據(jù)應用范圍來判斷。
6. 復位樹
復位樹和時鐘樹一樣應該引起重視,因為典型的數(shù)字電路中,reset的負載和clock的負載數(shù)量一般是相當?shù)?。不管是同步復位還是異步復位,對復位樹都是有時序要求的。一個典型的復位樹如下圖所示:
時鐘分布樹和重置分布樹之間的一個重要區(qū)別是時鐘樹需要緊密平衡分布重置之間的偏差(skew)。與時鐘信號不同,只要與復位信號相關的延遲足夠短,允許在一個時鐘周期內傳播所有復位負載,并且仍然滿足所有目標寄存器和觸發(fā)器的恢復時間,那么復位信號之間的偏差(skew)就不是關鍵。
另外一個需要考慮的問題是,時鐘樹和復位樹之間的關系。到底用那個時鐘來驅動復位樹的FF呢?如果能夠用分支clock來驅動master reset的FF那最好了,但是在大多數(shù)情況下,沒有足夠的時間讓時鐘脈沖遍歷時鐘樹、時鐘復位驅動觸發(fā)器,然后讓復位遍歷復位樹,所有這些都在一個時鐘周期內完成。這種情況如下圖所示:
為了能讓reset到達所有邏輯的速度更快,更好的方式是用一個更早的clock來驅動reset ff,即用源時鐘來驅動。必須進行Post layout timing分析,以保證復位同步器的FF不會出現(xiàn)setup/hold違例。通常情況下,兩個tree之間詳細的時序調整必須等到layout完成才能進行。電路結構如下圖所示:
上述的復位樹對同步復位樹和異步復位樹都是適用的。
6.1 同步復位樹
對同步復位,一種技術是通過插入FF來實現(xiàn)復位樹。這樣的好處是,reset不需要在一個時鐘周期內到達所有的FF。所以需要幾個時鐘才能把整個設計復位掉。每個模塊都需要包含如下代碼:
同步復位時鐘樹如下所示:
采用這種技術,同步復位信號可以像其他數(shù)據(jù)信號一樣處理,設計中每個模塊的timing分析都很容易,復位樹的每個階段都有合理的扇出。
6.2 異步復位樹
對異步復位,是通過復位同步器來完成復位樹的建立。即每個層級都加上一個異步復位同步器。如下圖所示:
異步復位樹和同步復位樹有點相似,但是這里的異步復位同步器是兩級的FF。這種異步復位樹,復位時可以所有的FF都同時復位,但是解復位必須要幾個cycle才能完成。
這種結構的問題就是,不同層級解復位的時間點可能是不一樣的。如果設計要求整個芯片在同一個cycle來解復位,那么就需要對復位同步器做平衡設計,保證到達每個復位終點是同一個時鐘。同步時鐘樹也存在這個問題。
使用這種結構的好處是,不用等到P&R之后才去手動調整timing,完全可以交給綜合工具(DC/PT)去插入buffer。
在使用異步重置時,至關重要的是,設計人員要在DC和PT中使用設置為適當設置的適當變量,以確保從復位同步觸發(fā)器的q-output驅動的異步復位得到緩沖(如果需要的話)和timed。有關這些設置的詳細信息可以在SolvNet文章#901989[43]中找到。文章指出,DC和PT都可以并且將時間按照本地時鐘進行異步復位輸入,如果設置了以下變量:
這些設置應該是Synopsys的默認設置(只要確保它們是環(huán)境設置)。正確設置這些標志和使用分布式復位同步器后,就可以不用類似時鐘樹去構建緩沖復位樹了。
7. 多時鐘域復位
對于多時鐘域的設計,每個時鐘域必須有自己單獨的復位同步器和分布式復位樹。這樣才能保證reset能滿足不用時鐘域的reset recovery time。如下圖所示:
對于多個時鐘域的解復位順序有兩種情況:
1)大部分多時鐘域的設計,解復位的順序并沒有特殊要求。即當前時鐘域解復位的時間點,在另一個時鐘域的精確時間點并不重要。通常來說,跨時鐘域的設計,本身就會帶來延時的不確定性。這種情況下,上面的單獨建立不同時鐘域的復位結構就足夠了。
2)有些多時鐘設計,復位解除必須按順序進行。這種設計,可以使用優(yōu)先級的復位結構如下所示:
這種結構,除了最高優(yōu)先級的同步器輸入是 tied 1, 其他的輸入都是上一優(yōu)先級的輸出。
8. 異步復位的DFT
在做DFT的時候,如果異步復位信號不能直接被I/O引腳驅動,就必須將異步復位信號和后面的的被驅動電路斷開,用來保證DFT掃描和測試能夠正確進行。兩個同步復位觸發(fā)器不應該包含在掃描鏈種,需要手動測試。
本文作者:烓圍瑋未。 主要從事ISP/MIPI/SOC/車規(guī)芯片設計
首發(fā)于知乎專欄:芯片設計進階之路
評論