在一個ASIC設計中,復位方面有着很多的策略:
同步復位與異步復位的選擇,reset tree的buffer與走線,reset tree的時序及功能驗證,
reset的scan test設計,cdc中的設計。
同步復位:
在always模塊中,並不會有reset的敏感列表。
同步復位可以被綜合為更小的FF,因為只需要在輸入端D加入reset與門或者lib提供帶同步reset的FF;
同步復位可以對reset信號的小的glitch進行filter,防止metastable的產生;
但是;
同步復位需要一個pulse stretcher(counter)來保證reset pulse的寬度足夠被clock采樣到;
同步復位要求必須有clock才能工作,而有時系統要求是clock gate的;
在一些三態總線的初始化過程中,要求必須有異步復位,來保證在clock有效前,不出現沖突;
異步復位的最大問題是在reset release階段可能出現timing不滿足。
異步復位的FF包括一個專用的reset pin,在always模塊的敏感列表中包含reset。
異步復位保證了FF,data端的timing是clean的,不會被reset影響到;
異步復位可以保證在沒有clock的情況下,有效復位;
但是
異步復位reset端出現的小的noise和glitch對設計影響可能是致命的;
reset端相對於clock的recovery time和removal time問題,這個問題在一個reset對應多個clock時,更加嚴峻;
實際中的解決辦法,加入reset synchronizer;
reset distribution tree相較於clock distribution tree對skew要求並沒有那么嚴格,並不需要做太多的balance工作。
reset tree針對sync,usync的一些結構:
在sync reset中,必須在PR階段插入buffer或調整trace來保證timing且reset在同一clock內可以傳遞到各個module。
而在usync設計中,可以在每個endpoint做自己的sync和balance,從而簡化了設計。
reset的輸入pad應該經過一schmidt trigger來filter glitch,
在邏輯內部可以通過加入delay hard macro來進行glitch filter。
帶優先級的reset的設計:
synopsys要求,如果在敏感列表中有一個是edge-sensitive,那么敏感列表中的所有信號都必須是edge-sensitive。
verilog simulation並沒有在這個約束,但是在edge-sensitive敏感列表中,只能有clock和reset信號。
在上述這個例子中,不過不加translate_off/translate_on的宏定義,那么這個simulation model是錯的,
在reset,set同時為低,但是reset之后無效的情況下,仿真結果會錯誤,這只是一個model的建立錯誤,DC並不會錯。
在創建testbench過程中,盡量保證使用同一個testbench,對於pre-synthesis和post-synthesis有同樣的結果。
在reset進行同步釋放的設計中:
@posedge clk or negedge rst
if(!rst) begin
reg1 <= 1'b0;
reg2 <= 1'b0;
end
else begin reg1 <= 1'b1;
reg2 <= reg1;
end
兩級寄存器來保證mestability的概率最小,在這兩級的register中,是不會檢查recovery/removal,在sta中,設置為false path;
在同步之后,可以檢查recovery/removal的timing;
rst的下降沿只能保證,有效的rst生成,rst的removal是靠clock的trigger。