孫遠(yuǎn)航,李彧,倪曉波,孫增振
(網(wǎng)絡(luò)通信與安全紫金山實(shí)驗(yàn)室,江蘇南京,211100)
隨著芯片的集成度的提高,其接口種類越來越多功能也變得越來越強(qiáng)大。近年來芯片設(shè)計(jì)越來越復(fù)雜,突出表現(xiàn)為時(shí)鐘越來越快,時(shí)鐘域多,跨時(shí)鐘交互越來越復(fù)雜。如果這些跨時(shí)鐘CDC(Clock Domain Crossing)的地方處理得不當(dāng),那么對(duì)于整個(gè)芯片來說可能是災(zāi)難性的。而隨著近年來芯片研發(fā)的成本越來越大,其所造成的經(jīng)濟(jì)損失也是非??捎^的。所以這就使得在芯片設(shè)計(jì)時(shí)必須很謹(jǐn)慎地去分析與對(duì)待異步信號(hào)跨時(shí)鐘域的問題,在設(shè)計(jì)時(shí)就將問題考慮充分,避免這類問題影響芯片整體的功能及可靠性。本文重點(diǎn)介紹幾種典型的CDC 處理錯(cuò)誤,并給出相應(yīng)的處理方法。
亞穩(wěn)態(tài)指的是觸發(fā)器無法在一個(gè)規(guī)定的時(shí)間達(dá)到一個(gè)確定的狀態(tài),當(dāng)觸發(fā)器進(jìn)入亞穩(wěn)態(tài),我們既無法預(yù)測(cè)其輸出的電平,也無法預(yù)測(cè)其何時(shí)才能穩(wěn)定地輸出正確的電平[1]。
在亞穩(wěn)態(tài)期間,觸發(fā)器輸出一些中間級(jí)電平,并且這種電平可以延通路傳播,如圖1(a)所示,其產(chǎn)生的原因是由于信號(hào)在時(shí)鐘觸發(fā)沿的判決窗口沒有保持穩(wěn)定,導(dǎo)致觸發(fā)器中鎖存信號(hào)的電容充電不足,從而使得觸發(fā)器需要花很長(zhǎng)的時(shí)間才能使輸出信號(hào)達(dá)到標(biāo)準(zhǔn)電平,使電路“反應(yīng)”變遲鈍。同步器是處理 CDC 問題時(shí)所采用的主要器件,其通常由兩個(gè)級(jí)聯(lián)的觸發(fā)器組成[2~3],如圖1(b) 所示。
圖1 亞穩(wěn)態(tài)及同步器示意圖
常用的CDC 處理方法,分別是信號(hào)同步器[4]、多周期路徑MCP(Multi-Cycle Path)同步法、握手協(xié)議[5~6]以及異步FIFO[7~9]。
這4 種信號(hào)跨時(shí)鐘域的方法在我們的設(shè)計(jì)中都有使用,具體使用哪一種方法需要對(duì)應(yīng)具體情況進(jìn)行分析,在對(duì)于跨時(shí)鐘信號(hào)是單bit 信號(hào)的時(shí)候推薦使用信號(hào)同步器來實(shí)現(xiàn);在對(duì)應(yīng)跨時(shí)鐘信號(hào)是總線仲裁類或者緩變化bus 型數(shù)據(jù)時(shí)推薦使用多周期路徑同步法或者握手協(xié)議來實(shí)現(xiàn);當(dāng)需要跨時(shí)鐘的是主數(shù)據(jù)路徑時(shí),例如一些接口協(xié)議需要做速率四配時(shí),推薦使用異步 FIFO 來處理[8~9]。
前面一節(jié)主要介紹了一些信號(hào)數(shù)據(jù)跨時(shí)鐘的方法,下面介紹一些在設(shè)計(jì)中常見的跨時(shí)鐘處理錯(cuò)誤,并分析其錯(cuò)誤的原因和改正的方法[8~9]。
組合邏輯輸出容易由于競(jìng)爭(zhēng)現(xiàn)象等原因出現(xiàn)毛刺,而這些毛刺再經(jīng)過同步器跨時(shí)鐘處理時(shí)可能會(huì)導(dǎo)致一些邏輯功能上的錯(cuò)誤,如圖2(a)所示。比較好的處理方式是先將信號(hào)進(jìn)行組合處理之后再用寄存器在源時(shí)鐘域下將數(shù)據(jù)拍出,保證數(shù)據(jù)進(jìn)入同步器之前的路徑是“干凈”的。如圖2(b)所示,這樣就可以避免毛刺對(duì)同步器造成不好的影響。
圖2 組合邏輯跨時(shí)鐘處理
在設(shè)計(jì)中有時(shí)會(huì)對(duì)同一個(gè)信號(hào)在多處作跨時(shí)鐘處理,這是非常危險(xiǎn)的。表面上看每一路同步路徑都是安全的,但是由于需要跨時(shí)鐘的信號(hào)扇出到不同同步器之間的走線延時(shí)不一致,如圖3(a)所示,td這個(gè)延時(shí)會(huì)導(dǎo)致同樣的一個(gè)信號(hào)到達(dá)不同同步器第一級(jí)寄存器的時(shí)刻不一致,便導(dǎo)致不同同步器第一級(jí)寄存器是否會(huì)進(jìn)入亞穩(wěn)態(tài)的不確定,以及從亞穩(wěn)態(tài)退出時(shí)輸出的信號(hào)電平值不確定。這與我們的設(shè)計(jì)預(yù)期是不一致的,如果忽略了這種潛在的威脅,那么對(duì)我們?cè)O(shè)計(jì)的功能可能會(huì)產(chǎn)生不良的影響。特別是對(duì)于一個(gè)要扇出到多個(gè)子系統(tǒng)的異步信號(hào)來說,這種同步后的不確定性可能會(huì)導(dǎo)致子系統(tǒng)對(duì)同一信號(hào)的處理存在差異導(dǎo)致整個(gè)系統(tǒng)的功能錯(cuò)誤,并且這種錯(cuò)誤在實(shí)際定位時(shí)是很難被定位到,也是很容易被忽略的。
圖3 同一信號(hào)在兩處作跨時(shí)鐘處理
解決這類問題的方法是,對(duì)于多個(gè)子系統(tǒng)都可能用到的異步信號(hào)在一個(gè)地方統(tǒng)一作跨時(shí)鐘處理。然后再將這個(gè)同步過的信號(hào)扇出到多個(gè)模塊中去,這樣就能夠保證多個(gè)子模塊中所用到的跨時(shí)鐘信號(hào)是同步的,保證功能的同步性,如圖3(b)所示。
信號(hào)跨時(shí)鐘后有邏輯耦合,這類問題在我們的設(shè)計(jì)中也時(shí)有出現(xiàn),如圖4(a)所示。其帶來的主要影響和上一類問題類似,兩個(gè)異步信號(hào)在做完跨時(shí)鐘處理之后他們之間的時(shí)序關(guān)系有可能與我們預(yù)期的不一致,從而導(dǎo)致功能上的錯(cuò)誤,所以這類問題在我們的設(shè)計(jì)中也應(yīng)該避免。
圖4 信號(hào)跨時(shí)鐘后有邏輯耦合
圖5 全握手協(xié)議
其解決方法是首先在異步時(shí)鐘域中將相互有邏輯關(guān)系的信號(hào)“合并”為單 bit 信號(hào),再將這個(gè)單bit 信號(hào)做跨時(shí)鐘域處理如圖4(b)所示。
握手協(xié)議是處理總線類信號(hào)跨時(shí)鐘域的方法之一,這種方法的優(yōu)點(diǎn)是結(jié)構(gòu)簡(jiǎn)單且十分安全,收發(fā)側(cè)都要根據(jù)對(duì)端發(fā)出的請(qǐng)求或響應(yīng)信號(hào)來進(jìn)行bus 型信號(hào)跨時(shí)鐘域處理。如圖5所示全握手協(xié)議的演示過程[6]。
全握手協(xié)議的特點(diǎn)是,在收發(fā)兩端在發(fā)送請(qǐng)求或者終止請(qǐng)求之前都需要等待對(duì)端的回應(yīng)。全握手協(xié)議在異步數(shù)據(jù)跨時(shí)鐘的安全性能方面很強(qiáng)健,因?yàn)橥ㄟ^檢測(cè)請(qǐng)求與響應(yīng)信號(hào),每一側(cè)電路都清楚地知道對(duì)端的狀態(tài)。但是這種方式也有其不足,那就是完成所有交互的整個(gè)過程要花費(fèi)很多長(zhǎng)鐘周期,數(shù)據(jù)信號(hào)跨時(shí)鐘的延時(shí)比較大。所以在具體使用時(shí)會(huì)對(duì)握手路徑進(jìn)行“優(yōu)化”,減少反饋路徑的寄存器級(jí)數(shù)是一種優(yōu)化方法,如圖6 所示,其中反饋路徑遷移一級(jí),減少了反饋路徑的延時(shí)。但是這種優(yōu)化是存在局限性的,那就是發(fā)送側(cè)的時(shí)鐘頻率必須小于接收側(cè)時(shí)鐘頻率。如果接收側(cè)時(shí)鐘頻率大于接收側(cè)的3 倍以上則會(huì)出現(xiàn)接收側(cè)還未將數(shù)據(jù)總線上的數(shù)據(jù)采樣發(fā)送側(cè)就將數(shù)據(jù)更新覆蓋的情況。類似的這些問題在設(shè)計(jì)和優(yōu)化CDC 路徑時(shí)很容易被忽視的。這就需要我們?cè)趯懘a之前仔細(xì)分析CDC 路徑并且考慮所設(shè)計(jì)的方法對(duì)兩端時(shí)鐘頻率是否敏感,如果所設(shè)計(jì)的方法對(duì)于應(yīng)用場(chǎng)景有特定的限制那么在代碼中也應(yīng)該有相應(yīng)的注釋,以防止后面別人改寫代碼時(shí)沒有考慮全面導(dǎo)致功能錯(cuò)誤。
圖6 握手協(xié)議反饋路徑“前移”
對(duì)于一些異步時(shí)鐘以及跨時(shí)鐘的數(shù)據(jù)、地址以及使能信號(hào)在命名時(shí)要明確的顯示出其所在的時(shí)鐘域,例如mac_clk、pcs_clk、mac_data,mac_addr 等。
這樣做的好處是在使用一些靜態(tài)時(shí)鐘分析工具時(shí)可以更方便快捷的進(jìn)行時(shí)序分析。當(dāng)然這個(gè)建議也是相對(duì)性的,比如一些top 級(jí)的模塊不可能做到完全一個(gè)時(shí)鐘域。
在設(shè)計(jì)中要對(duì)所涉及的CDC 信號(hào)進(jìn)行分類,它們是多bit 還是單bit;多bit 是否能化簡(jiǎn)合并為單bit;是控制信號(hào)還是數(shù)據(jù)信號(hào);對(duì)兩側(cè)時(shí)鐘頻率變化是否敏感;跨時(shí)鐘數(shù)據(jù)是緩變的還是突發(fā)的等等。劃分得越細(xì)越好,對(duì)于這些不同種類的CDC 信號(hào)采取相對(duì)應(yīng)的方法進(jìn)行處理。
從前面提到的對(duì)握手協(xié)議優(yōu)化的案例可以看出,對(duì)CDC相關(guān)的代碼進(jìn)行繼承和優(yōu)化時(shí)需要特別的謹(jǐn)慎,因?yàn)槿绻褂铆h(huán)境的大前提發(fā)生了變化(例如跨時(shí)鐘場(chǎng)景從慢到快變?yōu)閺目斓铰┛赡軙?huì)造成繼承或優(yōu)化的代碼無法達(dá)到設(shè)計(jì)的預(yù)期。
本文主要介紹了 RTL 設(shè)計(jì)中的 CDC 問題,分析了亞穩(wěn)態(tài)產(chǎn)生的原因以及解決的方法。重點(diǎn)介紹了在設(shè)計(jì)中常用的4 種信號(hào)跨時(shí)鐘的處理方法,并分析了一些設(shè)計(jì)中處理異步信號(hào)時(shí)常見的錯(cuò)誤并給出了相應(yīng)的改進(jìn)意見,最后給出了幾個(gè)處理CDC 信號(hào)的實(shí)用建議。CDC 問題在設(shè)計(jì)中雖然不起眼,但是業(yè)界中很多失敗的案例都是由它引起的,特別是現(xiàn)在先進(jìn)設(shè)計(jì)中可能會(huì)用到先進(jìn)工藝、邏輯規(guī)模又異常大,從而導(dǎo)致成本非常高。同時(shí)也正是由于這些問題不起眼,在驗(yàn)證與時(shí)序分析階段有時(shí)很難定位和發(fā)現(xiàn)這類問題,所以對(duì)于RTL 開發(fā)來說,作為芯片設(shè)計(jì)的最前端應(yīng)該把這類問題消滅在源頭,這對(duì)于時(shí)間和成本來說都是最劃算的。