作者:Rick Kelly,Synopsys研發(fā)經(jīng)理
2009年1月
為了確保擁有多個(gè)異步時(shí)鐘域的系統級芯片(Soc)能夠可靠運行,設計人員必須使這些跨越了多個(gè)域的時(shí)鐘和數據信號保持同步。盡管這并不屬于新提出的要求,但隨著(zhù)多時(shí)鐘域的越來(lái)越常見(jiàn)和復雜化,使得這一要求具備了新的重要意義。大規模集成加上對性能的嚴格要求以及頻率調節都導致在許多不同頻率下發(fā)生了很多時(shí)鐘域跨越現象-就像一場(chǎng)數字化的“完美風(fēng)暴”。
跨時(shí)鐘域(CDC)問(wèn)題會(huì )以許多種形式出現,其評估難度相當高。幸好,Synopsys DesignWare庫產(chǎn)品提供了許多卓越的CDC解決方案,這些方案應用簡(jiǎn)便,設計人員只需掌握在何時(shí)以及何處應用它們即可。
本文解釋了在時(shí)鐘和數據信號從一個(gè)時(shí)鐘域跨越到另一個(gè)時(shí)鐘域時(shí)所發(fā)生的許多類(lèi)型的同步問(wèn)題。在任何情況下,本文所包含的問(wèn)題都涉及到相互異步的時(shí)鐘域。隨著(zhù)每一個(gè)問(wèn)題的提出,本文將概述一個(gè)或多個(gè)DesignWare解決方案。這些主題和解決方案包括:
基本同步 — DW_sync
臨時(shí)事件同步 — DW_pulse_sync, DW_pulseack_sync
簡(jiǎn)單數據傳輸同步 — DW_data_sync, DW_data_sync_na, DW_data_sync_1c
數據流同步 — DW_fifo_s2_sf, DW_fifo_2c_df, DW_stream_sync
復位排序 — DW_reset_sync
相關(guān)時(shí)鐘系統數據同步 — DW_data_qsync_hl, DW_data_qsync_lh
當來(lái)自一個(gè)時(shí)鐘系統的信號將用作另一個(gè)與其不同步的時(shí)鐘系統的輸入時(shí),就需要對信號進(jìn)行同步以達成。而不進(jìn)行同步就無(wú)法達成時(shí)序收斂。圖1所示為采用一個(gè)單寄存器來(lái)同步至目的時(shí)鐘域的異步輸入。

伴隨這種方法會(huì )出現的一個(gè)問(wèn)題是,當一個(gè)觸發(fā)器的數據輸入處于邏輯0至邏輯1之間的過(guò)渡過(guò)程當中時(shí),發(fā)給這個(gè)觸發(fā)器時(shí)鐘信號時(shí)有可能產(chǎn)生亞穩態(tài)現象。亞穩態(tài)現象也有可能發(fā)生在觸發(fā)器的建立時(shí)間或保持時(shí)間出現違反現象時(shí)。解決亞穩態(tài)事件使其達至邏輯1或邏輯0所要求的時(shí)間量取決于建立時(shí)間或保持時(shí)間被違反的嚴重程度(圖2)。

Clock to Q delay 時(shí)鐘至Q延遲
FF Minimum specs 觸發(fā)器最小規格
當亞穩態(tài)事件持續時(shí)間長(cháng)至足以影響到下一個(gè)邏輯階段時(shí),同步器就發(fā)生了故障。故障間平均時(shí)間(MTBF)通常計算如下:

其中:
fclk 是采樣時(shí)鐘頻率
fdata 是數據變化頻率
tres 是解決亞穩態(tài)所允許占用的時(shí)間
T0和T1是與具體觸發(fā)器相關(guān)的常數(下文將進(jìn)一步敘述)
通常,由于在綜合時(shí)會(huì )嘗試在時(shí)序能夠滿(mǎn)足的條件下縮減門(mén)電路數以節省占用面積,所以設計人員無(wú)法控制至下一階段間的時(shí)間預算。為了保持穩定一致的解決用時(shí),設計人員可以采用一個(gè)2個(gè)觸發(fā)器組成的序列。但是,這種傳統解決方案肯定會(huì )增加時(shí)延。
在采用2個(gè)觸發(fā)器的解決方案,時(shí)鐘樹(shù)就以減去觸發(fā)器FF1的時(shí)鐘至Q延時(shí)后的時(shí)鐘周期以及FF2的建立時(shí)間要求為基礎。

對于有著(zhù)相對較高數據傳輸速率的高速應用來(lái)說(shuō),即使兩級同步器也有可能無(wú)法獲得足夠的MTBF,特別是在FPGA實(shí)現方案中。如果加入第3級,則只有在第1級在亞穩態(tài)保持了足夠長(cháng)的時(shí)間,導致侵占了FF2的建立時(shí)間的情況下,第2級才有可能發(fā)生亞穩態(tài)事件(圖3)。

Sampe MTBF test … MTBF測試電路示例
Error Counter 錯誤計數器
采用這一方法,MTBF可計算為:

