上一篇《XDC 約束技巧之時鐘篇》介紹了 XDC 的優(yōu)勢以及基本語法,詳細說明了如何根據(jù)時鐘結(jié)構(gòu)和設(shè)計要求來創(chuàng)建合適的時鐘約束。我們知道 XDC 與 UCF 的根本區(qū)別之一就是對跨時鐘域路徑(CDC)的缺省認識不同,那么碰到 FPGA 設(shè)計中常見的 CDC 路徑,到底應(yīng)該怎么約束,在設(shè)計上又要注意些什么才能保證時序報告的準確性?
CDC的的定義與分類
CDC 是 Clock DomainCrossing 的簡稱,CDC 時序路徑指的是起點和終點由不同時鐘驅(qū)動的路徑。在電路設(shè)計中對這些跨時鐘域路徑往往需要進行特別的處理來避免亞穩(wěn)態(tài)的產(chǎn)生,例如使用簡單同步器、握手電路或是 FIFO 來隔離。
安全的CDC路徑
所謂安全的 CDC 路徑是指那些源時鐘和目標時鐘擁有相同的來源,在 FPGA 內(nèi)部共享部分時鐘網(wǎng)絡(luò)的時序路徑。這里的安全指的是時鐘之間的關(guān)系對 Vivado來說是全透明可分析的。
不安全的CDC路徑
不安全的 CDC 路徑則表示源時鐘和目標時鐘不同,且由不同的端口進入 FPGA,在芯片內(nèi)部不共享時鐘網(wǎng)絡(luò)。這種情況下,Vivado 的報告也只 是基于端口處創(chuàng)建的主時鐘在約束文件中所描述的相位和頻率關(guān)系來分析, 并不能代表時鐘之間真實的關(guān)系。
在 Vivado 中分析 CDC
在 ISE 中想要快速定位那些需要關(guān)注的 CDC 路徑并不容易,特別是要找到不安全的 CDC 時,因為 ISE 缺省認為所有來源不同的時鐘都不相關(guān)且不做分析,要報告出這類路徑,需要使用 ISE Timing Analyzer (TRCE) ,并加上 “-u” (表示 unconstrained)這個選項。
在 Vivado 中則容易許多,我們可以使用report_clock_interaction 命令(GUI 支持)來鑒別和報告設(shè)計中 所有的時鐘關(guān)系。執(zhí)行命令后會生成一個矩陣圖,其中對角線上的路徑表示源時鐘與目標時鐘相同的時鐘內(nèi)部路徑,其余都是 CDC 路徑。
Vivado 還會根據(jù)網(wǎng)表和已讀入的約束分析出 CDC 路徑的約束情況,并分顏色表示。例如綠色代表有時序約束,紅色代表不安全的 CDC 路徑但是沒有約束時序例外,橙色表示有部分路徑已約束為 false path 的不安 全 CDC 路徑。
矩陣下方是時鐘關(guān)系表格,可以就各種條件進行篩選和排序,方便定位 CDC 路徑。建議的做法是:首先,對“Common Primary Clock”排序(顯示為 Yes 或 No),這么做可以快速鑒別出那些安全和不安全的 CDC 路徑,接著觀察對應(yīng)的“Inter-Clock Constraints”欄內(nèi)的內(nèi)容,判斷已讀入的XDC 中是否對這類路徑進行了合理的約束。
第二步,可以對“Path Req (WNS)”由小到大進行排序,找到那些數(shù)值特別小(例如小于 100ps)或是顯示 為“Unexpanded”的 CDC 路徑,結(jié)合是否共享“CommonPrimary Clock”來鑒別此類路徑,作出合理的約束。
過小的 Path Req (WNS)一般都表示此類跨時鐘域路徑缺少異步時鐘關(guān)系或其它時序例外的約束,如果兩 個時鐘連“Common Primary Clock”也不共享,則 100%可以確認為異步時鐘,應(yīng)該加上相應(yīng)的時鐘關(guān)系約束。
顯示為“Unexpanded”的時鐘關(guān)系,表示 Vivado 在一定長度(缺省為 1000)的周期內(nèi)都沒有為兩個時鐘的頻率和相位找到固定的關(guān)系,則無法推導(dǎo)出相應(yīng)的 Path Req 約束值。此類 CDC 需要特別留意,也要加上異 步時鐘關(guān)系約束。
這個矩陣還支持交互式的時序分析,選中任意一個方框,右鍵顯示下拉菜單:選擇 Report Timing,會報 告出這一格代表的時鐘域(本時鐘域或是跨時鐘域)內(nèi)最差的時序路徑;選擇Set Clock Groups 則可以設(shè)置時鐘關(guān)系約束并添加到 XDC 文件中。
CDC 的設(shè)計與約束
CDC 路徑在 FPGA 設(shè)計中普遍存在,在設(shè)置 相應(yīng)的約束前,必須了解設(shè)計中采取了怎樣的方法來處理跨時鐘域路徑。
簡單同步器
對于單根跨時鐘域路徑,一般采用簡單同步器(Simple Synchronizer),就是由至少兩級 CE 端 和 Reset/Clear 端接死的寄存器序列來處理。
這種情況下,為了更長的平均無故障時間 MTBF(Mean Time Between Failures),需要配合一個 ASYNC_REG的約束,把用作簡單同步器的多個寄存器放入同一個 SLICE,以降低走線延時的不一致和不確定性。
set_property ASYNC_REG TRUE [get_cells [list sync0_reg sync1_reg]]
在 XDC 中,對于此類設(shè)計的 CDC 路徑,可以采用 set_clock_groups 來約束。
用 FIFO 隔離 CDC
在總線跨時鐘域的設(shè)計中,通常會使用異步 FIFO 來隔離。根據(jù) FIFO 的實現(xiàn)方式不同,需要加入不同的 XDC 約束。
Build-in 硬核 FIFO
這種 FIFO 實際上就是用 FPGA 內(nèi)部的 BRAM 來搭建,所有控制邏輯都在 BRAM 內(nèi)部,是推薦的 FIFO 實現(xiàn)方式。其所需的 XDC 也相對簡單,只要像上述簡單同步器的時鐘關(guān)系約束一樣用 set_clock_groups 將讀寫時鐘約束為異步即可。
帶有格雷碼控制的 FIFO
為了在亞穩(wěn)態(tài)下做讀寫指針抽樣也能正確判斷空滿狀態(tài),設(shè)計中也常用一種帶有格雷碼控制的 FIFO 來實現(xiàn)異步時鐘域的隔離。計數(shù)器和讀寫指針等需要用 BRAM 外部的邏輯搭建,這樣的結(jié)構(gòu)就不能簡單約束 set_clock_groups,還要考慮這些外部邏輯如何約束。
如下圖所示 FIFO,在存儲器外部有一些用 FPGA 邏輯搭建的寫指針和讀指針控制,分屬不同的時鐘域,存在跨時鐘域的時序路徑。
此時如果僅將讀寫時鐘用 set_clock_groups 約束為異步時鐘,相當(dāng)于設(shè)置從 A 到 B 和從 B 到 A 的路徑全部為 false path。根據(jù)《XDC 約束技巧之時鐘篇》所列,false path 的優(yōu)先級最高,很顯然這么做會導(dǎo)致所有 跨讀寫時鐘域的路徑全部不做時序分析,讀寫指針和相關(guān)控制邏輯也就失去了存在的意義。
所以建議的做法是不設(shè) set_clock_groups 約束,轉(zhuǎn)而采用 set_max_delay 來約束這些跨時鐘域路徑。以寫入側(cè)舉例,一個基本的原則就是約束從 cell1 到 cell2 的路徑之間的延時等于或略小于 cell2 的驅(qū)動時鐘一個周期的值。讀出側(cè)的約束同理。
set_max_delay $delay –from [get_cells cell1] –to [get_cells cell2] –datapath_only
如果用戶使用 Vivado 的 IP Catalog 來產(chǎn)生此類FIFO,這樣的 XDC 會隨 IP 的源代碼一起輸出(如下所示),使用者僅需注意確保這個 FIFO 的讀寫時鐘域沒有被用戶自己的 XDC 約束為 false path 或是異步 clock groups 。
自 2013.4 開始,Vivado 中還提供一個稱作 methodology_checks 的 DRC 檢查,其中包含有對此類異步FIFO 的 max delay 約束與時鐘域 clock groups 約束的沖突檢查。
CDC 約束方案的對比
CDC 路徑在 FPGA 設(shè)計中普遍存在,不少公司和研發(fā)人員都有自己偏愛的約束方式,這些方式通常有各自適用的環(huán)境,當(dāng)然也各有利弊。
全部忽略的約束
最大化全部忽略 CDC 路徑的約束,即采用 set_clock_groups 或是 set_false_path 對時鐘關(guān)系進行約束, 從而對跨時鐘域的路徑全部忽略。
示例:set_clock_groups -asynchronous -group clkA -group clkB
優(yōu)勢:簡單、快速、執(zhí)行效率高。
劣勢:會掩蓋時序報告中所有的跨時鐘域路徑,容易誤傷,不利于時序分析。
使用 datapath_only 約束
datapath_only 是從 ISE 時代的 UCF 中繼承過來的約束,在 XDC 中必須作為一個選項跟 set_max_delay 配合使用,可以約束在時鐘之間,也可以對具體路徑進行約束。
示例:set_max_delay 10 -datapath_only -from clkA -to clkB
優(yōu)勢:簡便、執(zhí)行效率較高。
劣勢:1) 需要特別留意是否設(shè)置了過于嚴格的約束,因為使用者經(jīng)常會使用較快的時鐘周期來約束跨時鐘域路徑 。2) 注意約束優(yōu)先級的關(guān)系,是否跟設(shè)計中其它的約束有沖突。3) set_max_delay 而沒 有配套設(shè)置 set_min_delay 的情況下,同一路徑只做 setup 分析而不做 hold 分析。
逐條進行時序例外約束
對設(shè)計中的 CDC 路徑分組或逐條分析,采用不同的時序例外約束,如 set_false_path,set_max_delay 和 set_multicycle_path 等來約束。
示例:set_false_path -from [get_cells a/b/c/*_meta*] -to [get_cellsa/b/c/*_sync*]
優(yōu)勢:靈活、針對性好、便于時序分析和調(diào)試。
劣勢:1) 逐條約束會占用大量時間來調(diào)試和分析,效率低下。2) 時序例外的優(yōu)先級比較復(fù)雜,多種時序例外約束共存的情況下,很容易產(chǎn)生意想不到的沖突,進一步增加調(diào)試時間,降低效率。3) 這么做極容易產(chǎn)生臃腫的 XDC 約束文件,而且時序例外的執(zhí)行更耗內(nèi)存,直接導(dǎo)致工具運行時間變長。
小結(jié)
CDC 路徑的分析和約束不僅在FPGA 設(shè)計中至關(guān)重要,也是數(shù)字電路設(shè)計領(lǐng)域一個非常重要的命題。IP 提供商、EDA 公司都有不少關(guān)于 CDC 的技術(shù)文檔。Vivado 相比于 Xilinx 上一代產(chǎn)品 ISE,已經(jīng)在 CDC 的鑒別和分析方面有了很大改進,XDC 相比于 UCF,在 CDC 路徑的約束上也更為高效,覆蓋率更高。
希望本篇短文可以幫助 Vivado 的用戶快速掌握對 FPGA 設(shè)計中 CDC 路徑的鑒別、分析和約束方法,提高設(shè)計效率。
審核編輯:湯梓紅
-
FPGA
+關(guān)注
關(guān)注
1625文章
21620瀏覽量
601232 -
時鐘
+關(guān)注
關(guān)注
10文章
1714瀏覽量
131274 -
約束
+關(guān)注
關(guān)注
0文章
82瀏覽量
12708 -
UCF
+關(guān)注
關(guān)注
0文章
9瀏覽量
9607 -
xdc
+關(guān)注
關(guān)注
1文章
24瀏覽量
5913
原文標題:XDC 約束技巧之CDC篇
文章出處:【微信號:FPGA算法工程師,微信公眾號:FPGA算法工程師】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論