什么是復(fù)位同步電路reset synchronizer?
下圖是一個(gè)最簡(jiǎn)單的復(fù)位同步電路。這個(gè)電路的輸出rstn_sync用作后續(xù)電路中D flip flop的復(fù)位信號(hào)。

這個(gè)電路的工作原理是:
-PorZ低電平,復(fù)位同步電路里的兩個(gè)D flip flop都被復(fù)位。電路的輸出rstn_sync為0,后續(xù)電路被復(fù)位。
-PorZ由低變高。clk上升沿到來時(shí),第一個(gè)D flip flop先變1。過一個(gè)周期,第二個(gè)D flip flop變1,rstn_sync變1,后續(xù)電路離開復(fù)位狀態(tài),開始正常工作。
-如果PorZ由低變高和clk上升沿離得很近,第一個(gè)D flip flop可能進(jìn)入亞穩(wěn)態(tài)(metastability)。不過沒關(guān)系,第二個(gè)D flip flop的輸出rstn_sync還是穩(wěn)定的。復(fù)位同步電路的主要功能就是保障rstn_sync是穩(wěn)定的0或1,在芯片的有生之年不發(fā)生亞穩(wěn)態(tài)(或亞穩(wěn)態(tài)的機(jī)率小到忽略不計(jì))。同時(shí),保障rstn_sync相對(duì)于clk有一個(gè)固定的時(shí)序關(guān)系。下面詳細(xì)討論。
為什么需要復(fù)位同步電路reset synchronizer?
這和D flip flop一個(gè)比較隱蔽的timing指標(biāo)有關(guān)– removal/recovery time。D flip flop對(duì)時(shí)鐘沿active edge和復(fù)位的release edge是有時(shí)序要求的。通常,D flip flop復(fù)位端的release edge必須要滯后時(shí)鐘active edge一段時(shí)間(removal time),而且還要超前下一個(gè)時(shí)鐘active edge一段時(shí)間(recovery time)。如果有違例,那這個(gè)D flip flop就會(huì)進(jìn)入亞穩(wěn)態(tài),在后仿中顯示為X。
復(fù)位同步電路reset synchronizer的輸出rstn_sync相對(duì)于時(shí)鐘clk有一個(gè)固定的時(shí)序關(guān)系。在PnR (place & route)中,工具構(gòu)造buffer tree去buffer rstn_sync,并算出buffer后rstn_sync到后續(xù)每個(gè)D flip flop復(fù)位端的時(shí)間,通過插入或調(diào)整buffer,保障后續(xù)電路中每一個(gè)D flip flop的復(fù)位端都滿足removal/recovery要求。反之,如果rstn_sync相對(duì)于時(shí)鐘clk沒有有一個(gè)固定的關(guān)系,那工具就無從下手了,也就無法保障removal/recovery要求了。
順便說一下,綜合工具是不查removal/recovery time的。如果復(fù)位電路上有錯(cuò),通常會(huì)在設(shè)計(jì)流程很后面才發(fā)現(xiàn),改起來代價(jià)也會(huì)高一些。所以一定要在一開始就重視復(fù)位電路。
為什么復(fù)位同步電路reset synchronizer自己不會(huì)進(jìn)入亞穩(wěn)態(tài)?
前面講了,第一級(jí)的D flip flop是有可能進(jìn)入亞穩(wěn)態(tài)。關(guān)鍵在于第二級(jí)。第二級(jí)的D輸入端在第一個(gè)clk到來的時(shí)刻仍是穩(wěn)定的低電平(第一級(jí)的輸出此時(shí)尚未變成亞穩(wěn)態(tài)X),第二級(jí)的的狀態(tài)不需要改變,仍舊保持原來復(fù)位后的0狀態(tài)。等到第二個(gè)clk到來的時(shí)候,如果第一級(jí)已經(jīng)不在亞穩(wěn)態(tài)了,第二級(jí)的D輸入就是一個(gè)穩(wěn)定的1,那第二級(jí)的輸出rstn_sync自然就變成穩(wěn)定的1了。即使第一級(jí)在第二個(gè)clk到來的時(shí)候沒有完全走出亞穩(wěn)態(tài),只要第一級(jí)的輸出不在中間值附近,第二級(jí)仍會(huì)把第一級(jí)的輸出當(dāng)成0或1,第二級(jí)的輸出rstn_sync也就因此為穩(wěn)定的0或1。這也就是為什么有時(shí)候復(fù)位同步電路reset synchronizer的latency是在1-3個(gè)時(shí)鐘之間。
有條件的同學(xué),不妨跑一下Spectre sim,觀察一下D flip flop內(nèi)部的信號(hào),加深removal/recovery time的理解。眼見為實(shí)。
如果兩個(gè)D flip flop還不夠MTBF指標(biāo)(發(fā)生亞穩(wěn)態(tài)的概率仍不夠小),可以再加第三級(jí)。
有些標(biāo)準(zhǔn)元庫(kù)中有專門的同步電路,synchronizer cell。應(yīng)該盡量使用這種synchronizer cell,比自己用兩個(gè)D flip flop搭更可靠。專門的synchronizer第二級(jí)是高增益的,大大降低第二級(jí)進(jìn)入亞穩(wěn)態(tài)的可能性。
復(fù)位同步電路reset synchronizer能加到掃描鏈里嗎?

