《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 可編程邏輯 > 解決方案 > 【Vivado使用誤區(qū)與進(jìn)階】XDC約束技巧——CDC篇

【Vivado使用誤區(qū)與進(jìn)階】XDC約束技巧——CDC篇

2015-03-05
關(guān)鍵詞: Xilinx 約束技巧 CDC

上一篇《XDC約束技巧之時(shí)鐘篇》介 紹了XDC的優(yōu)勢(shì)以及基本語(yǔ)法,,詳細(xì)說(shuō)明了如何根據(jù)時(shí)鐘結(jié)構(gòu)和設(shè)計(jì)要求來(lái)創(chuàng)建合適的時(shí)鐘約束,。我們知道XDC與UCF的根本區(qū)別之一就是對(duì)跨時(shí)鐘域路徑 (CDC)的缺省認(rèn)識(shí)不同,,那么碰到FPGA設(shè)計(jì)中常見(jiàn)的CDC路徑,,到底應(yīng)該怎么約束,在設(shè)計(jì)上又要注意些什么才能保證時(shí)序報(bào)告的準(zhǔn)確性,?

CDC的定義與分類

CDC是Clock Domain Crossing的簡(jiǎn)稱,,CDC時(shí)序路徑指的是起點(diǎn)和終點(diǎn)由不同時(shí)鐘驅(qū)動(dòng)的路徑。在電路設(shè)計(jì)中對(duì)這些跨時(shí)鐘域路徑往往需要進(jìn)行特別的處理來(lái)避免亞穩(wěn)態(tài)的產(chǎn)生,,例如使用簡(jiǎn)單同步器、握手電路或是FIFO來(lái)隔離,。

安全的CDC路徑

所謂安全的CDC路徑是指那些源時(shí)鐘和目標(biāo)時(shí)鐘擁有相同的來(lái)源,,在FPGA內(nèi)部共享部分時(shí)鐘網(wǎng)絡(luò)的時(shí)序路徑。這里的安全指的是時(shí)鐘之間的關(guān)系對(duì)Vivado來(lái)說(shuō)是全透明可分析的,。

11.png

不安全的CDC路徑

不安全的CDC路徑則表示源時(shí)鐘和目標(biāo)時(shí)鐘不同,,且由不同的端口進(jìn)入FPGA,在芯片內(nèi)部不共享時(shí)鐘網(wǎng)絡(luò),。這種情況下,,Vivado的報(bào)告也只是基于端口處創(chuàng)建的主時(shí)鐘在約束文件中所描述的相位和頻率關(guān)系來(lái)分析,并不能代表時(shí)鐘之間真實(shí)的關(guān)系,。

22.png

在Vivado中分析CDC

在 ISE中想要快速定位那些需要關(guān)注的CDC路徑并不容易,,特別是要找到不安全的CDC時(shí),因?yàn)镮SE缺省認(rèn)為所有來(lái)源不同的時(shí)鐘都不相關(guān)且不做分析,,要報(bào) 告出這類路徑,,需要使用ISE Timing Analyzer (TRCE) ,并加上 "-u" (表示unconstrained)這個(gè)選項(xiàng)。

在Vivado中則容易許多,,我們可以使用report_clock_interaction命令(GUI支持)來(lái)鑒別和報(bào)告設(shè)計(jì)中所有的時(shí)鐘關(guān)系,。執(zhí)行命令后會(huì)生成一個(gè)矩陣圖,其中對(duì)角線上的路徑表示源時(shí)鐘與目標(biāo)時(shí)鐘相同的時(shí)鐘內(nèi)部路徑,,其余都是CDC路徑,。

Vivado還會(huì)根據(jù)網(wǎng)表和已讀入的約束分析出CDC路徑的約束情況,并分顏色表示,。例如綠色代表有時(shí)序約束,,紅色代表不安全的CDC路徑但是沒(méi)有約束時(shí)序例外,橙色表示有部分路徑已約束為false path的不安全CDC路徑,。

