[原创]TimeQuest约束外设之诡异的Create Generated Clocks用法
剛?cè)腭v博客園,先搬幾篇之前在EDN原創(chuàng)的文章,EDN的鏈接http://bbs.ednchina.com/BLOG_13570357612_2000177.HTM
?
最近在altera FPGA里設(shè)計一個外設(shè)的驅(qū)動模塊,模塊本身邏輯很簡單如下圖所示,但是模塊和外設(shè)之間的時序約束問題搞的很頭疼,今天先講講總結(jié)的一些Timequest下外設(shè)約束方法,特別是那毫無用戶體驗而言的Create Generated Clocks用法。
?
?
要讓外設(shè)正確接收FPGA發(fā)出的數(shù)據(jù),需要dout和clkout滿足外設(shè)的建立保持時間,如下圖所示。
?
?
時序分析是基于源reg的Tco、目的reg的Tsu,源reg到目的reg的Tdelay路徑延遲以及到兩個reg的clk skew計算出來的,現(xiàn)在Timequest不知道外設(shè)接收reg和時鐘輸入端的延遲參數(shù),無法分析,還需分若干步配置:
?
1.使用Create Clocks建立系統(tǒng)時鐘sysclk
create_clock -name {sysclk} -period 20.000 -waveform { 0.000 10.000 } [get_ports {sysclk}]
Timequset里的所有時鐘都需要手動設(shè)置,首先設(shè)置系統(tǒng)時鐘,后面的時鐘都要基于這個時鐘才能生成。
?
?
2.使用Create Generated Clocks建立輸出時鐘clkout
外設(shè)的時鐘源于FPGA的輸出port clkout,如果不建立時鐘,timequest只會把clkout當(dāng)作一個普通的輸出引腳,時序分析器認為目的reg缺少驅(qū)動時鐘,無法分析。Timequest中將通過倍頻、分頻或者移相等生成的時鐘都歸為Generated Clocks,你可以使用Create Clocks創(chuàng)建試一下,不會提示創(chuàng)建失敗,但是在最后的時序分析里不會加入clkout的clock network delay,Timequest沒有你想象的那么智能,知道clkout是從一個分頻模塊輸出,自動加入模塊延遲分析,它不知道這些。所以還是使用Create Generated Clocks來創(chuàng)建吧,先填寫源時鐘sysclk,再填寫生成時鐘和源時鐘的關(guān)系,2分頻,最后指定target 生成時鐘到clkout引腳,這三個步驟看似沒問題,結(jié)果卻是創(chuàng)建失敗,提示找不到sysclk到clkout之間的路徑,如下所示。
Warning: No paths exist between clock target "clk_out" of clock "clkout" and its clock source. Assuming zero source clock latency.
?
但是sysclk到clkout明明是有路徑的啊,之間的邏輯也很簡單,就是一個二分頻關(guān)系,bdf圖如下所示。
?
?
clk_div模塊的代碼如下:
?
1 reg clk_div; 2 always @(posedge clk or negedge rset_n) 3 begin 4 if(!rset_n) 5 clk_div <= 0; 6 else 7 clk_div <= ~clk_div; 8 end?
?
嘗試了很多方法都無效,最終實驗成功了一種自認為很別扭的方法,“曲線救國”分兩步走:
首先Create Generated Clocks 從引腳sysclk 到 寄存器clk_div
create_generated_clock -name {clk_div_r} -source [get_ports {sysclk}] -divide_by 2 -master_clock {sysclk} [get_registers {clk_div:inst4|clk_div}]
再Create Generated Clocks 從寄存器clk_div到輸出引腳clk_out
create_generated_clock -name {clkout} -source [get_registers {clk_div:inst4|clk_div}] -master_clock {clk_div_r} [get_ports {clk_out}]
這才把clk_out設(shè)置為和sysclk關(guān)聯(lián)的輸出時鐘。
?
?
3. 用set output delay 設(shè)置基于clkout時鐘的輸出dout延遲。
set_output_delay -add_delay? -clock [get_clocks {clkout}]? 5.000 [get_ports {dout}],這句話在源reg和目的reg之間搭建起一座橋梁,實現(xiàn)兩個作用:
1.告訴分析工具,clkout是目的reg的驅(qū)動時鐘(但是前提是clkout需要被Timequest認為是個時鐘),dout是目的reg的數(shù)據(jù)源,分析工具才能計算出路徑的clk skew(clkout的clock network delay - sysclk的clock network delay);
2.告訴了分析工具外設(shè)reg的建立時間Tsu和路徑延遲Tdelay,這兩個參數(shù)之和其實就是輸出延遲,分別源于外設(shè)數(shù)據(jù)手冊和PCB板的走線延遲。
?
?
4.設(shè)置set max delay和set min delay
如果不需要更嚴苛的約束,不設(shè)置這兩個參數(shù)也可以。經(jīng)過前三步,時序分析器已經(jīng)知道了源reg和目的reg的時鐘頻率,系統(tǒng)會默認使用時鐘頻率分析,既最大延遲為時鐘周期Tclk,最小延遲為0。這里的set max delay約束Tco和clk skew為了滿足外設(shè)的建立時間,使(Tclk + clk skew)-(Tco+Tdelay) > Tsu,set min delay 約束Tco和clk skew滿足外設(shè)的保持時間,(Tco+Tdelay) - clk skew > Th。
?
?
5.設(shè)置多周期約束
由于本例的特殊性,源時鐘是目的時鐘的兩倍,需要多時鐘約束設(shè)置,由篇幅所限,下次再細講。
最后可以在Report Timing的Registers to Outputs的setup和hold里看到時序余量分析了。
回顧約束的整個過程,最鬧心的就是第二步Create Generated Clocks了,可能一直受altera里的pll設(shè)置影響,只要設(shè)置源時鐘,填好輸出輸入時鐘關(guān)系,pll就可以用了,到了Timequest里的生成時鐘設(shè)置,我也想當(dāng)然的認為,clkout是由sysclk生成變化而來,源里面只要填sysclk,關(guān)系填好就肯定沒問題了,但是結(jié)果并非這么簡單。
再回到第二步,再嘗試從sysclk直接Create Generated Clocks指定到輸出時鐘clkout,發(fā)現(xiàn)除了找不到sysclk和clkout之間的路徑之外還有一個警告
Warning: Node: clk_div:inst|clk_div was determined to be a clock but was found without an associated clock assignment。
警告clk_div被設(shè)置為了時鐘,但是沒有指定關(guān)聯(lián)的源時鐘即沒指定clk_div是由哪個時鐘生成的,從這個警告推理:我設(shè)置的Generated 時鐘是clkout,而clkout是由clk_div驅(qū)動的,所以Timequest也將clk_div認為是一個時鐘路徑node,但是我只告訴了Timequest clkout的源時鐘是sysclk,而沒有告訴它clk_div的源時鐘是哪個,所以創(chuàng)建失敗,雖然從程序顯而易見源也是sysclk,看來我高估了TimeQuest的智商,按照上述的“兩步走”方案,第一步就是告知clk_div的源時鐘是sysclk,第二步再生成基于clk_div的clkout就ok了
推測Timequest中對Creat Generated Clocks分析過程是這樣的:從最終的target Clock端口往回分析,尋找這個時鐘路徑上的net寄存器,看其是否有關(guān)聯(lián)時鐘,如果有,看是否已經(jīng)指定了,如果指定了則繼續(xù)反向分析直到源時鐘,如果沒有則提示創(chuàng)建失敗。為了驗證這個推測,再級聯(lián)一個分頻模塊clk_div如下圖所示。
?
?
此時該如何建立基于sysclk的輸出時鐘clk_out呢,從clk_out管腳返回分析,clk_out由ints5|clk_div驅(qū)動,ints5|clk_div的關(guān)聯(lián)時鐘是inst4|clk_div,inst4|clk_div的關(guān)聯(lián)時鐘是sysclk,所以要分三步創(chuàng)建:
?
?
首先創(chuàng)建基于sysclk的inst4|clk_div。
create_generated_clock -name {clk_div_r} -source [get_ports {sysclk}] -divide_by 2 -master_clock {sysclk} [get_registers {clk_div:inst4|clk_div}]
?
?
再創(chuàng)建基于inst4|clk_div的inst5|clk_div。
create_generated_clock -name {clk_div_rr} -source [get_registers {clk_div:inst4|clk_div}] -divide_by 2 -master_clock {clk_div_r} [get_registers {clk_div:inst5|clk_div}]
?
?
最后創(chuàng)建基于inst5|clk_div的clk_out。
create_generated_clock -name {clkout} -source [get_registers {clk_div:inst5|clk_div}] -master_clock {clk_div_rr} [get_ports {clk_out}]
?
驗證結(jié)果,少了上述任何一步都無法得到正確的輸出時鐘,比如用Create clk 創(chuàng)建inst4|clk_div 取代第一步,雖然也可以生成clk_out,但最終的輸出延遲會減小。
?
?
多數(shù)工程中,使用分頻模塊輸出時鐘的做法并不多,更多的是使用pll,我又嘗試了下使用PLL產(chǎn)生一個外部時鐘,PLL的源為sysclk,仍然無法直接Create Generated Clocks從sysclk到clk_out,而是首先derive_pll_clocks將所有的PLL輸出都設(shè)為時鐘,再Create Generated Clocks從PLL的時鐘輸出寄存器到clk_out才可以。
?
?
最后感嘆下:9.1版本的TimeQuest能再智能點嗎?
轉(zhuǎn)載于:https://www.cnblogs.com/littlexiaocai/archive/2012/05/30/2526803.html
總結(jié)
以上是生活随笔為你收集整理的[原创]TimeQuest约束外设之诡异的Create Generated Clocks用法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新浪sae邀请注册
- 下一篇: 小白学数据分析-----Excel制作I