1.同步復位的基本原理是,復位信號僅在時鐘的有效邊沿影響或重置觸發器的狀態。
復位的主要目標之一是使 ASIC 在仿真時進入已知狀態。
由于復位樹的扇出較大,復位信號相對于時鐘周期可能成為 “晚到信號”。即使復位信號會通過復位緩沖樹進行緩沖,但在復位信號到達本地邏輯后,限制其必須經過的邏輯數量仍是明智之舉。
module ctr8sr (
output reg [7:0] q,
output reg co,
input [7:0] d,
input ld, clk, rst_n);
always @(posedge clk)
if (!rst_n) {co,q} <= 9'b0; // sync reset
else if (ld) {co,q} <= d; // sync load
else {co,q} <= q + 1'b1; // sync increment
endmodule
同步復位代碼:
module sync_resetFFstyle (
output reg q,
input d, clk, rst_n);
always @(posedge clk)
if (!rst_n) q <= 1'b0;
else q <= d;
endmodule
同步復位存在的一個問題是,綜合工具難以輕易區分復位信號與其他數據信號。
同步復位優點:
1.同步復位邏輯在綜合時生成的觸發器通常更小,特別是當復位信號與生成 d 輸入的邏輯共同作用時。但在這種情況下,組合邏輯的門數會增加,因此總體門數節省可能并不顯著。
2.?
同步復位通常可確保電路 100% 同步。同步復位確保復位僅在時鐘有效邊沿發生。時鐘可過濾小的復位毛刺;然而,如果這些毛刺發生在時鐘有效邊沿附近,觸發器可能進入亞穩態。這與其他數據輸入沒有區別,任何違反建立時間要求的信號都可能導致亞穩態。
在某些設計中,復位信號必須由一組內部條件生成。對于這類設計,建議使用同步復位,因為它可以過濾時鐘之間邏輯方程產生的毛刺。
3.通過使用同步復位并在復位過程中使用預定數量的時鐘,復位緩沖樹中可以使用觸發器,有助于使緩沖樹的時序保持在一個時鐘周期內。
同步復位缺點:
1.同步復位可能需要脈沖展寬器來保證復位脈沖寬度足夠寬,以確保在時鐘有效邊沿期間存在復位信號;
2.從本質上講,同步復位需要時鐘才能復位電路。這對某些設計風格可能不是缺點,但對另一些設計風格可能會很麻煩。例如,如果為了節省功耗而使用門控時鐘,則在斷言復位的同時時鐘可能被禁用。在這種情況下,只有異步復位才能工作,因為復位信號可能在時鐘恢復之前被撤銷。
異步復位:
異步復位最大的問題是復位釋放,也稱為復位撤銷。
敏感列表中只能包含時鐘和復位信號。如果包含其他信號(合法的 Verilog,但非法的 Verilog RTL 綜合編碼風格),則觸發器的仿真模型將不正確,并且 Synopsys 在讀取用于綜合的模型時會報告錯誤。
異步復位代碼:
module async_resetFFstyle (
output reg q,
input d, clk, rst_n);
always @(posedge clk or negedge rst_n)
if (!rst_n) q <= 1'b0;
else q <= d;
endmodule
異步復位的綜合方法
綜合異步復位的方法取決于設計者對復位緩沖樹的處理方式。如果復位信號直接由外部引腳驅動,通常對復位引腳執行set_drive 0命令,并對復位網絡執行set_dont_touch_network命令,可防止綜合工具修改該網絡。
有時可能還需要對復位網絡執行set_resistance 0命令。另外,也可以創建一個電阻值為 0 的自定義線載模型,并使用以下命令將其應用于復位輸入端口:
set_wire_load -port_list reset
異步復位優點:
1.使用異步復位的最大優點在于,只要供應商庫中提供了支持異步復位的觸發器,數據路徑就能夠保證不受復位邏輯的影響。對于那些對數據路徑時序要求極高的設計而言,因處理同步復位而插入的邏輯所帶來的額外門延遲和網絡延遲是難以接受的。通過使用異步復位,設計人員可以確保復位邏輯不會被添加到數據路徑中。
2.無論時鐘是否存在,電路都能被復位。
異步復位缺點:
1.如果異步復位不是直接由 I/O 引腳驅動,那么在進行 DFT 掃描和測試時,必須禁用來自復位驅動器的復位網絡。
2.對于使用異步復位的設計,靜態時序分析非常困難。無論是同步復位還是異步復位,都必須對復位樹進行時序分析,以確保復位釋放能夠在一個時鐘周期內完成。復位樹的時序分析必須在布局后進行,以確保滿足這一時序要求。
3.異步復位最大的問題在于其 “異步性”,無論是在復位信號有效還是無效時都存在這個問題。復位信號有效時通常不會有問題,問題主要出在復位信號無效時。如果異步復位在觸發器的時鐘有效邊沿或其附近釋放,觸發器的輸出可能會進入亞穩態,從而導致 ASIC 的復位狀態丟失。
4.異步復位還可能存在另一個問題,具體取決于其來源,即由于電路板或系統復位上的噪聲或毛刺而導致的虛假復位。
然而,同步復位也存在類似但不同的問題:如果這些虛假復位脈沖在時鐘邊沿附近發生,觸發器仍然可能進入亞穩態(任何違反建立時間要求的數據輸入都會出現這種情況)
5.異步復位信號的釋放與時鐘信號是異步的。這種情況存在兩個潛在問題:(1)違反復位恢復時間要求;(2)不同的時序元件在不同的時鐘周期釋放復位信號。
異步復位需要注意:
必須特別注意復位信號的釋放過程,以防止芯片在復位釋放時進入亞穩態的未知狀態。
當使用同步復位時,復位信號的上升沿和下降沿都必須遠離時鐘的有效邊沿。
異步復位信號的釋放與時鐘信號是異步的。這種情況存在兩個潛在問題:(1)違反復位恢復時間要求;(2)不同的時序元件在不同的時鐘周期釋放復位信號。
恢復時間也可以看作是一種建立時間(tsu),其形式為 “PRE 或 CLR 信號在 CLK 上升沿之前的無效建立時間”[1]。
如果不滿足恢復時間要求,可能會導致寄存器數據輸出的信號完整性問題或亞穩態問題。
采用復位同步器解決:
復位同步器的第一個觸發器確實存在潛在的亞穩態問題,因為其輸入固定為高電平,輸出被異步復位為 0,并且復位信號可能在觸發器規定的復位恢復時間內釋放(復位信號可能在太接近同一觸發器時鐘輸入上升沿時變為高電平)。這就是需要第二個觸發器的原因。
復位同步器的第二個觸發器不會受到恢復時間亞穩態的影響,因為當復位信號釋放時,該觸發器的輸入和輸出均為低電平。由于觸發器的輸入和輸出之間沒有邏輯差異,因此輸出不可能在兩個不同的邏輯值之間振蕩。
module async_resetFFstyle2 (
output reg rst_n,
input clk, asyncrst_n);
reg rff1;
always @(posedge clk or negedge asyncrst_n)
if (!asyncrst_n) {rst_n,rff1} <= 2'b0;
else {rst_n,rff1} <= {rff1,1'b1};
endmodule
always @ (posedge clk or negedge rst_n)
if (!rst_n) q <= 0;
else q <= d;