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