T0和T1常數與所選用的具體觸發(fā)器相關(guān),并有可能從庫供應商處獲得。庫供應商會(huì )采用如圖4所示的電路來(lái)測定這些常數。錯誤計數器用于測量在輸入時(shí)鐘處于某一特定組合的輸入頻率下的MTBF。通過(guò)在不同頻率比率下讓此電路運行,就可以測定T0和T1的數值。

參見(jiàn)以下資料,可以了解更多有關(guān)亞穩態(tài)和MTBF計算的信息:
“確保亞穩態(tài)不會(huì )破壞您的數字設計方案”,作者:Debora Grosse, Unisys, EDN, 1994 http://www.edn.com/archives/1994/062394/13df2.htm
“數字系統亞穩態(tài)特性”,作者:Kleeman & Cantoni, IEEE Transactions on Computers, ol. C-36, No. 1, Jan., 1987
Google:MTBF亞穩態(tài)同步
另一個(gè)基本同步問(wèn)題涉及到掃描測試。掃描鏈經(jīng)常采用保持鎖存以確保在時(shí)鐘域之間實(shí)現正確的掃描切換。如果在掃描測試排序時(shí),讓最后一個(gè)掃描輸入循環(huán)后面直接跟一個(gè)捕獲循環(huán),且讓兩者的時(shí)鐘均由測試時(shí)鐘來(lái)驅動(dòng),則有可能無(wú)法正確捕獲到跨越時(shí)鐘域的功能信號(圖5)。在源側域之間插入一個(gè)鎖存器能夠提供1/2時(shí)鐘周期的延遲,確保了掃描測試期間的正確捕獲操作,從而解決了這個(gè)問(wèn)題。在不處于掃描模式時(shí),可由一個(gè)復用器將這個(gè)鎖存器旁路,實(shí)現正常功能運行。另一種解決方案是在較小型的時(shí)鐘域之間插入一個(gè)負邊沿觸發(fā)器。



對于基本同步來(lái)說(shuō),設計人員可以使用DesignWare的DW_sync組件,此組件有以下參數:
寬度
f_sync_type:級數
tst_mode:0 => 無(wú)保持,1=> 鎖存,2 => 負邊沿觸發(fā)器
verif_en (下文討論;不影響綜合)
在以f_sync_type參數指定了級數后,將獲得如圖6所示的配置方式之一。

有些時(shí)間,您需要在一個(gè)時(shí)鐘域內設置邏輯電路以告知另一個(gè)異步時(shí)鐘域內的邏輯電路,有某一特定事件已經(jīng)發(fā)生。一種方法是采用如圖7所示的方案,其中通過(guò)門(mén)選復位來(lái)清空源域內的脈沖。



在使用一個(gè)高電平有效的脈沖作為跨時(shí)鐘域事件的信號時(shí),這個(gè)脈沖的寬度必須足以確保采樣操作的完成,而且必須在脈沖之間存在明顯的無(wú)信號時(shí)間。為了避免采用脈沖拉伸機制,您可以使用不歸零(NRZ)信號發(fā)生方式,而不要使用歸零(RZ)信號發(fā)生方式。圖8所示為clk_d域是如何在后一種類(lèi)型的信號下捕獲變化的,這是一種在許多狀況下難于采用的方法。

Event in clk_s:clk_s內的事件
Return to …:Clk_d內捕獲的歸零信號
Captured in…:在clk-d內捕獲的信號
為了簡(jiǎn)化時(shí)鐘域之間的脈沖傳遞,可采用DW_pulse_sync雙時(shí)鐘脈沖同步器(圖9)。標為“clk_s”的虛線(xiàn)框內的邏輯電路運行在clk_s(源)時(shí)鐘域下,而標為“clk_d”的虛線(xiàn)框內的邏輯電路運行在clk_d(目的)時(shí)鐘域內。在域之間采用NRZ信號可以實(shí)現更高的事件處理流量,而且由于無(wú)需反饋,所要求的邏輯電路也較少。

Register…:可以通過(guò)parameter, reg_event在器件外配置寄存器
NRZ…:跨域的NRZ信號
Multiple…:多寄存器同步器
History…:用于檢測變化的歷史寄存器
Multiple …:多寄存器同步器
Multiple …:多寄存器同步器
Busy state…:忙碌狀態(tài)
NRZ feedback ack_delay=1:NRZ反饋ack_delay=1:

