復(fù)位設(shè)計中出現(xiàn)的結(jié)構(gòu)性缺陷及解決方案
本文討論了一些復(fù)位設(shè)計的基本的結(jié)構(gòu)性問題,在每個問題的最后,都提出了一些解決方案。
隨著數(shù)字化設(shè)計和SoC的日益復(fù)雜,復(fù)位架構(gòu)也變得非常復(fù)雜。在實施如此復(fù)雜的架構(gòu)時,設(shè)計人員往往會犯一些低級錯誤,這些錯誤可能會導(dǎo)致亞穩(wěn)態(tài)、干擾或其他系統(tǒng)功能故障。
復(fù)位域交叉問題
1.問題
在一個連續(xù)設(shè)計中,如果源寄存器的異步復(fù)位不同于目標(biāo)寄存器的復(fù)位,并且在起點寄存器的復(fù)位斷言過程中目標(biāo)寄存器的數(shù)據(jù)輸入發(fā)生異步變化,那么該路徑將被視為異步路徑,盡管源寄存器和目標(biāo)寄存器都位于同一個時鐘域,在源寄存器的復(fù)位斷言過程中可能導(dǎo)致目標(biāo)寄存器出現(xiàn)亞穩(wěn)態(tài)。這被稱為復(fù)位域交叉,其中啟動和捕捉觸發(fā)的復(fù)位是不同的。
在這種情況下,C寄存器和A寄存器的起點異步復(fù)位斷言是不同的。在C寄存器復(fù)位斷言過程中而A觸發(fā)器沒有復(fù)位,如果A寄存器的輸入端有一些有效數(shù)據(jù)交易,那么C寄存器的起點異步復(fù)位斷言引起的異步變更可能導(dǎo)致目標(biāo)A寄存器發(fā)生時序違規(guī),從而可能產(chǎn)生亞穩(wěn)態(tài)。
圖1:復(fù)位域交叉問題
在上面的時序圖中,當(dāng)有一些有效數(shù)據(jù)交易通過C1進(jìn)行時,rst_c_b獲得斷言,導(dǎo)致C1發(fā)生異步改變,w.r.t clk從而使QC1進(jìn)入亞穩(wěn)態(tài),這可能導(dǎo)致設(shè)計發(fā)生功能故障。
2.解決方案
*使用異步復(fù)位、不可復(fù)位觸發(fā)器或D1觸發(fā)器POR.
*如果復(fù)位源rst_c_b是同步的,那么則認(rèn)為來自C_CLR ——> Q的用于從rst_c_b_reg ——>C_CLR——>C_Q1——>C1——>A_D進(jìn)行設(shè)置保持檢查的時序弧能夠避免設(shè)計亞穩(wěn)態(tài)。然而,通常在默認(rèn)情況下C_CLR——>Q時序弧在庫中不啟用,需要在定時分析過程中明確啟用。
*在目的地(A)使用雙觸發(fā)器同步器,以避免設(shè)計中發(fā)生亞穩(wěn)態(tài)傳播。然而,設(shè)計人員應(yīng)確保安裝兩個觸發(fā)器引入的延遲不會影響預(yù)期功能。
由于組合環(huán)路導(dǎo)致復(fù)位源干擾
1.問題
在SoC中,全局系統(tǒng)復(fù)位在設(shè)備中組合了軟件或硬件生成的各種復(fù)位源。LVD復(fù)位、看門狗復(fù)位、調(diào)試復(fù)位、軟件復(fù)位、時鐘丟失復(fù)位是導(dǎo)致全局系統(tǒng)復(fù)位斷言的一些示例。然而,如果由于任何復(fù)位源導(dǎo)致的全局復(fù)位斷言是完全異步的,且復(fù)位發(fā)生源邏輯被全局復(fù)位清零,那么設(shè)計中會產(chǎn)生組合環(huán)路,這會在該復(fù)位源產(chǎn)生干擾。組合路徑的傳播延遲會根據(jù)不同的流程、電壓或溫度以及干擾范圍而不同。如果設(shè)計中使用了組合信元用于復(fù)位斷言和去斷言,那么也會導(dǎo)致模擬中出現(xiàn)紊亂情況。這被視為設(shè)計人員的非常低級的錯誤。
圖2:復(fù)位源干擾(基本問題)
在上圖中,當(dāng)復(fù)位源SW_Q斷言時,會導(dǎo)致rst_b斷言,這是全局復(fù)位?,F(xiàn)在,如果全局復(fù)位本身被用于清除“SW_Q”復(fù)位斷言,那么會在設(shè)計中在SW_Q輸出和全局復(fù)位時產(chǎn)生干擾。此外,在模擬中,這會導(dǎo)致紊亂情況,因為復(fù)位源斷言試圖通過該組合邏輯去斷言。
然而,如果復(fù)位源(SW_Q)在復(fù)位狀態(tài)機(觸發(fā)器的SET/CLR輸入)為全局復(fù)位斷言被異步使用,那么復(fù)位干擾可能能夠復(fù)位整個系統(tǒng)(通過斷言全局復(fù)位),因為全局系統(tǒng)復(fù)位去斷言不僅僅與復(fù)位源去斷言相關(guān)。當(dāng)該復(fù)位源(有干擾)被同步使用或在觸發(fā)器D輸入使用的情況下可能依然有一個問題。干擾范圍可能無法在至少一個周期內(nèi)保持穩(wěn)定,因此這不會被目標(biāo)觸發(fā)器捕獲。此外,該復(fù)位源不能被用作任何電路的時鐘(除了脈沖捕捉電路),因為它可能違反時鐘寬度。
圖3:復(fù)位源干擾(問題2)
在上圖中,復(fù)位源SW_Q將出現(xiàn)干擾。雖然如果復(fù)位源SW_Q的干擾在某個觸發(fā)器被捕捉作為復(fù)位事件狀態(tài)(在S)或用于其他目的,全局復(fù)位輸出(rst_b)都沒有干擾,但它將導(dǎo)致時序違反/亞穩(wěn)態(tài),或根本不可能被捕獲。
2.解決方案
*設(shè)計人員永遠(yuǎn)都不應(yīng)犯下上述(圖2)低級錯誤。
*如果復(fù)位實現(xiàn)如圖3所示,那么設(shè)計人員應(yīng)保證復(fù)位源(在該示例中為SW_Q)總是在觸發(fā)器的SET/CLR輸入使用,而不在D或CLK使用。
*解決這個問題的最好的方法是在復(fù)位狀態(tài)機中使用之前注冊該復(fù)位源。雖然它將導(dǎo)致時鐘依靠全局復(fù)位斷言,但是無論如何,如果沒有時鐘,該內(nèi)部復(fù)位(SW_Q)都不會斷言。請參見圖4.
圖4:解決方案1
此外,用戶也可以擴(kuò)展SW_Q斷言,然后再在設(shè)計中使用它,復(fù)位斷言與時鐘無關(guān)。請參見圖5.
圖5:解決方案2
復(fù)位路徑的組合邏輯
1.問題(I)
如果組合邏輯輸入大約在同一時間發(fā)生變化,那么使用復(fù)位路徑中的組合邏輯可能產(chǎn)生干擾,這可能在設(shè)計中觸發(fā)虛假復(fù)位。下面是一個RTL代碼,它會在設(shè)計中意外復(fù)位。
assign module_a_rstb = !((slave_addr[7:0]==8'h02 write_enable(wdata[7:0]==00))
always @(posedge clk or negedge module_rst_b)
if(!module_rst_b)data_q 00000010 ——> 00000000 ——> 01000000 ——> 01100000“生成過渡。
在這段時間里,salve_addr為“00000010”,如果wdata[7:0]始終為零且“write_enable”已經(jīng)被斷言,那么它將在module_rst_b創(chuàng)建一個無用脈沖,從而導(dǎo)致虛假復(fù)位。
圖6:復(fù)位路徑的組合邏輯
2.解決方案
首先注冊組合輸出,然后再將其用作復(fù)位源(如圖7所示)。
圖7:復(fù)位路徑的組合邏輯解決方案
3.問題(II)
在上面的示例中,復(fù)位路徑的組合邏輯解決方案并不完善。如果組合邏輯輸入大約在同一時間發(fā)生變化,那么它可能在設(shè)計中觸發(fā)虛假復(fù)位。然而,如果組合邏輯的輸入信號變化相互排斥,那么它可能不會引起任何設(shè)計問題。例如,測試模式和功能模式相互排斥。因此復(fù)位路徑的測試復(fù)用是有效的設(shè)計實踐。
然而,對于某些情況,變化相互排斥的靜態(tài)信號或信號可能會導(dǎo)致設(shè)計出現(xiàn)虛假復(fù)位觸發(fā)。下面的示例描述了此類設(shè)計可能出現(xiàn)問題。
圖8:復(fù)位路徑的組合邏輯(問題2)
在上面的示例中,多路復(fù)用結(jié)構(gòu)用于復(fù)位路徑,同時進(jìn)行RTL編碼。其中“mode”是一個控制信號,不頻繁改變,而mode0_rst_b和mode_1_rst_b是兩個復(fù)位事件,然而在合成RTL時,在門控級它被分解成不同的復(fù)雜的組合(And-Or-Invert[AOI])信元。雖然在邏輯上它相當(dāng)于一個多路復(fù)用器,但由于不同的信元和凈延遲,每當(dāng)信號“mode”從1——>0變化時,final_rst_b都會產(chǎn)生干擾。
4.解決方案
*在合成過程中在復(fù)位路徑保留多路復(fù)用結(jié)構(gòu),因為多路復(fù)用結(jié)構(gòu)與其他組合邏輯相比易于產(chǎn)生干擾。MUX Pragma可以在編碼RTL時使用,這將有助于合成工具在復(fù)位路徑中保留任何多路復(fù)用器。
設(shè)計中的同步復(fù)位問題
1.問題(I)
在許多地方,設(shè)計人員在時鐘方面喜歡同步復(fù)位設(shè)計。原因可能是為了節(jié)省一些芯片面積(帶有異步復(fù)位輸入的觸發(fā)器比任何不可復(fù)位觸發(fā)器都大)或讓系統(tǒng)與時鐘完全同步,也可能有一些其他原因。對于此類設(shè)計,當(dāng)復(fù)位源被斷言時需要向設(shè)計的觸發(fā)器提供時鐘,否則,這些觸發(fā)器可能會在一段時間內(nèi)都不進(jìn)行初始化。但當(dāng)該模塊被插入一個系統(tǒng)時,系統(tǒng)設(shè)計人員可能選擇在復(fù)位階段禁用其時鐘(如果在一開始不需要激活該模塊),以節(jié)省整個系統(tǒng)的動態(tài)功耗。因此,該模塊甚至在復(fù)位去斷言后一段時間內(nèi)都不進(jìn)行初始化。如果該模塊的任何輸出直接在系統(tǒng)中使用,那么將捕獲未初始化和未知的值(X),這可能會導(dǎo)致系統(tǒng)功能故障。
圖9:同步復(fù)位問題時序圖
2.解決方案
在復(fù)位階段啟用該模塊的時鐘且持續(xù)最短的時間,使該模塊內(nèi)的所有觸發(fā)器都在復(fù)位過程中被初始化。當(dāng)系統(tǒng)復(fù)位被去斷言時,模塊輸出不會有任何未初始化的值。
圖10:同步復(fù)位問題已解決
3. 問題(II)
在時鐘域交叉路徑使用兩個觸發(fā)同步器是常見做法。然而,有時設(shè)計人員對這些觸發(fā)器使用同步復(fù)位。相同的RTL代碼是
always @(posedge clk )
if(!sync_rst_b) begin
sync1 <= 1'b0; sync2 <= 1'b0 ;
end
else begin
sync1 <= async_in; sync2 <= sync1
end
在硬件中進(jìn)行了RTL合成后,上面的代碼會在雙觸發(fā)器同步器的同步鏈中引入組合邏輯,這會帶來風(fēng)險,并縮短sync2觸發(fā)器輸入進(jìn)入亞穩(wěn)態(tài)的時間。
圖11:同步復(fù)位問題2
4. 解決方案
可用以下方式編寫RTL代碼,以避免同步鏈的組合邏輯。
always @(posedge clk )
if(!sync_rst_b) begin
sync1 <= 1'b0;
end
else begin
sync1 <= async_in; sync2 <= sync1
end
在上面的代碼中,對sync2觸發(fā)器不使用復(fù)位,因此在同步鏈中不會實現(xiàn)組合信元。然而,需要注意sync2需要一個額外的周期才能復(fù)位,這不應(yīng)導(dǎo)致設(shè)計出現(xiàn)任何問題。
冗余復(fù)位同步器引起的問題
1. 問題
在使用多個異步時鐘的設(shè)計中,設(shè)計人員需要確保在目標(biāo)寄存器使用的時鐘方面,異步復(fù)位的同步去斷言,否則可能導(dǎo)致目標(biāo)觸發(fā)器發(fā)生時序違反,從而產(chǎn)生亞穩(wěn)態(tài)。復(fù)位同步器被用來復(fù)位去斷言,與目標(biāo)時鐘域同步。然而,只有在系統(tǒng)復(fù)位去斷言過程中有目標(biāo)時鐘時才會發(fā)生復(fù)位去斷言時序違反。如果在復(fù)位去斷言時沒有時鐘,那么便不會有任何時序違反。因此,在設(shè)計多時鐘域模塊時,設(shè)計人員可以讓編譯時間選項繞過該模塊中的那些復(fù)位同步器,并讓系統(tǒng)集成商根據(jù)對該模塊的時鐘可用性決定是否需要使用復(fù)位同步器。
此外,如果系統(tǒng)時鐘和異步時鐘比非常高,冗余同步器甚至?xí)斐稍O(shè)計功能性問題。下面描述了這個問題。
圖12:冗余同步器的問題
在上面的設(shè)計中,去斷言與sys clk同步的系統(tǒng)復(fù)位被饋送到(mod_clk域)的復(fù)位同步器,然后在mod_clk域邏輯中使用該復(fù)位。讓我們假定sys clk : mod_clk的時鐘頻率比大于6:1.默認(rèn)不啟用mod_clk,以節(jié)省動態(tài)功率。當(dāng)用戶想要啟用mod_clk域邏輯的功能時,便啟用該時鐘。在啟用了該時鐘后,有兩個mod_clk周期的延遲,其中,由于復(fù)位同步器導(dǎo)致整個mod_clk域邏輯都處于復(fù)位狀態(tài)。在該階段,如果一些數(shù)據(jù)交易從sys clk域開始,將在mod_clk域丟失。
2. 解決方案
雖然這不是大問題,但有時會在客戶一端造成混淆,因為該延遲對客戶不可見。 因此消除混淆的更好的方式是:
* 如果在全局復(fù)位去斷言過程中沒有時鐘,則在設(shè)計中繞過/刪除冗余復(fù)位同步器。 這當(dāng)然會節(jié)省一定的門控數(shù)。
* 如果動態(tài)功耗不是問題,用戶可以在mod_clk域邏輯開始運作之前很長時間在啟動代碼選擇啟用mod_clk. 因此,復(fù)位去斷言將有足夠的時間傳播。
* 這也可以在軟件中處理,在任何有效操作之前啟用了mod_clk后,設(shè)置兩三個mod_clk周期的延遲。
由于罕見的時鐘路徑導(dǎo)致復(fù)位去斷言時序問題
1. 問題
設(shè)計的復(fù)位架構(gòu)根據(jù)系統(tǒng)而不同。在一些安全關(guān)鍵設(shè)備中,整個復(fù)位狀態(tài)機在安全時鐘上工作,安全時鐘默認(rèn)啟用。 該時鐘也被用作設(shè)備的默認(rèn)系統(tǒng)時鐘。
圖13:罕見時鐘路徑的問題
在上圖中,復(fù)位狀態(tài)機(R觸發(fā)器)在default_clk上工作。此外,在復(fù)位去斷言過程中,default_clk是sys clk的源。因此,在邏輯上,這兩個時鐘(clk1和clk2)在復(fù)位去斷言過程中同步。但是,由于clk1和clk2之間存在巨大的罕見路徑,因此很難平衡這兩個時鐘并視其為同步。 因此,滿足A觸發(fā)器的復(fù)位去斷言變得具有挑戰(zhàn)性。
2. 解決方案
異步對待clk1和clk2,并在A觸發(fā)器中使用復(fù)位之前放置復(fù)位同步器?,F(xiàn)在需要從S2--》A滿足復(fù)位去斷言時序(見圖14)。這不應(yīng)是個問題。
圖14:解決方案
結(jié)束語
本文主要專注于復(fù)位設(shè)計中的故障以及克服這些問題的可能的解決方案,然而,上述解決方案并非唯一的解決方案,也不普遍適用于所有設(shè)計。這些是一些通用的解決方案和建議的指導(dǎo)方針,在特殊情況下可能需要進(jìn)行修改。