同步復位與異步復位


在一個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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM