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