什么是復(fù)位同步電路reset synchronizer?
下圖是一個最簡單的復(fù)位同步電路。這個電路的輸出rstn_sync用作后續(xù)電路中D flip flop的復(fù)位信號。
這個電路的工作原理是:
-PorZ低電平,復(fù)位同步電路里的兩個D flip flop都被復(fù)位。電路的輸出rstn_sync為0,后續(xù)電路被復(fù)位。
-PorZ由低變高。clk上升沿到來時,第一個D flip flop先變1。過一個周期,第二個D flip flop變1,rstn_sync變1,后續(xù)電路離開復(fù)位狀態(tài),開始正常工作。
-如果PorZ由低變高和clk上升沿離得很近,第一個D flip flop可能進入亞穩(wěn)態(tài)(metastability)。不過沒關(guān)系,第二個D flip flop的輸出rstn_sync還是穩(wěn)定的。復(fù)位同步電路的主要功能就是保障rstn_sync是穩(wěn)定的0或1,在芯片的有生之年不發(fā)生亞穩(wěn)態(tài)(或亞穩(wěn)態(tài)的機率小到忽略不計)。同時,保障rstn_sync相對于clk有一個固定的時序關(guān)系。下面詳細討論。
為什么需要復(fù)位同步電路reset synchronizer?
這和D flip flop一個比較隱蔽的timing指標有關(guān)– removal/recovery time。D flip flop對時鐘沿active edge和復(fù)位的release edge是有時序要求的。通常,D flip flop復(fù)位端的release edge必須要滯后時鐘active edge一段時間(removal time),而且還要超前下一個時鐘active edge一段時間(recovery time)。如果有違例,那這個D flip flop就會進入亞穩(wěn)態(tài),在后仿中顯示為X。
復(fù)位同步電路reset synchronizer的輸出rstn_sync相對于時鐘clk有一個固定的時序關(guān)系。在PnR (place & route)中,工具構(gòu)造buffer tree去buffer rstn_sync,并算出buffer后rstn_sync到后續(xù)每個D flip flop復(fù)位端的時間,通過插入或調(diào)整buffer,保障后續(xù)電路中每一個D flip flop的復(fù)位端都滿足removal/recovery要求。反之,如果rstn_sync相對于時鐘clk沒有有一個固定的關(guān)系,那工具就無從下手了,也就無法保障removal/recovery要求了。
順便說一下,綜合工具是不查removal/recovery time的。如果復(fù)位電路上有錯,通常會在設(shè)計流程很后面才發(fā)現(xiàn),改起來代價也會高一些。所以一定要在一開始就重視復(fù)位電路。
為什么復(fù)位同步電路reset synchronizer自己不會進入亞穩(wěn)態(tài)?
前面講了,第一級的D flip flop是有可能進入亞穩(wěn)態(tài)。關(guān)鍵在于第二級。第二級的D輸入端在第一個clk到來的時刻仍是穩(wěn)定的低電平(第一級的輸出此時尚未變成亞穩(wěn)態(tài)X),第二級的的狀態(tài)不需要改變,仍舊保持原來復(fù)位后的0狀態(tài)。等到第二個clk到來的時候,如果第一級已經(jīng)不在亞穩(wěn)態(tài)了,第二級的D輸入就是一個穩(wěn)定的1,那第二級的輸出rstn_sync自然就變成穩(wěn)定的1了。即使第一級在第二個clk到來的時候沒有完全走出亞穩(wěn)態(tài),只要第一級的輸出不在中間值附近,第二級仍會把第一級的輸出當成0或1,第二級的輸出rstn_sync也就因此為穩(wěn)定的0或1。這也就是為什么有時候復(fù)位同步電路reset synchronizer的latency是在1-3個時鐘之間。
有條件的同學,不妨跑一下Spectre sim,觀察一下D flip flop內(nèi)部的信號,加深removal/recovery time的理解。眼見為實。
如果兩個D flip flop還不夠MTBF指標(發(fā)生亞穩(wěn)態(tài)的概率仍不夠?。梢栽偌拥谌?。
有些標準元庫中有專門的同步電路,synchronizer cell。應(yīng)該盡量使用這種synchronizer cell,比自己用兩個D flip flop搭更可靠。專門的synchronizer第二級是高增益的,大大降低第二級進入亞穩(wěn)態(tài)的可能性。
復(fù)位同步電路reset synchronizer能加到掃描鏈里嗎?
這里加了兩個MUX,這樣可以讓工具把同步復(fù)位電路的兩個D flip flop連到scan chain里,增加test coverage。
使用復(fù)位同步電路reset synchronizer需要注意的地方
一個復(fù)位同步電路reset synchronizer只能用到一個時鐘域。如果有幾個不同步的時鐘域,就要考慮使用多個復(fù)位同步電路。同步的時鐘域可以考慮復(fù)用一個復(fù)位同步電路reset synchronizer,但要做得仔細一些。
復(fù)位同步電路reset synchronizer有什么弊病嗎
復(fù)位同步電路reset synchronizer其實只在復(fù)位信號release的時候派上用場。復(fù)位結(jié)束后,這個電路其實就沒用了。但這個電路的時鐘還在switch,這個電路還在耗電。如果是高速時鐘,這個耗電就可觀了。低功耗設(shè)計,就要考慮是否可以關(guān)掉時鐘。這個根據(jù)不同場景,就非常復(fù)雜了,需要非常小心。
復(fù)位同步電路reset synchronizer是必須的嗎?
很多人通常不加思索一上來就加上同步復(fù)位電路reset synchronizer。這種條件反射本身是好習慣。
如果精益求精,那就要多思考一下了。有些場景是不需要復(fù)位同步電路reset synchronizer的。
復(fù)位的目的是讓電路有個明確的起始狀態(tài)。如果不需要明確的初始狀態(tài),而且電路跑一段時間后能清除所有不確定狀態(tài),進入正常狀態(tài),那就可以考慮不用復(fù)位同步電路。例如FIR。如果使用場景中可以容忍初始輸出為垃圾,異步復(fù)位是可以的。
還有一個被99%的設(shè)計者忽略的場景。如果復(fù)位信號release的時候,時鐘還沒有啟動,那就根本不需要復(fù)位同步電路reset synchronizer。很多時候,芯片是內(nèi)部oscillator, PLL提供時鐘的。而oscillator, PLL啟動都需要時間的。如果復(fù)位在這段時間內(nèi)release,那就不需要同步復(fù)位電路reset synchronizer了。在低功耗設(shè)計中,尤其是多個內(nèi)部時鐘域的場景,省下的功耗就可觀了。當然,設(shè)計要做得非常仔細。
還有一個場景就是內(nèi)部產(chǎn)生的復(fù)位信號。做得精妙的設(shè)計,可以保證在內(nèi)部復(fù)位release的時候沒有時鐘,也就不需要什么復(fù)位同步電路reset synchronizer了。內(nèi)部產(chǎn)生復(fù)位信號是一個很有效的設(shè)計技巧。這個技巧復(fù)用現(xiàn)成的reset network同時將很多D flip flop清零,省去了在D flip flop的D輸入邏輯(D input logic cone)加上清零條件,可以節(jié)省很多門。
復(fù)位同步電路reset synchronizer在RTL里的實現(xiàn)
通常做成一個單獨的module,在主設(shè)計中例化這個module。
好了,希望復(fù)位同步講全面了。
審核編輯:黃飛
-
pll
+關(guān)注
關(guān)注
6文章
776瀏覽量
135130 -
復(fù)位電路
+關(guān)注
關(guān)注
13文章
322瀏覽量
44586 -
低電平
+關(guān)注
關(guān)注
1文章
115瀏覽量
13269 -
復(fù)位信號
+關(guān)注
關(guān)注
0文章
54瀏覽量
6314
發(fā)布評論請先 登錄
相關(guān)推薦
評論