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