Multiple …:多寄存器同步器
Multiple …:多寄存器同步器
Busy state…:忙碌狀態(tài)
NRZ feedback ack_delay=1:NRZ反饋ack_delay=1:
如果需要反饋,則可以采用DW_pulseack_sync,這是一種帶有確認的脈沖同步器。如圖10所示,這個(gè)IP產(chǎn)品提供了一個(gè)NRZ反饋信號,能夠比無(wú)確認版本提供更高的事件處理流量。DW_pulseack_sync還提供了可配置的標志寄存器和反饋延時(shí)。
在從一個(gè)時(shí)鐘域跨越至另一個(gè)時(shí)鐘域時(shí),在目的時(shí)鐘對接近過(guò)渡狀態(tài)的總線(xiàn)進(jìn)行采樣時(shí),數據總線(xiàn)上有可能出現瞬時(shí)虛假數值(圖11)。例如,一條從11011001變?yōu)?1011010的8位總線(xiàn)上有3個(gè)位發(fā)生了改變。在所涉及的偏移存在時(shí)序上不確定性的情況下,就有會(huì )看到8個(gè)可能出現的數值: the initial value (11011001), the final value (01011010) and six possible intermediate values ( 11011000, 11011011, 11011010, 01011001, 01011000 and 01011011).

Source…:源總線(xiàn)
Destination clk:目的時(shí)鐘
1st …:第1個(gè)同步寄存器
2nd …:第2個(gè)同步寄存器
Intermediate value:過(guò)渡數值
Intermediate value:過(guò)渡數值
一種在同步數據總線(xiàn)時(shí)避免不想要的過(guò)渡數值的方法是,采用一個(gè)帶有確認的臨時(shí)事件同步器。這種邏輯可以采用以下次序對跨越時(shí)鐘邊界的數據進(jìn)行同步交換:保持數據,發(fā)送“請接受”,發(fā)回“已接受”,釋放數據寄存器。DW_pulseack_sync組件能夠發(fā)送必要的“請接受”和“已接受”事件。
而一種帶確認信號的數據總線(xiàn)同步器DW_data_sync能更好地完成此項任務(wù)。此IP消除了過(guò)渡虛擬數據,而且您可以對其進(jìn)行配置,提供臨時(shí)性的數據存儲能力(圖12)。

Optional …:可選用的臨時(shí)數據寄存器
Handshake…:同步交換邏輯
Send …:發(fā)送控制
在源時(shí)鐘比目的時(shí)鐘快得并不多(或根本相同)時(shí),提供一個(gè)確認信號的同步器可能會(huì )引發(fā)時(shí)延問(wèn)題。如果在應用當中時(shí)延具有關(guān)鍵性的意義,則應考慮采用一種“提前”確認方式,即通過(guò)設置參數ack_delay = 0來(lái)進(jìn)行配置。
如果源時(shí)鐘比目的時(shí)鐘快出很多,則可以同步確認信號,而且數據可以在不到目的時(shí)鐘1個(gè)周期內的時(shí)間內改變。在時(shí)延并非關(guān)鍵性問(wèn)題時(shí),最好采用默認的ack_delay = 1設置。如果沒(méi)有使用延遲,則在本地注釋塊內記錄此項附加說(shuō)明就是一種很好的處理方式。
以下是使用ack_delay = 0的通用規則[1]:
clk_d的周期不應當超過(guò)clk_s *的周期(r_sync_type – 0.25)
clk_s的頻率不應當超過(guò)clk_d *的頻率(f_sync_type – 0.25)
例如,在 f_sync_type = r_sync_type = 2, Fclk_d = 200 M Hz時(shí)
— Max Fclk_s = Fclk_d * (2 – 0.25)
— Max Fclk_s = 200 M Hz * 1.75 = 350 M Hz
如果確保目的時(shí)鐘速率超過(guò)了(Fclk_s * (f_sync_type + 1.25))[2],則可以使用更簡(jiǎn)單的信號同步體系。在目的時(shí)鐘較快的情況下,可以對“請接受”事件進(jìn)行同步,并在不到源域1個(gè)時(shí)鐘周期的時(shí)間內捕獲數據。因此,也就不需要發(fā)回“已接受”事件了。在需要最大程度地減少時(shí)延和/或不必要的邏輯電路時(shí),例如,在對一個(gè)實(shí)時(shí)時(shí)鐘寄存器進(jìn)行更新并將其內容發(fā)送到一個(gè)高速邏輯區塊時(shí),這種方法就較為實(shí)用。
為了實(shí)現這一方法,可以采用DesignWare的不帶確認的數據總線(xiàn)同步器DW_ data_sync_na(圖13)。此IP提供了比雙向數據同步更高的數據吞吐量以及更少的邏輯電路,但請牢記時(shí)鐘頻率要求[2]: Fclk_d ≥ Fclk_s * (f_sync_type + 1.25).