33.png

矩陣下方是時(shí)鐘關(guān)系表格,,可以就各種條件進(jìn)行篩選和排序,方便定位CDC路徑,。建議的做法是:首先,,對(duì)"Common Primary Clock"排序(顯示為Yes 或No),這么做可以快速鑒別出那些安全和不安全的CDC路徑,,接著觀察對(duì)應(yīng)的"Inter-Clock Constraints"欄內(nèi)的內(nèi)容,,判斷已讀入的XDC中是否對(duì)這類路徑進(jìn)行了合理的約束。

44.png

第二步,,可以對(duì)"Path Req (WNS)"由小到大進(jìn)行排序,,找到那些數(shù)值特別小(例如小于100ps)或是顯示為"Unexpanded"的CDC路徑,,結(jié)合是否共享"Common Primary Clock"來(lái)鑒別此類路徑,,作出合理的約束。

過(guò)小的Path Req (WNS)一般都表示此類跨時(shí)鐘域路徑缺少異步時(shí)鐘關(guān)系或其它時(shí)序例外的約束,,如果兩個(gè)時(shí)鐘連"Common Primary Clock"也不共享,,則100%可以確認(rèn)為異步時(shí)鐘,應(yīng)該加上相應(yīng)的時(shí)鐘關(guān)系約束,。

顯示為"Unexpanded"的時(shí)鐘關(guān)系,,表示Vivado在一定長(zhǎng)度(缺省為1000)的周期內(nèi)都沒(méi)有為兩個(gè)時(shí)鐘的頻率和相位找到固定的關(guān)系,則無(wú)法推導(dǎo)出相應(yīng)的Path Req 約束值,。此類CDC需要特別留意,,也要加上異步時(shí)鐘關(guān)系約束。

這個(gè)矩陣還支持交互式的時(shí)序分析,,選中任意一個(gè)方框,,右鍵顯示下拉菜單:選擇Report Timing,會(huì)報(bào)告出這一格代表的時(shí)鐘域(本時(shí)鐘域或是跨時(shí)鐘域)內(nèi)最差的時(shí)序路徑,;選擇 Set Clock Groups則可以設(shè)置時(shí)鐘關(guān)系約束并添加到XDC文件中,。

CDC的設(shè)計(jì)與約束

CDC路徑在FPGA設(shè)計(jì)中普遍存在,,在設(shè)置相應(yīng)的約束前,必須了解設(shè)計(jì)中采取了怎樣的方法來(lái)處理跨時(shí)鐘域路徑,。

簡(jiǎn)單同步器

對(duì)于單根跨時(shí)鐘域路徑,,一般采用簡(jiǎn)單同步器(Simple Synchronizer),就是由至少兩級(jí)CE端和Reset/Clear端接死的寄存器序列來(lái)處理,。

55.png

這種情況下,,為了更長(zhǎng)的平均無(wú)故障時(shí)間MTBF(Mean Time Between Failures),需要配合一個(gè)ASYNC_REG的約束,,把用作簡(jiǎn)單同步器的多個(gè)寄存器放入同一個(gè)SLICE,,以降低走線延時(shí)的不一致和不確定性。

set_property ASYNC_REG TRUE [get_cells [list sync0_reg sync1_reg]]

在XDC中,,對(duì)于此類設(shè)計(jì)的CDC路徑,,可以采用set_clock_groups來(lái)約束。

66.png

       set_clock_groups -asynchronous -group [get_clocks -include_generated_clocks clk_oxo ] \

                                                             -group [get_clocks -include_generated_clocks clk_core ]

用FIFO隔離CDC

在總線跨時(shí)鐘域的設(shè)計(jì)中,,通常會(huì)使用異步FIFO來(lái)隔離,。根據(jù)FIFO的實(shí)現(xiàn)方式不同,需要加入不同的XDC約束,。

