當 clock domain A 產生資料要交給 clock domain B 時, 我們以前常用的技巧如附圖。clock domain A 產生一個
Ready_pulse, 於是 Flag 會變成 High。
而 clock domain B 發現 Flag 成為 High 後, 就可以放心的取走 Parallel Data, 然後產生一個
Ack_pulse, 將 Flag 清除。
然而, 這個電路有一個容易出錯的地方, 如果 Ack_pulse 的產生的方法為:
Ack_pulse <= Flag;
若 clock domain B 發生 reset, 而 clock domain A 仍在運作, 那就有可能在 clock domain B
仍未完成 reset 時, 發生了幾個 Ready_pulse 未被處理, 造成 Flag 為 High。等到 clock domain B 完成 reset
後, Ack_pulse 就會永遠為 High (而不是我們期待的 rising edge), 於是形成 dead lock。
有名的 Verilog 大師 Clifford E. Cummings 比較建議的用法, 是 clock domain A 產生 toggle
信號來通知 clock domain B。這兩種方法各有適用的場合, 請參考 Clifford E. Cummings 論文。這兩種方法我們的 library
都有, 敝人建議盡量以 toggle 機制為優先改慮。
by louis
請先 登入 以發表留言。