Event …:事件同步邏輯電路
如果在任一時(shí)刻,一條總線(xiàn)上只會(huì )有一個(gè)位發(fā)生改變(也就是格雷碼格雷碼過(guò)渡),則簡(jiǎn)單的多寄存器同步絕對不會(huì )引發(fā)過(guò)渡虛假數據。而在接近采樣時(shí)鐘時(shí)有一個(gè)位發(fā)生改變時(shí),第一個(gè)捕獲此位的寄存器有可能進(jìn)入亞穩態(tài),但這個(gè)位將會(huì )轉向新數值或舊有數值。
在諸如跨時(shí)鐘域監測計數器的應用當中,格雷碼總線(xiàn)就較為實(shí)用。計數器數值的格雷碼允許您使用較簡(jiǎn)單的同步技巧來(lái)在持續不斷的監測下達成更低的時(shí)延。
總線(xiàn)同步的另一種特殊情況涉及到一個(gè)您沒(méi)有訪(fǎng)問(wèn)權的源域clk_s。例如,您有可能要面對一個(gè)來(lái)自于沒(méi)有提供源時(shí)鐘的外界源的進(jìn)入芯片內的相對較慢的總線(xiàn)。由于電路板布線(xiàn)時(shí)延有可能導致位與位間的時(shí)序偏移超過(guò)單個(gè)時(shí)鐘周期,多寄存器同步就有可能遇到超過(guò)一個(gè)時(shí)鐘周期以上的過(guò)渡虛假數值。在這種情況下,您可以使用“歷史寄存器”來(lái)檢測數據所發(fā)生的變化,并決定何時(shí)將數據傳遞給芯片核心。

Last value:上一次的數值
New value:新數值
Control…:控制狀態(tài)機
Counter:計數器
High count:高位計數
針對這些情況,DesignWare提供了單時(shí)鐘過(guò)濾數據總線(xiàn)同步器DW_data_sync_1c(圖14)。此同步器可以消除存在高位間時(shí)序偏移特性的數據過(guò)渡中的過(guò)渡數值。
在跨時(shí)鐘域傳輸數據時(shí),請牢記數據傳輸與數據流之間的差別。在數據傳輸當中,在典型情況下不會(huì )長(cháng)時(shí)間維持背靠背(back-to-back)式的數據發(fā)送。數據同步設計可作為一個(gè)示例,例如采用DW_data_sync的設計方案。
而另一方面,數據流允許在設備提供的數據存儲能力的限制范圍內實(shí)現背靠背式的數據發(fā)送,例如采用FIFO。DesignWare Library內的雙時(shí)鐘FIFO依賴(lài)于雙端口RAM的使用(圖15)。源域內的推送邏輯電路負責將數據寫(xiě)入到RAM,而目的域內的彈出邏輯電路負責將數據從RAM讀取。

Push logic:推送邏輯電路
Pop logic:彈出邏輯電路
FIFO Controller:FIFO控制器
Push interface:推送接口
Pop interface:彈出接口
此設計采用了DesignWare組件DW_ffoctl_s2_sf和DW_ffo_s2_sf來(lái)實(shí)現一個(gè)帶有狀態(tài)標志位的同步(雙時(shí)鐘)FIFO(圖16)。自從1999年建立其體系架構以來(lái),這些組件一直在DesignWare Library IP內廣受歡迎。

Push logic:推送邏輯電路
Pop logic:彈出邏輯電路
FIFO Controller:FIFO控制器
Push interface:推送接口
Pop interface:彈出接口
實(shí)現狀態(tài)標志位的另一種方案是采用動(dòng)態(tài)標志位的雙時(shí)鐘FIFO,它采用DW_ ffo_2c_df和DW_ffoctl_2c_df組件(圖127)。除了動(dòng)態(tài)標志位支持以外,DW_ffoctl_2c_df提供了一些新特色(在DW_ffoctl_s2_sf提供的以外):
支持多RAM配置
來(lái)自RAM數據的重新定位
從雙側提供同步FIFO清空功能
提供來(lái)自RAM的讀取啟用信號

Pre-fetch cache:預取高速緩存
Push interface (…):推送接口(計數器和狀態(tài))
Pop …:彈出接口中(計數器和狀態(tài))
In-progress logic:順序執行邏輯
一些芯片向外部邏輯電路提供了一個(gè)將與數據共同返回至芯片的時(shí)鐘(圖18)。在這些應用當中,如何在最小時(shí)延的情況下讓數據流返回至芯片內的時(shí)鐘域呢?

Return clock:返回時(shí)鐘
Return …:返回數據有效
Return…:返回數據
Request clock:請求時(shí)鐘
Request information:請求信息
Master Chip:主芯片
Off-ship logic:芯片外邏輯電路

Event ….:事件同步邏輯電路
如果數據傳輸率足夠低,而且芯片擁有一個(gè)足夠快的內部時(shí)鐘(典型情況約為數據傳輸率的4倍左右),則可以采用DW_data_sync_na(圖19),并依靠過(guò)采樣來(lái)可靠地捕獲數據。
如果數據傳輸率過(guò)高,導致不能采用過(guò)采樣技巧來(lái)可靠處理數據,則需要采用一種具備某種數據存儲能力的方法,例如雙時(shí)鐘FIFO。您可能想要采用DW_ffo_2c_df和AW_ ffo_s2_sf組件,但是,這兩種組件存在著(zhù)額外邏輯電路的費用,還有比采用簡(jiǎn)單數據傳輸技巧更高的時(shí)延。
作為FIFO的替代方案,通過(guò)一定數量的DW_data_sync_na-type模塊對數據進(jìn)行解復用,然后在目的域內對它們進(jìn)行重新復用,其效果如何呢?圖20所示為這種數據流同步器方法的一種實(shí)現,即DW_stream_sync。此IP提供了比標準雙時(shí)鐘FIFO解決方案更低的時(shí)延和更少的邏輯電路。

