reset 看似簡單無比: 當 reset 停止時, 暫存器開始啟動。
然而, 如果規劃不當, 只要有任何的機率發生 reset 不完全: 某些暫存器沒有在同一個週期内開始啟動, 那整個電路設計就會失敗。
大部分的人喜歡用非同步的 reset, 主要的好處有:
1. clock 不在時也可以 reset
2. 可以節省 gate count
但非同步的 reset 也有一個缺點, 合成器不會去分析 reset 的 delay, 所以有可能 reset 的 delay 會超過 clock edge。如果有些暫存器在 clock cycle N 開始啟動, 而有些暫存器卻在 clock cycle N+1 才開始啟動, 那就有發生錯誤的可能。
所以為了讓 reset 有足夠的時間可以及時啟動所有的暫存器, reset 停止的時間是很重要的, 如圖一所示, reset 停止後, 只剩下半個 clock cycle 不到時時間可以啟動所有的暫存器。
為了確保所有的暫存器在同一個 cycle 內啟動, 我們最好將圖一的問號部分降到最小, 這樣 reset 就有最大的 budge (一個 clock cycle) 可以傳遞到所有的暫存器。
為達到上述目的, 一般採用的原則有:
A. 不同的 clock domain 各自採用不同的 reset, 例如 rst_tx_n, rst_rx_n...。
B. 每個 clock domain 的 reset 經過 synchronizer (圖二) 之後, 才送往暫存器。這樣 reset 就會有最大的 budget (一個 clock cycle) 去啟動所有的暫存器。
在高速的電路設計中, A 及 B 仍稍嫌不夠。reset 其實並不像想像中的微不足道...
關於 reset 的使用, 以下的論文是很好的參考:
Clifford E. Cummings, Don Mills, Steve Golson: Asynchronous & Synchronous reset design techniques
http://www.sunburst-design.com/papers/CummingsSNUG2003Boston_Resets.pdf
louis lin