Build-in硬核FIFO

這種FIFO實(shí)際上就是用FPGA內(nèi)部的BRAM來(lái)搭建,,所有控制邏輯都在BRAM內(nèi)部,是推薦的FIFO實(shí)現(xiàn)方式,。其所需的XDC也相對(duì)簡(jiǎn)單,,只要像上述簡(jiǎn)單同步器的時(shí)鐘關(guān)系約束一樣用set_clock_groups將讀寫時(shí)鐘約束為異步即可。

帶有格雷碼控制的FIFO

為了在亞穩(wěn)態(tài)下做讀寫指針抽樣也能正確判斷空滿狀態(tài),,設(shè)計(jì)中也常用一種帶有格雷碼控制的FIFO來(lái)實(shí)現(xiàn)異步時(shí)鐘域的隔離,。計(jì)數(shù)器和讀寫指針等需要用BRAM外部的邏輯搭建,這樣的結(jié)構(gòu)就不能簡(jiǎn)單約束set_clock_groups,,還要考慮這些外部邏輯如何約束,。

如下圖所示FIFO,在存儲(chǔ)器外部有一些用FPGA邏輯搭建的寫指針和讀指針控制,,分屬不同的時(shí)鐘域,,存在跨時(shí)鐘域的時(shí)序路徑,。

此時(shí)如果僅將讀寫時(shí)鐘用set_clock_groups約束為異步時(shí)鐘,,相當(dāng)于設(shè)置從A到B和從B到A的路徑全部為false path。根據(jù)《XDC約束技巧之時(shí)鐘篇》所列,,false path的優(yōu)先級(jí)最高,,很顯然這么做會(huì)導(dǎo)致所有跨讀寫時(shí)鐘域的路徑全部不做時(shí)序分析,讀寫指針和相關(guān)控制邏輯也就失去了存在的意義,。

77.png

所以建議的做法是不設(shè)set_clock_groups約束,,轉(zhuǎn)而采用set_max_delay來(lái)約束這些跨時(shí)鐘域路徑。以寫入側(cè)舉例,一個(gè)基本的原則就是約束從cell1到cell2的路徑之間的延時(shí)等于或略小于cell2的驅(qū)動(dòng)時(shí)鐘一個(gè)周期的值,。讀出側(cè)的約束同理,。

set_max_delay $delay –from [get_cells cell1] –to [get_cells cell2] –datapath_only

如果用戶使用Vivado的IP Catalog來(lái)產(chǎn)生此類FIFO,這樣的XDC會(huì)隨IP的源代碼一起輸出(如下所示),,使用者僅需注意確保這個(gè)FIFO的讀寫時(shí)鐘域沒(méi)有被用戶自己的XDC約束為false path或是異步clock groups ,。

88.png

       set_max_delay -from [get_cells …../rd_pntr_gc_reg[*]] -to [get_cells …../Q_reg_reg[*]] \

                                -datapath_only [get_property PERIOD $rd_clock]

       set_max_delay -from [get_cells …../wr_pntr_gc_reg[*]] -to [get_cells …../Q_reg_reg[*]] \

                                -datapath_only [get_property PERIOD $wr_clock]

自2013.4開始,Vivado中還提供一個(gè)稱作methodology_checks的DRC檢查,,其中包含有對(duì)此類異步FIFO的max delay約束與時(shí)鐘域clock groups約束的沖突檢查,。

CDC約束方案的對(duì)比

CDC路徑在FPGA設(shè)計(jì)中普遍存在,不少公司和研發(fā)人員都有自己偏愛(ài)的約束方式,,這些方式通常有各自適用的環(huán)境,,當(dāng)然也各有利弊。

全部忽略的約束

最大化全部忽略CDC路徑的約束,,即采用set_clock_groups 或是set_false_path對(duì)時(shí)鐘關(guān)系進(jìn)行約束,,從而對(duì)跨時(shí)鐘域的路徑全部忽略。