Receive control:接收控制
Send control:發(fā)送控制
To …:至clk_s順序邏輯
To…:至clk_d順序邏輯
對于DW_stream_sync,深度(depth)參數控制著(zhù)解復用的通道數量。對于相干數據流來(lái)說(shuō),可將深度的數值設置為(f_sync_type + 2)。
只要您的設計滿(mǎn)足以下兩個(gè)條件,就可以將DW_stream_sync用于非相干數據流同步:具備了足夠的存儲能力,能夠采集由于時(shí)鐘差別所產(chǎn)生的松馳數據;以及數據流之間的間隙時(shí)間允許DW_stream_sync追上。
增加解復用通道的數量可以讓數據流在稍慢于數據流時(shí)鐘的目的時(shí)鐘下運行。在數據猝發(fā)時(shí),被數據占用的解復用通道的數量將逐步增加。在確定所要采種的解復用通道的數量時(shí),要考慮到頻率差別以及猝發(fā)規模。

Bubble …:輸出數據內的泡沫代表著(zhù)源時(shí)鐘速率與目的時(shí)鐘速率之間的差別
在數據流傳輸率低于目的時(shí)鐘率時(shí),DW_stream_sync會(huì )偶然生成一個(gè)輸出端沒(méi)有數據的周期(圖21)。但是,如果正確地設置了預填充數值(通過(guò)prefll_lvl參數)以及深度(depth)參數,則DW_stream_sync可以同時(shí)稍微加快和稍微放慢地處理輸入的數據流。此項能力對于提高數據源會(huì )在一些較小誤差范圍內變動(dòng)時(shí)的互操作性是實(shí)用的。
特殊情況-復位/清零
DesignWare Library內有幾種類(lèi)型的IP可以幫助您處理跨時(shí)鐘域事件同步時(shí)的特殊問(wèn)題。這些問(wèn)題當中包括了對復位和清零信號的控制。
如果一個(gè)FIFO控制器的目的側在源側之間進(jìn)行了清零和釋放,則目的地有可能依據舊的指針信息而采取行動(dòng)。您可以通過(guò)采用一個(gè)復位序列同步器DW_reset_sync來(lái)防止此類(lèi)問(wèn)題的發(fā)生(圖22)。此IP能夠正確地為源域和目的域內的邏輯電路的同步清零設定次序,以確??諣顟B(tài)或閑置狀態(tài)的產(chǎn)生。

Source …:源側控制
Dest. …:目的側控制
DW_reset_sync能夠采用源側或目的側啟動(dòng)的清零操作來(lái)控制源域和目的域的邏輯清零的正確序列。圖23所示是源側啟動(dòng)方法的時(shí)序,側圖24所示為目的側方法。


一些設計采用了源自于同一個(gè)主時(shí)鐘的多個(gè)時(shí)鐘域。如果您通過(guò)時(shí)鐘樹(shù)限制了時(shí)鐘偏移現象,則可以采用一種高效的方法來(lái)跨越這種時(shí)鐘邊界來(lái)獲取數據。
Source …:源側捕獲寄存器
(high …):高速域
Destination …:目的側捕獲寄存器


Source …:源側捕獲寄存器
(high …):高速域
Destination …:目的側捕獲寄存器
具體來(lái)說(shuō),DW_data_qsync_lh提供了一種可用于低頻至高頻時(shí)鐘的準同步數據接口(圖25)。換句話(huà)說(shuō),數據從較慢的源域發(fā)送至較快的目的域。如果時(shí)鐘比率為2,則目的域的第一個(gè)觸發(fā)器將是一個(gè)負邊沿觸發(fā)器。否則,所有觸發(fā)器(兩個(gè)域內)均為正邊沿型。
圖26所示為采用DW_data_qsync_lh進(jìn)行數據傳輸時(shí)的時(shí)序。正如此時(shí)序圖所示,IP確保了在時(shí)鐘相關(guān)以及目的時(shí)鐘快于源時(shí)鐘時(shí)的同步數據傳輸。

Internal …:內部輸入捕獲寄存器
Previous data:以前的數據

(low-speed domain):低速域
Control …:控制狀態(tài)機
Timing reference:時(shí)序基準

圖27 用于低頻至高頻時(shí)鐘的準同步數據接口DW_data_qsync_hl
如果您必須從較快的目的域向較慢的源域傳輸數據,則采用另一個(gè)IP產(chǎn)品DW_data_qsync_hl可讓您安全地管理好時(shí)序。這個(gè)適用于低頻至高頻時(shí)鐘的準同步數據接口采用了一個(gè)時(shí)序基準信號來(lái)決定數據變化用的正確時(shí)刻(圖27)。如上所示,如果時(shí)序比率為2,則實(shí)現方案采用負邊沿觸發(fā)器,但在這一情況下,是源域內用于采樣來(lái)自目的域時(shí)序基準信號的觸發(fā)器采用負邊沿觸發(fā)器。圖28所示為一個(gè)DW_data_qsync_hl運行時(shí)的時(shí)序圖。

