近期在進行emmc數(shù)據(jù)讀寫程序調(diào)試時,逼迫自己從一個時序小白跨進了時序約束的大門,這里記錄一下供大家學(xué)習參考。
需求
emmc hs200模式下,允許最高時鐘頻率為200M。其中emmc和FPGA之間的引腳有單向EMMC_CLK,雙向CMD和DATA[7:0]。根據(jù)emmc手冊,要求建立時間為1.4ns,保持時間為0.8ns。EMMC_CLK是FPGA提供給emmc的,因此要求發(fā)送命令或數(shù)據(jù)時,CLK和CMD到達emmc芯片時要滿足手冊要求的建立和保持時間。
添加約束
要使輸出的CLK和CMD滿足emmc的建立保持時間,就需要告訴FPGA編譯器,輸出的延遲有多少。因此分兩步:
第一步:添加時鐘約束。
我用的是xilinx ,vivado軟件,可以手寫xdc約束文件,也可采用GUI界面,網(wǎng)上搜索如何進行約束,都是教的用手寫,但遺憾的是,很多文章都是各種抄襲或者寫得籠統(tǒng)粗略,對一個新手來說屬實很難受(因為總出現(xiàn)語法錯誤還不知道原因)。因此這里推薦新手采用GUI添加約束,然后軟件自動寫到xdc文件,自己再去看,等熟練之后再進行手寫。
點擊implementation下的Edit Timing Constraints即添加約束
如圖所示,可以添加時鐘約束,輸入輸出約束等。
這里,我的時鐘是鎖相環(huán)鎖出來的,然后連接到輸出端口EMMC_CLK,因此屬于衍生時鐘,要用create generated clock(鎖相環(huán)鎖出來的或者自己寫個分頻代碼分出來的都屬于衍生時鐘)。
第二步:添加輸出延時。
添加好時鐘后,就要添加我的CMD或者DATA相當于EMMC_CLK的輸出延遲了,輸出延遲的計算網(wǎng)上一搜一大堆,就不講了,考慮PCB板級的走線延遲若為t,那么輸出延遲設(shè)置的值max應(yīng)為t+1.4,min值應(yīng)為t-0.8,也就是輸出延遲最大值應(yīng)該是走線延遲加下級芯片的建立時間,最小值是走線延遲減去下級芯片的保持時間。
約束后的結(jié)果是
create_generated_clock -name CLK100M -source [get_pins pll/clk_in1] -multiply_by 1 -add -master_clock sys_clk [get_pins pll/clk_out2]
create_generated_clock -name emmc_clk -source [get_pins pll/clk_out2] -multiply_by 1 -add -master_clock CLK100M [get_ports emmc_clk]
set_output_delay -clock [get_clocks emmc_clk] -max -add_delay 1.600 [get_ports -filter { NAME =~ "*emmc*" && DIRECTION == "INOUT" }]
set_output_delay -clock [get_clocks emmc_clk] -min -add_delay -1.000 [get_ports -filter { NAME =~ "*emmc*" && DIRECTION == "INOUT" }]
我這里是由于不知道板級延時是多少,因此自己給多加的一點裕量。
現(xiàn)象
這里我用時序報告來給大家講現(xiàn)象,至于時序報告怎么看,我認為這篇文章講得很到位,我也是看這篇文章看懂的。
Vivado下如何閱讀時序報告-知乎
我添加約束后有一個時序違例,報告建立時間裕度為負,也就是WNS為負,來看看報告。
先看保持時間
這里,保持時間的目標時鐘Required Time 為10.223ns,vivado為了滿足保持時間,讓數(shù)據(jù)(Data Path)走了一個最小延遲為7.791ns的路徑。
再看建立時間。
在建立時間中,Data Path數(shù)據(jù)路徑是按最大值計算,這里由于保持時間中已經(jīng)把路徑定了,這里的數(shù)據(jù)路徑延時就是16.115ns,但這直接導(dǎo)致了建立時間不滿足時序了,也就是WNS為負。
我們來看布線圖
途中就是這一條路徑的走線,數(shù)據(jù)寄存器的起點和終點實際都在左上角,卻在途中走了一個大圈。這里我在網(wǎng)上看到一個說法,無法求證,說vivado在編譯的時候就是優(yōu)先保證滿足保持時間,再來滿足建立時間。這個說法在這次實例中我認為得到了證明,這也就是平常WNS為負的情況比WHS為負的情況多的原因,也可以解釋平常的WHS總是很小的現(xiàn)象。
時序優(yōu)化
在這次實例中,我經(jīng)過分析,我認為時序違例的原因是在計算保持時間裕度時,目的時鐘的走線是按最大延遲計算,而這里我用了一個問號冒號語句來切換時鐘,導(dǎo)致目的時鐘算出來的最大延遲較大,所以數(shù)據(jù)路徑被迫去繞一大圈來滿足保持時間。而計算建立時間裕度時,目的時鐘走線按最小延遲計算,我估計問號冒號語句時鐘切換導(dǎo)致其最大延遲和最小延遲相差太大,因此采用了一個時鐘切換小模塊,不會產(chǎn)生毛刺的那種,替換了問號冒號。爾后這個問題就解決了。文章來源:http://www.zghlxwxcb.cn/news/detail-403655.html
總結(jié)
我認為分析時序違例,就得去看他違例的走線路徑是怎么走的,然后分析導(dǎo)致裕度為負他的主要原因可能是哪里。然后再嘗試更改設(shè)計。我是一個時序約束入門小白,若有理解不對,請大家留言指正,歡迎大家一起探討。文章來源地址http://www.zghlxwxcb.cn/news/detail-403655.html
到了這里,關(guān)于FPGA時序約束經(jīng)歷之輸出延時約束(set_output_delay)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!