使用異步FIFO同步源自不同時(shí)鐘域的數(shù)據(jù)是在數(shù)字IC設(shè)計(jì)中經(jīng)常使用的方法。在異步FIFO中,讀指針在讀時(shí)鐘域,寫指針在寫時(shí)鐘域,所以不能單獨(dú)運(yùn)用一個(gè)計(jì)數(shù)器去產(chǎn)生空滿信號(hào)了。因此,須要將寫指針同步到讀時(shí)鐘域去產(chǎn)生空信號(hào),將讀指針同步到寫時(shí)鐘域去產(chǎn)生滿信號(hào)。
對(duì)異步FIFO的讀、寫指針進(jìn)行判斷,我們首先需要將其同步到統(tǒng)一的時(shí)鐘域下,而這就引發(fā)出了新的問題—-讀、寫指針在大多數(shù)情況下都不是個(gè)單bit信號(hào),而是個(gè)多bit信號(hào)。如果讀、寫指針直接使用二進(jìn)制的形式進(jìn)行同步,則難以避免同步過程中會(huì)出現(xiàn)的多個(gè)bit信號(hào)同時(shí)變化的問題。如7(0111)跳轉(zhuǎn)到8(1000),此時(shí)有4個(gè)bit信號(hào)都發(fā)生了變化,如果直接同步,則由于不同信號(hào)之間的延遲(skew)差別,可能導(dǎo)致亞穩(wěn)態(tài)、錯(cuò)采、漏采等等問題。為解決因可能的skew問題造成的亞穩(wěn)態(tài)所以采用格雷碼異步FIFO,格雷碼每相鄰位之間只有一個(gè)比特的變化。FIFO的指針是遞增的,這使得在傳輸遞增的多bit信號(hào)時(shí),格雷碼具有天然的優(yōu)勢(shì)。
下圖為常見格雷碼異步FIFO組成框圖,包含四個(gè)主要部分。FIFO寫控制端用于判斷是否可以寫入數(shù)據(jù),讀控制端用于判斷是否可以讀取數(shù)據(jù),F(xiàn)IFO Memory用于存儲(chǔ)數(shù)據(jù),兩個(gè)時(shí)鐘同步模塊用于將讀寫時(shí)鐘進(jìn)行同步處理。
下圖為時(shí)鐘同步模塊的組成示意圖。寫操作時(shí),時(shí)鐘同步模塊先將寫地址指針轉(zhuǎn)換成格雷碼,然后通過兩級(jí)同步器(兩級(jí)同步在讀時(shí)鐘下進(jìn)行),將寫地址指針同步到讀時(shí)鐘域下;讀操作時(shí),時(shí)鐘同步模塊先將讀地址指針轉(zhuǎn)換成格雷碼,然后通過兩級(jí)同步器(兩級(jí)同步在寫時(shí)鐘下進(jìn)行),將讀地址指針同步到寫時(shí)鐘域下。
格雷碼異步FIFO解決了跨時(shí)鐘的數(shù)據(jù)同步化問題,但如果不額外約束還可能存在其他兩個(gè)問題;一是格雷碼各比特位延時(shí)不一致,導(dǎo)致同步器采樣的地址不符合gray規(guī)律,導(dǎo)致FIFO功能異常;二是格雷碼到兩級(jí)同步器的延時(shí)太大,導(dǎo)致異步FIFO性能下降。
為了解決上述兩個(gè)問題,一般采用set_max_delay來對(duì)寫操作時(shí)from point(寫地址格雷碼轉(zhuǎn)換模塊中的最后一個(gè)寄存器的時(shí)鐘端口)到to point(兩級(jí)同步器的第一級(jí)寄存器的數(shù)據(jù)端口)的max delay進(jìn)行約束;對(duì)讀操作時(shí)from point(讀地址格雷碼轉(zhuǎn)換模塊中的最后一個(gè)寄存器的時(shí)鐘端口)到to point(兩級(jí)同步器的第一級(jí)寄存器的數(shù)據(jù)端口)的max delay進(jìn)行約束;延時(shí)可設(shè)置為讀寫時(shí)鐘中最快時(shí)鐘周期的一半,也可以設(shè)置成源端時(shí)鐘的一半。例如:
set_max_delay [expr 0.5*$period_fast_clk] -from [get_pins “XX/waddr_gray_reg/CP”] -to [get_pins “XX/synchronizer_2x_r1/D”]
為了解決上述兩個(gè)問題,還會(huì)使用set_clock_groups -asynchronous將所涉及的讀寫時(shí)鐘設(shè)置為異步時(shí)鐘群組。這種約束和false path的區(qū)別很大;false path會(huì)認(rèn)為該path上的timing arc不用去分析時(shí)序、DRV(max trans、max cap 和max fanout 等)以及串?dāng)_噪聲情況,也就是說工具會(huì)認(rèn)為false path上的時(shí)序和信號(hào)質(zhì)量對(duì)設(shè)計(jì)功能沒影響;set_clock_groups -asynchronous也不分析兩個(gè)時(shí)鐘域之間的交互的path上時(shí)序情況,但是會(huì)分析該path上的timing arc的DRV和串?dāng)_噪聲情況,保證信號(hào)質(zhì)量。例如:
set_clock_groups -asynchronous -group clock1 -group clock2