Previous data:以前的數據
在兩個(gè)或多個(gè)信號只采用多個(gè)寄存器(例如DW_sync)進(jìn)行同步,并且隨后這些信號在目的時(shí)鐘域內組合成單一邏輯表達時(shí)(圖29),才存在跨時(shí)鐘域收斂的問(wèn)題。

Signal A …:信號A邏輯電路
Signal B …:信號B邏輯電路
Clk_s …:clk_s域
Multiple …:多寄存器同步器
Logic combines …:組合了來(lái)自clk_s域信號的邏輯電路
Clk_d …:clk_d域
即使諸如Synopsys的Leda這樣的代碼檢查工具能夠識別出CDC收斂的實(shí)例,但這些工具卻不能決定這種收斂是否代表著(zhù)一種功能上的錯誤。其潛在問(wèn)題是,依靠多寄存器同步器的統一均勻時(shí)延的狀態(tài)機的設計有可能在芯片上不能正確運行。
正常的仿真并不能揭示出這種問(wèn)題,因為多寄存器同步器在仿真時(shí)每一次均會(huì )表現出完全相同的時(shí)延。而在真實(shí)情況下,在信號變化與采樣時(shí)鐘配合起來(lái)后,其變化有時(shí)候會(huì )通過(guò)N個(gè)時(shí)鐘的N級同步而傳遞下去,而在其它時(shí)候這些變化要用掉N+1個(gè)時(shí)鐘。除了MTBF非常低以外,這種問(wèn)題在芯片上發(fā)生得并不頻繁,所以,可能只有在幾周運行后才能發(fā)覺(jué)。
一種檢測這種誤采樣問(wèn)題的方式是在仿真時(shí)采用一種特殊的觸發(fā)器模型(圖30)。但是,正如真實(shí)世界一樣,只有在采樣觸發(fā)器發(fā)生違反現象時(shí),這些仿真才會(huì )顯示出問(wèn)題,這也是一種極少發(fā)生的現象。您將需要占用大量的仿真時(shí)間才能合理地確認沒(méi)有收斂問(wèn)題的存在。

Clock …:時(shí)鐘至Q延遲
+Noise:噪聲
Metastability …:亞穩態(tài)觸發(fā)器模型
一種更好的方法是采用一個(gè)包含了一個(gè)復用器的誤采樣模型。這種方法是基于認識到,在目的邏輯電路對一個(gè)正在變化的位進(jìn)行采樣時(shí),所捕獲的最終數值只有可能是兩種可能數值之一,即:最新輸入數值或來(lái)自以前周期的輸入數值。而在同步器的第一個(gè)觸發(fā)器前設置一個(gè)復用器時(shí),就可以通過(guò)控制這個(gè)復用器來(lái)建立誤采樣行為的模型(圖31)。

Missample …:誤采樣控制
Synchronizer input:同步器輸入
History …:歷史寄存器
Two …:兩級同步
Sychronizer output:同步器輸出
這個(gè)誤采樣方法已經(jīng)內嵌于DW_sync組件之內以及所有其它采用了DW_sync的DesignWare CDC IP。
在運行當中,由一個(gè)偽隨機數字發(fā)生器來(lái)提供對每一個(gè)同步器輸入位的隨機控制。對于Verilog仿真,可定義一個(gè)采用以下特征的宏: vcs +defne+DW_MODEL_MISSAMPLES…
對于VHDL,采用 …_cfg_sim_ms配置:
對于U1:DW_sync采用配置dw03.DW_sync_cfg_sim_ms; end for;
您可通過(guò)設置參數verif_en = 0而按照每一個(gè)實(shí)例的具體情況禁用此項特征。如表1所示,您還有其它兩種verif_en選擇方案。圖32所示為verif_en = 1時(shí)的DW_sync的誤采樣原理框圖。
verif_en數值 0 1 2
時(shí)延(周期) ?_sync_type ?_sync_type to ?_sync_type + 1 ?_sync_type to ?_sync_type + 3

Width:寬度
Width:寬度
To …:至第1級同步觸發(fā)器
Random …:隨機數發(fā)生器
Random …:隨機數發(fā)生器
請牢記,在輸入時(shí)序偏移很大時(shí),誤采樣有可能在多個(gè)時(shí)鐘周期內持續存在-只能在使用DW_data_sync_1c的芯片外數據同步情況下才可經(jīng)常見(jiàn)到。在設置verif_en = 2時(shí),DesignWare Library CDC組件可以通過(guò)多達3個(gè)時(shí)鐘周期來(lái)“模糊”數據過(guò)渡現象。圖33所示為這種情況下的誤采樣原理框圖。從4個(gè)可能選項之中選擇2位隨機數值,其中包括了串聯(lián)的3個(gè)歷史寄存器。

