Xilinx OFFSET偏移約束略談
(2012-02-02 17:51:39)
標(biāo)簽:
雜談Xilinx OFFSET偏移約束略談
calipers的博客http://blog.sina.com.cn/s/blog_7789345c0100y0zb.html
Xilinx OFFSET偏移約束略談
-=c00s19n=-
coosign#sohu.com
2011年5月29日
Xilinx ISE約束除了Period約束,最基本的應(yīng)該就是OFFSET約束(偏移約束)了。
下面分條目簡單說一下OFFSET如何應(yīng)用(下文主要圍繞OFFSET IN展開討論)。
(1)OFFSET約束基本概念
可以概括為三大注意點:
(a)OFFSET約束是用來約束數(shù)據(jù)和時鐘之間的時延關(guān)系。
(b)它只能用于與FPGA管腳(PAD)相連的信號,不能用于內(nèi)部信號。
(c)它告訴ISE布局布線工具,外部時鐘和數(shù)據(jù)輸入輸出管腳之間的時序關(guān)系。
當(dāng)然,如果我只是簡單的列出上面三條,不解釋的話,仍然會給讀者帶來重大誤解。
先給出UCF文件中的約束代碼:
TIMEGRP "data" OFFSET = IN 2ns BEFORE "sysclk";
其中"data"是一組輸入信號的組名,sysclk是輸入時鐘管腳名字。
這個2ns究竟是什么含義呢?
請看下圖:
2ns的含義,就是告訴ISE,在時鐘信號和數(shù)據(jù)信號進入FPGA之前,它們之間的時延是2ns。用一句拗口的話來說就是:在時鐘信號沿來之前的2ns,數(shù)據(jù)準(zhǔn)備好。說的事情就是上圖給出的時序圖。因此,OFFSET約束并不是叫ISE布線工具在FPGA內(nèi)部給你實現(xiàn)一個2ns的時延。那么ISE布線工具知道了輸入時鐘、數(shù)據(jù)信號之間的時延之后,能干什么呢?
(2)OFFSET約束的作用
OFFSET約束作用有3個,
(a)計算信號、時鐘在FPGA內(nèi)部的時延,給出準(zhǔn)確的時序報告
(b)根據(jù)UCF中指定的時延關(guān)系,去調(diào)整輸入信號到達(dá)同步單元的時間。
(c) b是針對Offset In而言,同理針對Offset Out,會調(diào)整輸出信號到達(dá)輸出管腳的時間。
仍然以上圖為例說明,綜合實現(xiàn)工具將努力使得數(shù)據(jù)信號、時鐘信號到達(dá)同步單元的相對延遲+FPGA外部本來的延時,不會超過一個時鐘周期。并在布線完后會給出數(shù)據(jù)路徑和精確時延報告。
例如,經(jīng)過FPGA內(nèi)部到達(dá)同步單元的時序關(guān)系變?yōu)椋?div style="height:15px;">
這樣就會出現(xiàn)時序錯誤了。
那么,很自然地會想到:我怎么知道信號進入FPGA之前的時延呢?
(3)如何準(zhǔn)確地知道時鐘和數(shù)據(jù)之間的時延關(guān)系?
以ADC+FPGA為例,F(xiàn)PGA作為ADC信號的接口,接收ADC采集的數(shù)據(jù)。這時候需要看ADC芯片手冊查找相關(guān)參數(shù),ADC芯片手冊會給出其輸出時鐘和數(shù)據(jù)之間的相對關(guān)系。
下面以國半的ADC16DV160為例,假定它的輸出數(shù)據(jù)和輸出時鐘都連接到FPGA上,而且在PCB板上的走線等長(實際工程師在設(shè)計PCB時,肯定是這么做的)。
當(dāng)采樣頻率是160MHz的時候,Tsu=1.57ns, Th=1.55ns。
看它的時序圖也能看出來,輸出的時鐘對應(yīng)著數(shù)據(jù)的中間位置。
因此,對于上升沿采樣的數(shù)據(jù)而言,其OFFSET約束應(yīng)該這么寫:
NET "adc_clk_p" TNM_NET = adc_clk_p;
TIMESPEC TS_adc_clk_p = PERIOD "adc_clk_p" 160 MHz HIGH 50%;
##OFFSET IN
NET "adc_data <*>" TNM = " data"; ##adc_data<0>等等表示輸入管腳名
TIMEGRP " data " OFFSET = IN 1.57ns BEFORE "adc_clk_p";
寫上這些約束,大家要養(yǎng)成查看時序報告的習(xí)慣。時序報告會告訴你這些時序滿足或者不滿足。在實際中,如果ISE的時序報告告訴你能夠滿足你的時序約束,然而FPGA程序在實際運行的時候卻發(fā)現(xiàn)存在時序問題(例如ADC采集信號有毛刺等),這說明你在UCF中指定的時延關(guān)系并不正確!
初學(xué)者常犯的一個錯誤,時序報告告訴你OFFSET IN約束無法滿足,會去修改OFFSET IN的時延值,使得布線工具不再報時序錯誤;另一種錯誤是,以為把這個時延值寫的越小,F(xiàn)PGA程序的時鐘頻率能跑的越快。
因此,當(dāng)我們清楚地知道OFFSET約束語句中這個時延值代表的真正含義時,就不會再做這兩種無用功了(PS:當(dāng)然,既然改了時延值,就會更改FPGA布線,也有瞎貓碰到死耗子——碰巧解決了實際問題的事情發(fā)生。但我們必須知道那是不對滴)。
(4)OFFSET約束怎么之前還加上周期約束
上面的例子中,約束了adc_clk_p時鐘信號的周期。
這是必須的。如果你不告訴ISE綜合布線工具關(guān)于時鐘周期的信息,OFFSET約束會被忽略。
很自然的,布線工具需要知道時鐘信號的周期,這樣它才能努力使得數(shù)據(jù)信號、時鐘信號到達(dá)同步單元的相對延遲+FPGA外部本來的延時,不會超過一個時鐘周期。
此外,說明一下:
TIMESPEC TS_adc_clk_p = PERIOD "adc_clk_p" 160 MHz HIGH 50%;
High 50%,High表明了ISE在計算時延值時,是以時鐘上升沿作為時間0點,50%也是用于計算時延時用的(雙沿時用得著)。并不是說要去約束FPGA內(nèi)部這個時鐘要達(dá)到50%的占空比,約束第一個進入的時鐘是上升沿,并不是這個意思。
因此,定義了時間0點,也就存在Before和After之說了,也就存在時延的正值、負(fù)值之說了。
(5)雙沿輸入的情況下怎么約束
在第3條中的例子,就是這種情況,ADC16DV160輸出的數(shù)據(jù)是DDR的,作為16bit的ADC,其上升沿輸出偶數(shù)bit數(shù)據(jù),下降沿輸出奇數(shù)bit數(shù)據(jù);這樣可以節(jié)省ADC輸出的位寬。
由于OFFSET IN的約束隨著ISE版本的升級,語法也不斷的發(fā)生變化。針對目前我用的ISE12,Xilinx推薦的規(guī)范寫法如下:
NET "adc_clk_p" TNM_NET = adc_clk_p;
TIMESPEC TS_adc_clk_p = PERIOD "adc_clk_p" 160 MHz HIGH 50%;
##OFFSET IN
NET "adc_data_I_p<*>" TNM = "adc_data";
NET "adc_data_Q_p<*>" TNM = "adc_data";
NET "adc_data_I_n<*>" TNM = "adc_data";
NET "adc_data_Q_n<*>" TNM = "adc_data";
TIMEGRP "adc_data" OFFSET = IN 1.57ns VALID 1.55ns BEFORE "adc_clk_p" RISING;
TIMEGRP "adc_data" OFFSET = IN 1.57ns VALID 1.55ns BEFORE "adc_clk_p" FALLING;
注意:使用了RISING和FALLING的關(guān)鍵字。此外,差分時鐘輸入,我只選擇了其中P管腳信號adc_clk_p進行約束。ISE能夠把這個約束傳遞到BUFG和DCM。
關(guān)于雙沿的討論,還可以參考如下鏈接的信息:
http://myfpgablog.blogspot.com/2009/10/ddr-offset-inout-constraints-with-dcm.htmlhttp://forums.xilinx.com/t5/Timing-Analysis/OFFSET-IN-DDR-timing-constraints-again/td-p/54507(6)OFFSET約束時序不滿足怎么辦?
經(jīng)常會碰到這種問題。
解決方法有兩種:
(a)使用DCM的移相功能
(b)使用IDELAY
Xilinx自帶的IP Core,諸如RocketIO/MIG等等,都會用上IODELAY。對于一般用戶,自己寫的代碼,最常用的應(yīng)該是采用DCM。相位的設(shè)置可以根據(jù)布線結(jié)果給出的時序余量來確定。相位值如果采用Fixed,可能無論怎么調(diào)都不一定能滿足要求,畢竟修改了代碼,每一次布線的結(jié)果并一定只改動了DCM部分。
DCM有動態(tài)調(diào)整相位的功能,可以派上用場。
DCM動態(tài)調(diào)相用到了PSEN,PSINCDEC,PSCLK,PSDONE這幾個信號。
這些端口默認(rèn)是灰色的,要選中VARIABLE_POSITIVE/CENTER等之后,才會出現(xiàn)。
控制很簡單,出一個PSEN單周期信號,如果PSINCDEC為低,則相位增加1個;反之,降低一個相位。