復位設計中的結構性缺陷及解決方案(二)
設計中的同步復位問(wèn)題
1. 問(wèn)題(I)
在許多地方,設計人員在時(shí)鐘方面喜歡同步復位設計。原因可能是為了節省一些芯片面積(帶有異步復位輸入的觸發(fā)器比任何不可復位觸發(fā)器都大)或讓系統與時(shí)鐘完全同步,也可能有一些其他原因。對于此類(lèi)設計,當復位源被斷言時(shí)需要向設計的觸發(fā)器提供時(shí)鐘,否則,這些觸發(fā)器可能會(huì )在一段時(shí)間內都不進(jìn)行初始化。但當該模塊被插入一個(gè)系統時(shí),系統設計人員可能選擇在復位階段禁用其時(shí)鐘(如果在一開(kāi)始不需要激活該模塊),以節省整個(gè)系統的動(dòng)態(tài)功耗。因此,該模塊甚至在復位去斷言后一段時(shí)間內都不進(jìn)行初始化。如果該模塊的任何輸出直接在系統中使用,那么將捕獲未初始化和未知的值(X),這可能會(huì )導致系統功能故障。
圖9:同步復位問(wèn)題時(shí)序圖
2. 解決方案
在復位階段啟用該模塊的時(shí)鐘且持續最短的時(shí)間,使該模塊內的所有觸發(fā)器都在復位過(guò)程中被初始化。 當系統復位被去斷言時(shí),模塊輸出不會(huì )有任何未初始化的值。
圖10:同步復位問(wèn)題已解決
3. 問(wèn)題(II)
在時(shí)鐘域交叉路徑使用兩個(gè)觸發(fā)同步器是常見(jiàn)做法。然而,有時(shí)設計人員對這些觸發(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合成后,上面的代碼會(huì )在雙觸發(fā)器同步器的同步鏈中引入組合邏輯,這會(huì )帶來(lái)風(fēng)險,并縮短sync2觸發(fā)器輸入進(jìn)入亞穩態(tài)的時(shí)間。

評論