Width:寬度
Width:寬度
To …:至第1級同步觸發(fā)器
Random …:隨機數發(fā)生器
Random …:隨機數發(fā)生器
DW_sync內所采用的誤采樣模型也可以用于建立在對同一時(shí)刻有一個(gè)以上位發(fā)生變化的總線(xiàn)進(jìn)行采樣時(shí)有可能出現的瞬態(tài)虛假數據的模型。如果認為自己的設計不會(huì )受這些虛假數值的影響,則可以通過(guò)采用這種誤采樣建模方法來(lái)加強自己的信心。DW_ sync可以隨機為每一個(gè)總線(xiàn)位選擇舊數值或新數值來(lái)生成過(guò)渡數值(圖34)。

Source …:源總線(xiàn)
Destination …:目的總線(xiàn)
1st …:第1個(gè)同步寄存器
2nd …:第2個(gè)同步寄存器
Intermediate:過(guò)渡數值
Intermediate:過(guò)渡數值
由于誤采樣在實(shí)際運行中發(fā)生頻度極低(除非在MTBF非常低的情況下),通常您必須等上很長(cháng)時(shí)間才能見(jiàn)到與CDC機制相關(guān)的問(wèn)題。此模型采用了DW_sync,通過(guò)造成誤采樣行為的頻繁發(fā)生來(lái)惡化這種問(wèn)題。具體來(lái)說(shuō),在一次誤采樣延時(shí)當中,DW_sync的每一位均通過(guò)了50%的數據過(guò)渡現象。這樣,如果在一個(gè)合理數量的CDC事務(wù)處理內對DW_sync誤采樣建模的系統仿真成功的話(huà),則您可非常確保實(shí)際芯片內不會(huì )發(fā)生CDC問(wèn)題。
與CDC同步相關(guān)的另一個(gè)特殊問(wèn)題是多寄存器同步器向技術(shù)單元的映射。在Design Compiler將兩個(gè)觸發(fā)器映射到一個(gè)目標庫的同一行上時(shí),此工具會(huì )不可避免地選擇能夠滿(mǎn)足時(shí)序限制條件的最小面積的單元,而不是對同步最好的觸發(fā)器。因此,您通常想要通過(guò)手動(dòng)方式或通過(guò)腳本方式用已知的“亞穩態(tài)強化”觸發(fā)器來(lái)替代這些觸發(fā)器。
自DesignCompiler的B-2008.09版本開(kāi)始,您就可以指定一個(gè)或多個(gè)“亞穩態(tài)強化”觸發(fā)器在DesignWare CDC組件向您目標技術(shù)的映射中自動(dòng)應用了。此項能力是通過(guò)將“synlib_preferred_ffs” DC變量賦予技術(shù)單元名稱(chēng)列表而達成的。例如,如果您的技術(shù)庫包含了名稱(chēng)為FFSYNCFD1和FFSYNCFD2的已認定為“亞穩態(tài)強化”的兩個(gè)不同觸發(fā)器時(shí),則以下命令將實(shí)現這些單元的正確映射:
set synlib_preferred_ffs “FFSYNCFD1 FFSYNCFD2”
請注意,此DC變量的數值是一個(gè)單獨的文本串,則不是一個(gè)Tcl列表,而且此機制目的只支持單個(gè)觸發(fā)器技術(shù)單元。
對于B-2008.09前的Design Compiler來(lái)說(shuō),您可以使用Tcl腳本來(lái)查找您設計中的DW_sync同步器寄存器,并用用戶(hù)指定的觸發(fā)器實(shí)例來(lái)替代它們。我們可按您的請求提供示例腳本。
在采用具備提前確認功能的DW_data_sync組件時(shí),設計人員需要意識到,在源時(shí)鐘快至足以對提前確認進(jìn)行同步并且在目的域能夠捕獲到給出確認的數據之前就更新了數據寄存器時(shí),就會(huì )存在運行風(fēng)險。
在源時(shí)鐘校準至其上升沿緊跟著(zhù)用于產(chǎn)生提前確認信號的目的時(shí)鐘上升沿時(shí),就會(huì )發(fā)生最差情景下的場(chǎng)景。在這種情況下,第一個(gè)確認同步寄存器會(huì )立刻捕獲到這個(gè)確認信號,而這個(gè)確認信號才剛剛維持住,而且新數據得到最快速的應用(由于確認信號的原因)。這種危險情況以下面的圖中進(jìn)行了說(shuō)明,圖中采用了一個(gè)位于DW_data_sync內帶有提前確認(即,ack_delay參數設置為零)的兩級同步(也就是r_sync_type參數設置為2)的設計方案。

