這十幾年來,我面試過很多新人,也帶過很多新人,他們之中很多人的成就都已經(jīng)超越了我。但是當(dāng)我們偶爾回顧這個小小的跨越時鐘域的問題時,仍然有很多的困惑和不理解。
我喜歡用這個題目作為我的面試題目,因為它不是一個簡單的題目,而是涉及到ASIC設(shè)計本質(zhì)的題目,如果細(xì)細(xì)研究起來,還非常復(fù)雜。寫這個東西,希望所有在做ASIC的人,能從一個更高的角度去審視它,并且能因此更深刻的體會做ASIC的嚴(yán)謹(jǐn)。
言歸正傳:
1、首先給一個最簡單的答案: 用寄存器打兩拍
這里其實有一個很本質(zhì)的問題需要討論,就是為什么要所存兩拍? 把這個問題插進來說說吧。所有做ASIC的人,都要面對兩個基本的概念:setup time 和 hold time。如果寄存器不滿足這兩個時間,將會出現(xiàn)亞穩(wěn)態(tài)。很多新人以為亞穩(wěn)態(tài)僅僅是邏輯上的障礙,其實亞穩(wěn)態(tài)是實實在在的電路上的問題。
模擬電路中,三極管主要工作在其放大區(qū)間,而在數(shù)字電路卻是要工作在截至態(tài)。亞穩(wěn)態(tài)非常類似模擬電路中的放大態(tài),這個狀態(tài)將使得器件的輸出電流被放大,如果這個狀態(tài)被傳遞,那么將導(dǎo)致更多的電路處在放大電路的工作狀態(tài)中,這將引起巨大的電流和功耗,甚至燒毀芯片,所以,跨時鐘域是一定會出現(xiàn)亞穩(wěn)態(tài)的,但是我們必須要把亞穩(wěn)態(tài)控制在一個很小的范圍內(nèi)。這就是為什么要在其后面再用一個寄存器的原因。它的功能就是把亞穩(wěn)態(tài)僅僅限制在那一個寄存器的小區(qū)域。
好了,繼續(xù)說邏輯上的事情。這個兩拍的電路很顯然,只適合信號從低頻時鐘跨越到高頻時鐘,那么當(dāng)高頻時鐘要跨越到低頻時鐘該怎么辦呢?
2、高頻信號要進入低頻時鐘域,最原始的想法就是 展寬。如果我們知道這兩個時鐘之間的頻率差別,那么用一個計數(shù)器去將高頻信號做適當(dāng)?shù)恼箤?,使其寬度大于低頻時鐘的一個周期,然后就可以繼續(xù)用上述的方法跨域時鐘域了。
這種方法的本質(zhì),是降低時鐘頻率,是把高頻時鐘產(chǎn)生的信號先做了頻率的降低,降低到比原來的低頻時鐘還要低,因此當(dāng)然就可以用第一種方法了。
那么,如果我們不能在設(shè)計的最初就知道彼此的頻率差異,該怎么辦呢? 通常這個問題,都會讓面試者陷入絕境。
3、仍然是高頻時鐘域的信號要進入低頻時鐘域,但是我們不能確切的知道兩個時鐘頻率到底差異多少,這時,我們的基本思路還是展寬,只是這個展寬要做成一個能自動適配的功能,當(dāng)然,這就需要做反饋。我是學(xué)自控的,反饋,我很熟悉。
這里面其實是3組寄存器,reg-1和reg-2是clk-a的時鐘域,其中reg-2的功能就是要把高頻時鐘clk-a產(chǎn)生的信號根據(jù)clk-b的頻率來做展寬。
reg-3和reg-4是兩個寄存器,用來把clk-a的信號跨時鐘域到clk-b中。
reg-5和reg-6其實也是兩個寄存器,用來把clk-b時鐘域的信號跨越到clk-a,這個信號將作為一個反饋信號,來實現(xiàn)展寬的邏輯,實現(xiàn)這個邏輯的,主要是那一個與門和一個或門。
具體的邏輯就不說了,只說說思想:這是一個邏輯反饋電路,和模擬電路中的電壓跟隨電路的思考方式不太一致。它的思考邏輯是,如果輸出還沒有得到邏輯1,那么輸入的邏輯1就要保持。但是我們很容易就看出來了,這個電路僅僅可以把一個 高電平脈沖 展寬。那么如何將一個低電平展寬呢?其實簡單的調(diào)整一下那個與門和或門的電路就可以了:
但是這仍然不是一個完全意義上的跨越時鐘域的邏輯。那么能不能做一個完整功能的電路呢?這就要考慮如何把上述這兩種展寬邏輯融合到一起。
4、融合這兩個電路,就必須先從原理上說清楚一件事情:低頻時鐘是無法完全去采樣高頻信號的,這里面一定會丟失信息。這是無法避免的。
如果reg-2的輸出是1,那么我認(rèn)為目前正在把邏輯1展寬,如果當(dāng)前reg-2的輸出是0,那么我認(rèn)為正在把邏輯0展寬。至于短時間內(nèi)頻繁的出現(xiàn)邏輯1和邏輯0,那么很可能會丟失某些狀態(tài),這也是我們上面說到的,不可避免的問題。
說到這里,是不是所有的事情都說完了呢?還沒有,至少我們的思考還不應(yīng)該結(jié)束。
5、如果一個信號需要跨越時鐘域,但是我們不知道哪個時鐘快,哪個時鐘慢,該怎么辦呢?期待你的奇思妙想。