經(jīng)常在面試時(shí)問(wèn)到一個(gè)問(wèn)題:對(duì)于芯片中的復(fù)位信號(hào)我們通常會(huì)有哪些特殊處理?這個(gè)時(shí)候我一般希望得到的回答包括:復(fù)位消抖、異步復(fù)位同步撤離、降頻復(fù)位、關(guān)斷時(shí)鐘復(fù)位和復(fù)位保護(hù)等處理方案。
復(fù)位消抖
這篇文章就先聊下復(fù)位消抖,在開(kāi)始之前先說(shuō)明一下因?yàn)槲业慕?jīng)驗(yàn)有限且很多是道聽(tīng)途說(shuō),所以文中難免有所疏漏和錯(cuò)誤,請(qǐng)大家不吝賜教。
復(fù)位信號(hào)在使用前一般需要進(jìn)行消抖處理,也稱為復(fù)位濾毛刺。復(fù)位的抖動(dòng)可能會(huì)導(dǎo)致芯片產(chǎn)生多次復(fù)位動(dòng)作,給系統(tǒng)帶來(lái)不確定性和誤差。消抖的目的是為了確保復(fù)位信號(hào)的穩(wěn)定性和可靠性,從而保證系統(tǒng)能夠正常工作。通過(guò)消抖,可以消除復(fù)位信號(hào)的抖動(dòng)干擾,保證復(fù)位信號(hào)的可靠性和穩(wěn)定性,避免系統(tǒng)故障和數(shù)據(jù)丟失等問(wèn)題。
舉個(gè)例子,如果要消除30ns以下的復(fù)位抖動(dòng),那么30ns以下的復(fù)位信號(hào)rst_n拉低操作就會(huì)被消抖電路消除,不會(huì)對(duì)電路產(chǎn)生任何的影響,只有30ns以上的復(fù)位拉低操作才能作用于內(nèi)部電路。
所以復(fù)位消抖電路具體長(zhǎng)什么樣子呢?目前我了解的有三種方式,不過(guò)因?yàn)闆](méi)有實(shí)際參與過(guò)CRG模塊的設(shè)計(jì)與流片,所以以下內(nèi)容只做參考。我們假定濾毛刺時(shí)鐘為100M,需要濾除的復(fù)位抖動(dòng)為30ns以下的信號(hào)。
第一種方式通過(guò)濾毛刺時(shí)鐘+D觸發(fā)器來(lái)完成,如要濾過(guò)30ns的抖動(dòng)電路圖如下:
D觸發(fā)器的數(shù)量關(guān)系是如何得到的呢?先假設(shè)我只有一個(gè)延時(shí)D觸發(fā)器,那么復(fù)位信號(hào)必須維持L電平在一個(gè)clk時(shí)鐘周期以上或門(mén)才能在時(shí)鐘沿處打出一個(gè)L信號(hào)出來(lái)(即時(shí)鐘上升沿時(shí)rst_n || rst_n_ff1 == 1'b0),如下面的波形圖所示:
同樣的,如果有兩個(gè)延時(shí)D觸發(fā)器,那么復(fù)位信號(hào)必須維持L電平在兩個(gè)clk時(shí)鐘周期以上,或門(mén)才能在時(shí)鐘沿處打出一個(gè)L信號(hào)出來(lái):
如果有三個(gè)延時(shí)D觸發(fā)器,那么復(fù)位信號(hào)必須維持L電平在三個(gè)clk時(shí)鐘周期以上,或門(mén)才能在時(shí)鐘沿處打出一個(gè)L信號(hào)出來(lái):
因此,在或們前放置了N個(gè)延時(shí)D觸發(fā)器,就可以濾除N*T(T為消抖時(shí)鐘的周期)時(shí)長(zhǎng)以下的復(fù)位毛刺信號(hào)。這種方式存在一個(gè)巨大隱患,消抖時(shí)鐘信號(hào)是不受復(fù)位控制的,一旦消抖時(shí)鐘信號(hào)出了什么問(wèn)題,復(fù)位信號(hào)將永遠(yuǎn)無(wú)法從消抖電路傳遞出去。
第二種方式通過(guò)累加器來(lái)完成,簡(jiǎn)單來(lái)說(shuō)就是數(shù)一下rst_n連續(xù)出現(xiàn)了多少拍,假如需要通過(guò)100M消抖時(shí)鐘來(lái)濾除100ns以下的復(fù)位抖動(dòng),那么rst_n要連續(xù)出現(xiàn)10拍低電平才達(dá)到100ns的復(fù)位標(biāo)準(zhǔn)。將rst_n打兩拍rst_n_ff1/rst_n_ff2消除亞穩(wěn)態(tài),當(dāng)rst_n_ff2持續(xù)達(dá)到10拍對(duì)外輸出復(fù)位信號(hào),對(duì)應(yīng)的波形示意如下:
這個(gè)消抖方案呢同樣存在上面的問(wèn)題,消抖時(shí)鐘信號(hào)是不受復(fù)位控制的,所以在芯片內(nèi)的模塊級(jí)別可能會(huì)被采用,但是在外部復(fù)位消抖時(shí)是一般不會(huì)使用的。
第三種方式是通過(guò)延時(shí)器件來(lái)實(shí)現(xiàn),要濾去100ns以下毛刺,那么就引入100ns延時(shí)器件,組成如下電路:
對(duì)應(yīng)的波形也很簡(jiǎn)單:
通過(guò)波形可以看出,如果復(fù)位時(shí)長(zhǎng)不夠100ns,prst_n根本不會(huì)被觸發(fā)。這個(gè)電路的隱患在于如何保證延時(shí)器件在不同溫度等外部環(huán)境干擾下的延時(shí)準(zhǔn)確性。
異步復(fù)位,同步撤離
對(duì)于使用異步復(fù)位的系統(tǒng),低電平復(fù)位系統(tǒng)時(shí)復(fù)位信號(hào)是允許不與工作時(shí)鐘對(duì)齊的即純純異步復(fù)位;但是在復(fù)位撤離時(shí),需要與工作時(shí)鐘對(duì)齊,即滿足removal time要求(在時(shí)鐘有效沿來(lái)臨之后,異步復(fù)位信號(hào)需要繼續(xù)保持有效的最短時(shí)間),或者說(shuō)復(fù)位的撤離行為是受到時(shí)鐘控制的。
既然都已經(jīng)是異步復(fù)位了,為何還要多此一舉呢?
1.對(duì)于復(fù)位這個(gè)操作行為而言,純異步處理是完全可以的,因?yàn)樗械?a target="_blank">元器件都會(huì)最終回到初始值。當(dāng)然了,這里指的是整體復(fù)位或者說(shuō)帶保護(hù)的局部復(fù)位。你別管這些寄存器誰(shuí)先復(fù)位誰(shuí)后復(fù)位誰(shuí)出現(xiàn)亞穩(wěn)態(tài)了,只要不是著火了最后都會(huì)回到復(fù)位值。就像電視劇里說(shuō)的“反正早晚都是沒(méi),早沒(méi)晚沒(méi)又有什么區(qū)別呢”。所以異步復(fù)位出電路是沒(méi)有任何問(wèn)題的。
2.但是對(duì)于復(fù)位撤銷(xiāo)這個(gè)行為就不一樣了。一旦復(fù)位撤銷(xiāo)了各個(gè)元器件就會(huì)開(kāi)始工作了,但是復(fù)位信號(hào)如果是純異步的打到某個(gè)寄存器接口上的時(shí)候可能就撞到亞穩(wěn)態(tài)窗口上了(不滿足removal time),亞穩(wěn)態(tài)就會(huì)在電路里開(kāi)始蔓延搗亂,出現(xiàn)什么情況可就難說(shuō)了。所以復(fù)位撤離這個(gè)事必須得是受到時(shí)鐘控制的,不能是純異步電路。
這里有一點(diǎn)要注意哈,同步撤離這個(gè)操作解決的是異步復(fù)位可能的亞穩(wěn)態(tài)問(wèn)題,并不是說(shuō)能夠保證所有的寄存器在同一時(shí)間收到復(fù)位撤離的操作。這個(gè)事就類(lèi)似與信號(hào)打3拍同步一樣,咱們先解決亞穩(wěn)態(tài)問(wèn)題,再處理信號(hào)傳的對(duì)不對(duì)的問(wèn)題。通過(guò)異步復(fù)位同步撤離先確保沒(méi)有亞穩(wěn)態(tài),再處理寄存器不能在同一拍接收到復(fù)位撤銷(xiāo)導(dǎo)致錯(cuò)誤的問(wèn)題。
如何做到異步復(fù)位同步撤離呢?請(qǐng)看下面這個(gè)電路:
rst_n經(jīng)過(guò)濾波后得到prst_n,因此我們只需要分析prst_n的行為影響即可。
正常工作狀態(tài)下,prst_n==1;
異步復(fù)位時(shí)prst_n由1跳轉(zhuǎn)為0,兩個(gè)D觸發(fā)器立刻被復(fù)位。也就是說(shuō)rst_work_n會(huì)立即下拉至低電平復(fù)位系統(tǒng),這個(gè)下拉顯然時(shí)候不受時(shí)鐘控制的,因此實(shí)現(xiàn)了異步復(fù)位;
復(fù)位撤離時(shí)prst_n由0跳轉(zhuǎn)為1,兩個(gè)D觸發(fā)器的復(fù)位被撤銷(xiāo)了開(kāi)始正常工作。但是高電平需要兩個(gè)周期才會(huì)到達(dá)rst_work_n端,這兩個(gè)周期足以消除復(fù)位帶來(lái)的亞穩(wěn)態(tài)并且保證系統(tǒng)感知的復(fù)位rst_work_n在時(shí)鐘沿上,因此實(shí)現(xiàn)了同步撤銷(xiāo);
借助于這個(gè)電路設(shè)計(jì),系統(tǒng)的異步復(fù)位同步撤離功能就實(shí)現(xiàn)了。不過(guò)當(dāng)年我還問(wèn)了大佬一個(gè)問(wèn)題:這樣的話系統(tǒng)就延時(shí)了2個(gè)周期才復(fù)位的啊,會(huì)不會(huì)有bug?
大佬的回答是這樣的:你這啥系統(tǒng)啊真的在乎這一兩個(gè)周期的事么?早跑幾周期晚跑幾周期有啥關(guān)系,只要?jiǎng)e跑錯(cuò)了就行!
解復(fù)位的特殊處理
解復(fù)位就是復(fù)位撤離,系統(tǒng)解復(fù)位就是復(fù)位結(jié)束了系統(tǒng)準(zhǔn)備開(kāi)始工作。
前文咱們提過(guò),復(fù)位撤離比復(fù)位要復(fù)雜一些,因?yàn)閺?fù)位了大家就是一起回到初始狀態(tài)去,寄存器也不采樣了,有什么毛刺啊亞穩(wěn)態(tài)啊只要不影響其他系統(tǒng)(這個(gè)之后講)都沒(méi)關(guān)系的。這就相當(dāng)于晚上回家上床準(zhǔn)備上床睡覺(jué),你愛(ài)穿啥衣服睡就穿啥衣服不穿也沒(méi)人管。但是解復(fù)位就不一樣了,這就是起床要出門(mén)上班了,怎么著也得準(zhǔn)備好才能出去工作,不能穿著秋褲就往外跑。
所以的對(duì)于解復(fù)位(其實(shí)也不光是解復(fù)位,局部復(fù)位本身也很危險(xiǎn))就需要做跟多的額外工作了,上一篇說(shuō)的同步撤離之后,還有什么問(wèn)題需要解決呢?
主要是復(fù)位信號(hào)到達(dá)各個(gè)寄存器的時(shí)間不一致的問(wèn)題。復(fù)位信號(hào)在系統(tǒng)內(nèi)是有很大的扇出的,連接到所有需要復(fù)位的寄存器的復(fù)位端。這也就導(dǎo)致了復(fù)位在系統(tǒng)中的走線特別長(zhǎng),過(guò)長(zhǎng)的走線又會(huì)導(dǎo)致工具在復(fù)位信號(hào)上增加buffer以提升驅(qū)動(dòng)能力,那么如果時(shí)鐘頻率很高,復(fù)位信號(hào)最終到達(dá)各個(gè)寄存器的時(shí)間也就無(wú)法保證在同一拍。
復(fù)位走線到達(dá)各個(gè)寄存器不在同一拍會(huì)有什么后果呢?這個(gè)不能一概而論。對(duì)于一些復(fù)位解除后就開(kāi)始工作的電路系統(tǒng)比如自動(dòng)計(jì)數(shù)取指模塊,各個(gè)寄存器之間可能存在依賴關(guān)系,如果只部分寄存器被復(fù)位或解復(fù)位,可能會(huì)導(dǎo)致不一致的狀態(tài),從而影響系統(tǒng)的正確運(yùn)行。同時(shí)呢,如果復(fù)位方案做的不好,某系統(tǒng)進(jìn)行復(fù)位時(shí)一部分復(fù)位了一部分沒(méi)有復(fù)位,也可能會(huì)產(chǎn)生毛刺被未復(fù)位的寄存器采樣,進(jìn)而輸出使能影響到其他系統(tǒng)的正常工作。
總之呢,復(fù)位走線到各個(gè)寄存器不在同一拍,可能存在系統(tǒng)穩(wěn)定性的風(fēng)險(xiǎn)。因此在對(duì)復(fù)位還需要對(duì)系統(tǒng)的復(fù)位做一些特殊的處理。特殊的處理有哪些呢,不同的團(tuán)隊(duì)也有多種多樣的選擇,這里列舉一些我所聽(tīng)聞過(guò)的方案吧。
降頻后復(fù)位。
先把時(shí)鐘降頻,再進(jìn)行復(fù)位和解復(fù)位的操作,再提頻回正常工作時(shí)鐘頻率。你不是怕復(fù)位走線到各個(gè)寄存器的時(shí)間不一致導(dǎo)致不在同一拍復(fù)位嗎?那好,我把時(shí)鐘降頻總可以吧,1GHz太快了降到500M,500M還快降到100M,100M還快到10M總可以了吧,一個(gè)周期這么長(zhǎng)時(shí)間足夠你復(fù)位信號(hào)慢慢溜達(dá)到各個(gè)寄存器的。所以采用這種方案時(shí),會(huì)在復(fù)位前將工作時(shí)鐘32分頻或者64分頻(取決于系統(tǒng)的面積和工作時(shí)鐘,可以算的),然后進(jìn)行復(fù)位和解復(fù)位,之后在將時(shí)鐘提頻至工作狀態(tài)。
這種方案下,可以在sdc中將復(fù)位信號(hào)設(shè)置為multicycle,檢查其在64個(gè)時(shí)鐘周期內(nèi)能夠作用到所有的寄存器復(fù)位端。
**關(guān)時(shí)鐘后復(fù)位。**
這個(gè)方法更徹底,怕各個(gè)寄存器看到復(fù)位和解復(fù)位的時(shí)間不一致導(dǎo)致功能錯(cuò)亂?那直接把工作時(shí)鐘給關(guān)斷不久好了,反正是異步復(fù)位不用擔(dān)心沒(méi)有時(shí)鐘復(fù)位信號(hào)作用不到寄存器端。時(shí)鐘一關(guān)所有寄存器相當(dāng)于原地停工,這個(gè)時(shí)候別說(shuō)復(fù)位信號(hào)了,啥信號(hào)過(guò)來(lái)都沒(méi)事,寄存器都不干了嘛。所以此時(shí)復(fù)位信號(hào)的走線也就不稱問(wèn)題了,先復(fù)位再慢慢悠悠的解復(fù)位,都搞定了歇一會(huì)再把時(shí)鐘打開(kāi)。
這種方案下,可以在sdc中將復(fù)位信號(hào)設(shè)置為false_path,畢竟相當(dāng)于準(zhǔn)靜態(tài)的信號(hào),工作時(shí)復(fù)位信號(hào)不會(huì)跳變。
復(fù)位保護(hù)。
這個(gè)方法的思路是,不是擔(dān)心我這塊的復(fù)位影響其他系統(tǒng)工作嘛,那么不去處理復(fù)位和時(shí)鐘,而是把系統(tǒng)裹起來(lái)。怎么裹起來(lái)呢,把所有的對(duì)外輸出使能啊、握手啊這類(lèi)信號(hào)都先和低電平與在一起,保證不管一會(huì)發(fā)生啥事,都不會(huì)有關(guān)鍵信號(hào)發(fā)生跳變。保護(hù)好之后,再去拉復(fù)位信號(hào),過(guò)一會(huì)再解復(fù)位,再等會(huì)時(shí)間等系統(tǒng)穩(wěn)定下來(lái)了,再把保護(hù)電路解除開(kāi)始正常工作。
這種方案下,也可以在sdc中將復(fù)位信號(hào)設(shè)置為false_path。
復(fù)位之后等待一定時(shí)間再開(kāi)始下任務(wù)。
這個(gè)方案更多的是在任務(wù)層面看,也就是說(shuō)面對(duì)解復(fù)位后可能存在的系統(tǒng)不穩(wěn)定性,先不要著急下任務(wù)下配置下指令,而是等待一定時(shí)間等系統(tǒng)中可能存在的不穩(wěn)定狀態(tài)都結(jié)束了,再開(kāi)始進(jìn)入工作模式去下任務(wù)。
當(dāng)然了不是說(shuō)所有系統(tǒng)都適用以上的方法,比如某個(gè)系統(tǒng)確實(shí)是解復(fù)位后就立即開(kāi)始工作,那用復(fù)位保護(hù)就沒(méi)效果,因?yàn)槟銉?nèi)部狀態(tài)都亂了保護(hù)其他系統(tǒng)還有啥用呢。所以說(shuō)還是具體問(wèn)題具體分析吧,以上也只是經(jīng)驗(yàn)之談難免有所疏漏。
典型的軟復(fù)位流程
在聊到復(fù)位的時(shí)候總會(huì)區(qū)分兩個(gè)概念:硬復(fù)位和軟復(fù)位。
硬復(fù)位就是通常所說(shuō)的復(fù)位,是通過(guò)硬件電路或者特殊的硬件信號(hào)來(lái)觸發(fā)的復(fù)位過(guò)程。當(dāng)拉低外部復(fù)位信號(hào)時(shí)硬復(fù)位被觸發(fā),復(fù)位線會(huì)直接影響系統(tǒng)的硬件電路與寄存器,將系統(tǒng)的內(nèi)部狀態(tài)恢復(fù)到一個(gè)已知的初始狀態(tài)。硬復(fù)位通常是由外部的控制電路或者特定的硬件引腳來(lái)觸發(fā),例如按下一個(gè)復(fù)位按鈕或者通過(guò)特定的電路邏輯條件。
軟復(fù)位是通過(guò)軟件的程序代碼或者寄存器配置等方式觸發(fā)的復(fù)位過(guò)程。當(dāng)軟復(fù)位被觸發(fā)時(shí),系統(tǒng)一般需要執(zhí)行特定的步驟來(lái)響應(yīng)軟復(fù)位需求,確認(rèn)進(jìn)入待復(fù)位狀態(tài)后才會(huì)進(jìn)入復(fù)位流程,將系統(tǒng)的內(nèi)部狀態(tài)恢復(fù)到一個(gè)已知的初始狀態(tài)。軟復(fù)位通常是在程序執(zhí)行中的某個(gè)特定條件下發(fā)生,例如檢測(cè)到一個(gè)錯(cuò)誤或者需要重新初始化系統(tǒng)時(shí)。
硬復(fù)位一般是整芯片甚至芯片組復(fù)位,這個(gè)過(guò)程可以說(shuō)是比較簡(jiǎn)單粗暴的。而軟復(fù)位一般是芯片的部分系統(tǒng)進(jìn)行復(fù)位重啟,有時(shí)也稱為快速?gòu)?fù)位、動(dòng)態(tài)復(fù)位、配置復(fù)位,大多是通過(guò)一系列的流程來(lái)完成的。
本篇中就聊一聊典型的系統(tǒng)軟復(fù)位流程。
1.觸發(fā)軟復(fù)位啟動(dòng)條件。這一般是系統(tǒng)內(nèi)部或SOC出現(xiàn)了致命的錯(cuò)誤比如任務(wù)執(zhí)行超時(shí)、總線數(shù)據(jù)錯(cuò)誤或安全機(jī)制報(bào)錯(cuò)等,上位的MCU或者CPU判斷需要對(duì)該系統(tǒng)進(jìn)行軟復(fù)位操作以恢復(fù)功能;
2.停止下發(fā)任務(wù)。判斷需要對(duì)系統(tǒng)軟復(fù)位后,應(yīng)當(dāng)從任務(wù)層停止下發(fā)新的任務(wù),避免系統(tǒng)錯(cuò)誤進(jìn)一步的蔓延影響其他進(jìn)程;
3.下達(dá)軟復(fù)位請(qǐng)求。請(qǐng)求可能通過(guò)配置系統(tǒng)的寄存器或者從控制接口下發(fā)使能信號(hào);
4.系統(tǒng)接收到軟復(fù)位的請(qǐng)求后,需要做出一系列的處理。這時(shí)一般有兩種方向選擇,一種是主動(dòng)停止工作,比如停止執(zhí)行接下來(lái)的取指、在指令或者卷積層邊界停止進(jìn)一步的計(jì)算;另一種是被動(dòng)停止工作,也就是內(nèi)部邏輯不停止工作,而通過(guò)系統(tǒng)邊界的模塊響應(yīng)軟復(fù)位,進(jìn)而對(duì)內(nèi)部通路進(jìn)行阻塞或者假握手假接收等行為使內(nèi)部被動(dòng)停止工作。
5.系統(tǒng)邊界的模塊監(jiān)聽(tīng)所有通路,等待所有已經(jīng)發(fā)出的請(qǐng)求全部收回應(yīng)答(典型的比如AW請(qǐng)求收回Bresp,AR請(qǐng)求收回Rdata),這樣做的目的是避免本系統(tǒng)的復(fù)位對(duì)SOC或其他系統(tǒng)產(chǎn)生影響,也避免對(duì)解除復(fù)位后的本系統(tǒng)產(chǎn)生影響(如未收全,本系統(tǒng)復(fù)位解除后總線返回了一筆復(fù)位前的Bresp,那本系統(tǒng)直接就亂了);
6.邊界的模塊收全所有應(yīng)有的返回信息后,或者未能收全但是到達(dá)超時(shí)閾值后,系統(tǒng)進(jìn)入待復(fù)位狀態(tài);
7.此時(shí)如果本系統(tǒng)仍然保留著訪問(wèn)DDR和sram的備份通路,那么上位機(jī)可以通過(guò)配置寄存器去間接訪問(wèn)內(nèi)存和寄存器進(jìn)行保留現(xiàn)場(chǎng)。如果沒(méi)有規(guī)劃該功能,則略過(guò)這一步驟;
8.上位機(jī)配置復(fù)位保護(hù)寄存器使能復(fù)位保護(hù)電路,避免系統(tǒng)復(fù)位過(guò)程中有毛刺或者使能信號(hào)擴(kuò)散到總線或其他系統(tǒng);
9.上位機(jī)配置對(duì)系統(tǒng)進(jìn)行時(shí)鐘降配或者關(guān)斷時(shí)鐘等操作,這個(gè)是可選操作,一般來(lái)說(shuō)如果復(fù)位保護(hù)做的比較嚴(yán)格,這里不對(duì)時(shí)鐘進(jìn)行處理也沒(méi)關(guān)系;
10.配置復(fù)位或拉低系統(tǒng)的復(fù)位信號(hào),持續(xù)一段時(shí)間,這個(gè)時(shí)間沒(méi)有太嚴(yán)格的要求,按毫秒計(jì)時(shí)也沒(méi)有關(guān)系,少的話也得幾十拍確保系統(tǒng)內(nèi)所有寄存器都完成了復(fù)位;
11.復(fù)位已經(jīng)完成,之后配置解復(fù)位或拉高系統(tǒng)的復(fù)位信號(hào),解除系統(tǒng)的復(fù)位狀態(tài),之后等待一段時(shí)間等內(nèi)部電路穩(wěn)定下來(lái);
12.配置時(shí)鐘恢復(fù)工作頻率或恢復(fù)時(shí)鐘,可選;
13.配置復(fù)位保護(hù)寄存器解除復(fù)位保護(hù),恢復(fù)總線連接;
14.可以再等待一段時(shí)間后,重新下任務(wù)或恢復(fù)現(xiàn)場(chǎng),重啟系統(tǒng)完成。
軟復(fù)位的流程沒(méi)有特別嚴(yán)格的規(guī)定,通常是根據(jù)芯片的需求而規(guī)劃,上面所述也只是經(jīng)驗(yàn)之談。不過(guò)大抵都遵循停任務(wù) - 收應(yīng)答 - 斷連接 - 復(fù)位 - 解復(fù)位 - 重連接 - 下任務(wù)的思路。
復(fù)位保護(hù)電路
前面提到了,在一些系統(tǒng)中會(huì)通過(guò)復(fù)位保護(hù)的方式來(lái)避免復(fù)位過(guò)程中的“亂象”,所以本章就針對(duì)復(fù)位保護(hù)多聊一下。
復(fù)位保護(hù)電路,是在系統(tǒng)進(jìn)行復(fù)位的過(guò)程中對(duì)接口進(jìn)行硬性邏輯保護(hù),避免毛刺和錯(cuò)誤對(duì)周?chē)到y(tǒng)產(chǎn)生影響的模塊。通常而言,復(fù)位保護(hù)電路的開(kāi)啟應(yīng)該在復(fù)位之前,關(guān)閉應(yīng)該在復(fù)位撤離之后。咱們針對(duì)握手接口來(lái)分類(lèi)看下如何進(jìn)行復(fù)位保護(hù)(使能接口也類(lèi)似)。
對(duì)外輸出valid。
在復(fù)位期間由于復(fù)位信號(hào)到達(dá)不同寄存器的時(shí)間不同,加之組合邏輯路徑,可能會(huì)產(chǎn)生錯(cuò)誤的valid信號(hào)對(duì)外輸出。顯然在本系統(tǒng)單獨(dú)復(fù)位的場(chǎng)景下,是不應(yīng)該有對(duì)外的valid輸出的,因此在復(fù)位前,需要將對(duì)外輸出的valid信號(hào)&&0操作,確保復(fù)位和解復(fù)位期間沒(méi)有valid誤觸發(fā)。
對(duì)內(nèi)輸入的ready。
進(jìn)入復(fù)位的階段,對(duì)內(nèi)輸入的ready是可以不做處理的,因?yàn)榧词箯?fù)位時(shí)出現(xiàn)了對(duì)外valid的誤觸發(fā),系統(tǒng)也馬上就會(huì)進(jìn)入復(fù)位狀態(tài)了不會(huì)有任何影響。在解復(fù)位階段,如果流程內(nèi)能夠通過(guò)時(shí)鐘關(guān)斷或時(shí)鐘降頻等手段來(lái)保證系統(tǒng)內(nèi)的寄存器同一拍解復(fù)位,在內(nèi)部不產(chǎn)生valid誤觸,對(duì)內(nèi)輸入的ready可以不經(jīng)過(guò)邏輯處理。
如果沒(méi)有其他的手段保護(hù),可以考慮對(duì)內(nèi)的in_ready = out_ready || 1來(lái)保證在復(fù)位撤離階段將誤觸發(fā)的valid通過(guò)假握手丟棄掉。
對(duì)外輸出的ready。
系統(tǒng)復(fù)位期間,從業(yè)務(wù)需求上其他系統(tǒng)理應(yīng)不對(duì)該系統(tǒng)有事務(wù)操作。如果真的出現(xiàn)了極端異常場(chǎng)景,那么比較合理的情況是對(duì)外輸出的ready保證為1,將事務(wù)丟棄,不阻塞其他系統(tǒng),如果為帶rsp的事務(wù)那就等待其他系統(tǒng)的超時(shí)中斷。
對(duì)內(nèi)輸入的valid。
在復(fù)位和復(fù)位期間,一般而言輸入的valid是無(wú)需理會(huì)的。解復(fù)位時(shí)最好也是通過(guò)其他手段保證不出現(xiàn)內(nèi)部的ready誤觸,且當(dāng)本系統(tǒng)單獨(dú)復(fù)位期間其他系統(tǒng)理應(yīng)不存在請(qǐng)求到來(lái),因此對(duì)內(nèi)輸入的valid也是不需要經(jīng)過(guò)特殊處理的。
如果沒(méi)有其他的手段保護(hù),可以考慮對(duì)內(nèi)的in_valid = out_valid && 0,避免內(nèi)部誤觸發(fā)的ready同in_valid進(jìn)行了握手。
復(fù)位保護(hù)電路。
通常而言,復(fù)位保護(hù)的使能信號(hào)從寄存器輸出,作用于RTL,那么同樣存在一個(gè)異步路徑的問(wèn)題。因?yàn)槭鼓軓?fù)位保護(hù)和撤銷(xiāo)復(fù)位保護(hù)時(shí),RTL是沒(méi)有處于工作狀態(tài)的,且內(nèi)部電路處于穩(wěn)態(tài)。沒(méi)有工作處于穩(wěn)態(tài)時(shí),對(duì)外的valid必然為0,ready必然為1(如果不滿足這個(gè)條件,請(qǐng)單獨(dú)討論)。
對(duì)外out_valid = 0 && (~prot_en),此時(shí)prot_en由1跳變?yōu)?(或0跳變位1),輸出邏輯不會(huì)改變,也不存在亞穩(wěn)態(tài)采樣的問(wèn)題;對(duì)外輸出的out_ready = 1 || (prot_en),此時(shí)prot_en由1跳變?yōu)?(或0跳變位1),輸出邏輯不會(huì)改變,同樣不存在亞穩(wěn)態(tài)采樣的問(wèn)題。因此個(gè)人認(rèn)為,由寄存器輸出的prot_en作用于內(nèi)部邏輯時(shí),無(wú)需經(jīng)過(guò)跨異步處理。
配置復(fù)位
本篇仍舊基于工作經(jīng)驗(yàn),難免有疏漏和錯(cuò)誤。在前文聊過(guò)了軟復(fù)位和硬復(fù)位之后,最后一篇來(lái)說(shuō)說(shuō)另外一種我遇到的系統(tǒng)復(fù)位方案 —— 配置復(fù)位,很多情況下我更愿意把配置復(fù)位稱作快速?gòu)?fù)位。粗略的一算復(fù)位情況還挺多,硬復(fù)位、軟復(fù)位、配置復(fù)位、快速?gòu)?fù)位、動(dòng)態(tài)復(fù)位等。
一款芯片的復(fù)位會(huì)分很多級(jí),很大部分的小系統(tǒng)比如加速器這種的都已經(jīng)接在三級(jí)或者四級(jí)復(fù)位總線了,看到的硬復(fù)位已經(jīng)和很多軟復(fù)位&&在了一起,看到的軟復(fù)位也可以簡(jiǎn)單理解為更上層的“配置復(fù)位”。當(dāng)然我們不在細(xì)節(jié)上做太深的探究,畫(huà)個(gè)圖簡(jiǎn)單里表示下好了。
配置復(fù)位和其他復(fù)位的區(qū)別主要在哪里呢?最大的一個(gè)區(qū)別是,系統(tǒng)的配置復(fù)位不會(huì)復(fù)位寄存器單元。想想看就很清晰,配置復(fù)位必然是通過(guò)配置寄存器單元來(lái)完成的,你要用人家就不能給人家復(fù)位了對(duì)吧。熟悉的配置復(fù)位流程和軟復(fù)位流程很接近:
1.觸發(fā)配置復(fù)位啟動(dòng)條件。如系統(tǒng)內(nèi)部出現(xiàn)了致命的錯(cuò)誤、任務(wù)執(zhí)行超時(shí)、安全機(jī)制報(bào)錯(cuò)等;
2.停止下發(fā)任務(wù)。從任務(wù)層停止下發(fā)新的任務(wù),避免系統(tǒng)錯(cuò)誤進(jìn)一步的蔓延影響其他進(jìn)程;
3.通過(guò)配置總線下發(fā)達(dá)配置復(fù)位請(qǐng)求;
4.系統(tǒng)接收到配置復(fù)位的請(qǐng)求后,停下處理的工作;
5.系統(tǒng)邊界的模塊監(jiān)聽(tīng)所有通路,等待所有已經(jīng)發(fā)出的請(qǐng)求全部收回應(yīng)答;
6.邊界的模塊收全所有應(yīng)有的返回信息后,或者未能收全但是到達(dá)超時(shí)閾值后,系統(tǒng)進(jìn)入待復(fù)位狀態(tài);
7.此時(shí)如果本系統(tǒng)仍然保留著訪問(wèn)DDR和sram的備份通路,那么上位機(jī)可以通過(guò)配置寄存器去間接訪問(wèn)內(nèi)存和寄存器進(jìn)行保留現(xiàn)場(chǎng)。如果沒(méi)有規(guī)劃該功能,則略過(guò)這一步驟;
8.上位機(jī)配置復(fù)位保護(hù)寄存器使能復(fù)位保護(hù)電路,避免系統(tǒng)復(fù)位過(guò)程中有毛刺或者使能信號(hào)擴(kuò)散到總線或其他系統(tǒng);
9.通過(guò)系統(tǒng)總線配置時(shí)鐘降頻寄存器或關(guān)斷核時(shí)鐘寄存器;
10.通過(guò)系統(tǒng)總線配置復(fù)位寄存器,持續(xù)一段時(shí)間確保系統(tǒng)內(nèi)所有寄存器都完成了復(fù)位;
11.復(fù)位完成后配置復(fù)位寄存器解除復(fù)位,之后等待一段時(shí)間;
12.配置時(shí)鐘恢復(fù)工作頻率或恢復(fù)時(shí)鐘;
13.配置復(fù)位保護(hù)寄存器解除復(fù)位保護(hù),恢復(fù)總線連接;
14.重新下任務(wù)或恢復(fù)現(xiàn)場(chǎng),重啟系統(tǒng)完成。
流程這么相似的情況下,配置復(fù)位和軟復(fù)位最大的區(qū)別在哪里呢?我個(gè)人的經(jīng)驗(yàn)是,配置復(fù)位不會(huì)將寄存器復(fù)位那么所有的配置都得以保留,復(fù)位完成后可以不重新下配置的情況下快速的重啟任務(wù),所以我更喜歡將配置復(fù)位稱為快速?gòu)?fù)位。當(dāng)然,這個(gè)區(qū)別并不固定,軟復(fù)位也可以只復(fù)位核部分不復(fù)位寄存器部分,連接合理使用得當(dāng)?shù)那闆r下都是允許的。
之前面對(duì)的最復(fù)雜的系統(tǒng)復(fù)位場(chǎng)景基本就是下面這樣了:
因?yàn)闅v史遺留和甩鍋等一些原因吧,我交付的系統(tǒng)中有一部分應(yīng)該歸屬于NOC系統(tǒng)的總線模塊。這部分總線模塊的引入帶來(lái)了一個(gè)尷尬的問(wèn)題,軟復(fù)位時(shí)候不能將這部分進(jìn)行復(fù)位,否則NOC就掛了!所以最后的系統(tǒng)的復(fù)位域分了三個(gè)層級(jí):硬復(fù)位——復(fù)位全系統(tǒng),軟復(fù)位——復(fù)位core和reg,配置復(fù)位——只復(fù)位core,保留配置。光復(fù)位方案就要分三套,真是不想回首的痛苦經(jīng)歷啊。
審核編輯:劉清
-
寄存器
+關(guān)注
關(guān)注
31文章
5294瀏覽量
119816 -
D觸發(fā)器
+關(guān)注
關(guān)注
3文章
164瀏覽量
47828 -
SDC
+關(guān)注
關(guān)注
0文章
48瀏覽量
15518 -
CLK
+關(guān)注
關(guān)注
0文章
127瀏覽量
17104 -
累加器
+關(guān)注
關(guān)注
0文章
50瀏覽量
9436
原文標(biāo)題:【芯片設(shè)計(jì)筆記】復(fù)位那些小事(建議收藏)
文章出處:【微信號(hào):IC修真院,微信公眾號(hào):IC修真院】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論