Synchronization ….:在ack_delay=0, r_sync_type=2以及clk_s過(guò)快時(shí)的同步危險情況
Internal …:內部確認信號
Internal data to capture:要捕獲的內部數據
New data:新數據
Ack …:clk_s確認同步器的第一級剛剛檢測到時(shí),確認信號就發(fā)出了(在clk_d內)
Second …:確認同步器的第二級檢測到這個(gè)確認信號
Data …:在新數據由clk_s取得時(shí),數據由clk_d捕獲到
因此,以下公式必須保持為真:
更方便的形式是:
如果時(shí)鐘抖動(dòng)和保持時(shí)間均考慮在內,則最差情況下的時(shí)序調校情況會(huì )是,在一個(gè)正在內部發(fā)出的確認信號存在clk_d內最早的峰值間抖動(dòng)時(shí),與此同時(shí),存在抖動(dòng)的clk_s在最遲可能的峰值間時(shí)刻發(fā)出一個(gè)上升沿。這樣,最遲可能的峰值間抖動(dòng)clk_d就需要發(fā)生在比最早的峰值間抖動(dòng)clk_s更早的位置,且領(lǐng)先幅度至少為寄存器捕獲data_d所要求的保持時(shí)間。

Add …:增加時(shí)鐘抖動(dòng)(不確定性)以及必要的數據捕獲保持時(shí)間
Internal …:內部確認信號
因此,以下公式必須保持為真:

更方便的形式時(shí):

Internal …:要捕獲的內部數據
Hold time:保持時(shí)間
New data:新數據
因此,以下公式必須保持為真:

采用更方便的形式時(shí):

Pclk_d:clk_d的周期
Pclk_s:clk_s的周期
Fclk_d:clk_d的頻率
Fclk_s:clk_s的頻率
r_sync_type:同步級數
Jclk_d:Clk_d的峰值間抖動(dòng)
Jclk_s:Clk_s的峰值間抖動(dòng)
Thold:數據寄存器的保持時(shí)間要求
這些計算以下列假設為基礎:
1) 在其抖動(dòng)窗口內最遲可能位置處發(fā)生的clk_d的上升沿位于處于其盡早可能位置的clk_s上升沿之后一個(gè)周期的可能性不為零。
2) 發(fā)生在其抖動(dòng)窗口內其最早可能位置的clk_s的某個(gè)上升位于其最遲可能位置處的clk_s的上升沿后N個(gè)周期的可能性不為零(其中N為所采用的同步級數,也就是,N = r_sync_type)。
如果所給出的公式受限過(guò)多,而且可以精確地測定出clk_s和clk_d的最大周期間掉抖動(dòng)時(shí),則可以使用如下的Jclk_s和Jclk_d定義。


Synchronization ….:在clk_s不夠快時(shí),DW_data_sync_na所發(fā)生的同步危險
Internal data change flag:內部數據改變標志
Internal …:要捕獲的內部數據
New data:新數據
- Data…:數據已在內部捕獲,數據改變標志位切換,指示新數據可用
- First ….:數據改變標志同步器的第一級幾乎錯失掉數據標志位的改變
First stage …:數據改變標志同步器的第一級檢測到此改變
Second …:數據改變標志同步器的第二級檢測到此改變
Data captured …:數據由clk_d所捕獲,同時(shí)新數據也由clk_s進(jìn)行了內部緩存
如果考慮到時(shí)鐘抖動(dòng)和保持時(shí)間,最差情況下的時(shí)序調校將是,內部數據標志位的變化發(fā)生在處于其峰值間抖動(dòng)最遲位置的clk_s上升沿,此時(shí)(在同一時(shí)間)有一個(gè)clk_d的上升沿處于其峰值間抖動(dòng)的最早可能位置。這樣,對于處于其峰值間抖動(dòng)最早可能位置的緊跟著(zhù)的下一個(gè)clk_s上升沿來(lái)說(shuō),其發(fā)生時(shí)間就需要比處于峰值間抖動(dòng)最遲可能位置的clk_d上升沿遲出至少寄存器捕獲data_d所要求的保持時(shí)間。

Adding …:添加時(shí)鐘抖動(dòng)(不確定性)以及必要的數據捕獲保持時(shí)間
Internal …:內部數據改變標志位
Internal data …:要捕獲的內部數據
New …:新數據
Hold …:保持時(shí)間
因此,如下公式必須保持為真:

更為方便的形式是:

Pclk_d:clk_d的周期
Pclk_s:clk_s的周期
Fclk_d:clk_d的頻率
Fclk_s :clk_s的頻率
f_sync_type :同步級數
Jclk_d:Clk_d的峰值間抖動(dòng)
Jclk_s:Clk_s的峰值間抖動(dòng)
Thold :數據寄存器的保持時(shí)間要求
這些計算以下列假設為基礎:
1) 在其抖動(dòng)窗口內最早可能位置處發(fā)生的clk_d的上升沿位于處于其最遲可能位置的clk_s上升沿之后一個(gè)周期的可能性不為零。
2) 發(fā)生在其抖動(dòng)窗口內其最遲可能位置的clk_d的上升沿位于最早可能位置處的clk_d的上升沿后N個(gè)周期的可能性不為零(其中N為所采用的同步級數加1,也就是,N = f_sync_type+1)。
如果所給出的公式受限過(guò)多,而且可以精確地測定出clk_s和clk_d的最大周期間掉抖動(dòng)時(shí),則可以使用如下的Jclk_s和Jclk_d定義。

聯(lián)系客服