● 示例:set_clock_groups -asynchronous -group clkA -group clkB

● 優(yōu)勢(shì):簡(jiǎn)單,、快速,、執(zhí)行效率高。

● 劣勢(shì):會(huì)掩蓋時(shí)序報(bào)告中所有的跨時(shí)鐘域路徑,,容易誤傷,,不利于時(shí)序分析。

使用datapath_only約束

datapath_only是從ISE時(shí)代的UCF中繼承過(guò)來(lái)的約束,,在XDC中必須作為一個(gè)選項(xiàng)跟set_max_delay配合使用,,可以約束在時(shí)鐘之間,也可以對(duì)具體路徑進(jìn)行約束,。

● 示例:set_max_delay 10 -datapath_only -from clkA -to clkB

● 優(yōu)勢(shì):簡(jiǎn)便,、執(zhí)行效率較高。

● 劣勢(shì):1) 需要特別留意是否設(shè)置了過(guò)于嚴(yán)格的約束,,因?yàn)槭褂谜呓?jīng)常會(huì)使用較快的時(shí)鐘周期來(lái)約束跨時(shí)鐘域路徑 ,。2) 注意約束優(yōu)先級(jí)的關(guān)系,是否跟設(shè)計(jì)中其它的約束有沖突,。3) set_max_delay而沒(méi)有配套設(shè)置set_min_delay的情況下,,同一路徑只做setup分析而不做hold分析。

逐條進(jìn)行時(shí)序例外約束

對(duì)設(shè)計(jì)中的CDC路徑分組或逐條分析,,采用不同的時(shí)序例外約束,,如set_false_path,set_max_delay和set_multicycle_path等來(lái)約束,。

● 示例:set_false_path -from [get_cells a/b/c/*_meta*] -to [get_cells a/b/c/*_sync*]

● 優(yōu)勢(shì):靈活,、針對(duì)性好,、便于時(shí)序分析和調(diào)試。

● 劣勢(shì):1) 逐條約束會(huì)占用大量時(shí)間來(lái)調(diào)試和分析,,效率低下,。2) 時(shí)序例外的優(yōu)先級(jí)比較復(fù)雜,多種時(shí)序例外約束共存的情況下,,很容易產(chǎn)生意想不到的沖突,,進(jìn)一步增加調(diào)試時(shí)間,降低效率,。3) 這么做極容易產(chǎn)生臃腫的XDC約束文件,,而且時(shí)序例外的執(zhí)行更耗內(nèi)存,直接導(dǎo)致工具運(yùn)行時(shí)間變長(zhǎng),。

小結(jié)

CDC 路徑的分析和約束不僅在FPGA設(shè)計(jì)中至關(guān)重要,,也是數(shù)字電路設(shè)計(jì)領(lǐng)域一個(gè)非常重要的命題。IP提供商,、EDA公司都有不少關(guān)于CDC的技術(shù)文檔,。 Vivado相比于Xilinx.上一代產(chǎn)品ISE,已經(jīng)在CDC的鑒別和分析方面有了很大改進(jìn),,XDC相比于UCF,,在CDC路徑的約束上也更為高效, 覆蓋率更高,。

希望本篇短文可以幫助Vivado的用戶快速掌握對(duì)FPGA設(shè)計(jì)中CDC路徑的鑒別,、分析和約束方法,提高設(shè)計(jì)效率,。

allyzhou.jpg

Ally Zhou 2014-9-28 于Xilinx上海Office


本站內(nèi)容除特別聲明的原創(chuàng)文章之外,,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn),。轉(zhuǎn)載的所有的文章,、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有,。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無(wú)法一一聯(lián)系確認(rèn)版權(quán)者,。如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,,請(qǐng)及時(shí)通過(guò)電子郵件或電話通知我們,,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失,。聯(lián)系電話:010-82306118,;郵箱:[email protected],。