這里加了兩個(gè)MUX,這樣可以讓工具把同步復(fù)位電路的兩個(gè)D flip flop連到scan chain里,增加test coverage。
使用復(fù)位同步電路reset synchronizer需要注意的地方
一個(gè)復(fù)位同步電路reset synchronizer只能用到一個(gè)時(shí)鐘域。如果有幾個(gè)不同步的時(shí)鐘域,就要考慮使用多個(gè)復(fù)位同步電路。同步的時(shí)鐘域可以考慮復(fù)用一個(gè)復(fù)位同步電路reset synchronizer,但要做得仔細(xì)一些。
復(fù)位同步電路reset synchronizer有什么弊病嗎
復(fù)位同步電路reset synchronizer其實(shí)只在復(fù)位信號(hào)release的時(shí)候派上用場(chǎng)。復(fù)位結(jié)束后,這個(gè)電路其實(shí)就沒用了。但這個(gè)電路的時(shí)鐘還在switch,這個(gè)電路還在耗電。如果是高速時(shí)鐘,這個(gè)耗電就可觀了。低功耗設(shè)計(jì),就要考慮是否可以關(guān)掉時(shí)鐘。這個(gè)根據(jù)不同場(chǎng)景,就非常復(fù)雜了,需要非常小心。
復(fù)位同步電路reset synchronizer是必須的嗎?
很多人通常不加思索一上來就加上同步復(fù)位電路reset synchronizer。這種條件反射本身是好習(xí)慣。
如果精益求精,那就要多思考一下了。有些場(chǎng)景是不需要復(fù)位同步電路reset synchronizer的。
復(fù)位的目的是讓電路有個(gè)明確的起始狀態(tài)。如果不需要明確的初始狀態(tài),而且電路跑一段時(shí)間后能清除所有不確定狀態(tài),進(jìn)入正常狀態(tài),那就可以考慮不用復(fù)位同步電路。例如FIR。如果使用場(chǎng)景中可以容忍初始輸出為垃圾,異步復(fù)位是可以的。
還有一個(gè)被99%的設(shè)計(jì)者忽略的場(chǎng)景。如果復(fù)位信號(hào)release的時(shí)候,時(shí)鐘還沒有啟動(dòng),那就根本不需要復(fù)位同步電路reset synchronizer。很多時(shí)候,芯片是內(nèi)部oscillator, PLL提供時(shí)鐘的。而oscillator, PLL啟動(dòng)都需要時(shí)間的。如果復(fù)位在這段時(shí)間內(nèi)release,那就不需要同步復(fù)位電路reset synchronizer了。在低功耗設(shè)計(jì)中,尤其是多個(gè)內(nèi)部時(shí)鐘域的場(chǎng)景,省下的功耗就可觀了。當(dāng)然,設(shè)計(jì)要做得非常仔細(xì)。
還有一個(gè)場(chǎng)景就是內(nèi)部產(chǎn)生的復(fù)位信號(hào)。做得精妙的設(shè)計(jì),可以保證在內(nèi)部復(fù)位release的時(shí)候沒有時(shí)鐘,也就不需要什么復(fù)位同步電路reset synchronizer了。內(nèi)部產(chǎn)生復(fù)位信號(hào)是一個(gè)很有效的設(shè)計(jì)技巧。這個(gè)技巧復(fù)用現(xiàn)成的reset network同時(shí)將很多D flip flop清零,省去了在D flip flop的D輸入邏輯(D input logic cone)加上清零條件,可以節(jié)省很多門。
復(fù)位同步電路reset synchronizer在RTL里的實(shí)現(xiàn)
通常做成一個(gè)單獨(dú)的module,在主設(shè)計(jì)中例化這個(gè)module。
好了,希望復(fù)位同步講全面了。
審核編輯:黃飛
-
pll
+關(guān)注
關(guān)注
6文章
982瀏覽量
138180 -
復(fù)位電路
+關(guān)注
關(guān)注
13文章
332瀏覽量
45869 -
低電平
+關(guān)注
關(guān)注
1文章
238瀏覽量
13987 -
復(fù)位信號(hào)
+關(guān)注
關(guān)注
0文章
70瀏覽量
6817
發(fā)布評(píng)論請(qǐng)先 登錄
Xilinx FPGA異步復(fù)位同步釋放—同步后的復(fù)位該當(dāng)作同步復(fù)位還是異步復(fù)位?
為什么需要復(fù)位電路?漫談復(fù)位reset
同步復(fù)位sync和異步復(fù)位async
同步復(fù)位和異步復(fù)位的比較(轉(zhuǎn)載)
請(qǐng)問一下Reset信號(hào)如何實(shí)現(xiàn)同步呢
HT66Fx0系列MCU的Reset復(fù)位電路應(yīng)用介紹
復(fù)位穩(wěn)定放大器:The Reset Stabilized A
如何區(qū)分同步復(fù)位和異步復(fù)位?
同步復(fù)位和異步復(fù)位電路簡(jiǎn)介
詳細(xì)講解同步后的復(fù)位是同步復(fù)位還是異步復(fù)位?
STM32下載后無法自動(dòng)復(fù)位,需手動(dòng)復(fù)位 下載程序時(shí),勾選reset and run后仍不可自動(dòng)復(fù)位
什么是復(fù)位同步電路 reset synchronizer?
評(píng)論