|
四,用TimeQuest對DAC7512控制器進行時序分析 在對某個對象下時序約束的時候,首先要能正確識別它,TimeQuest會對設(shè)計中各組成部分根據(jù)屬性進行歸類,我們在下時序約束的時候,可以通過命令查找對應(yīng)類別的某個對象。 TimeQuest對設(shè)計中各組成部分的歸類主要有cells,pins,nets和ports幾種。寄存器,門電路等為cells;設(shè)計的輸入輸出端口為ports;寄存器,門電路等的輸入輸出引腳為pins;ports和pins之間的連線為nets。具體可以參照下圖(此圖出自Altera Time Quest的使用說明)。 下面我們按照本文第二部分用TimeQuest做時序分析的基本操作流程所描述的流程對DAC7512控制器進行時序分析。 建立和預(yù)編譯項目的部分相對簡單,涉及到的也只是QuartusII的一些基本操作,這里我們就不再做具體的敘述。主要介紹如何向項目中添加時序約束和如何進行時序驗證。首先建立一個名稱與項目top層名字一致的sdc文件,然后按照下面的步驟添加時序約束。 1. 創(chuàng)建時鐘 添加時序約束的第一步就是創(chuàng)建時鐘。為了確保STA結(jié)果的準(zhǔn)確性,必須定義設(shè)計中所有的時鐘,并指定時鐘所有相關(guān)參數(shù)。TimeQuest支持下面的時鐘類型: a) 基準(zhǔn)時鐘(Base clocks) b) 虛擬時鐘(Virtual clocks) c) 多頻率時鐘(Multifrequency clocks) d) 生成時鐘(Generated clocks) 我們在添加時序約束的時候,首先創(chuàng)建時鐘的原因是后面其它的時序約束都要參考相關(guān)的時鐘的。 基準(zhǔn)時鐘: 基準(zhǔn)時鐘是輸入到FPGA中的原始輸入時鐘。與PLLs輸出的時鐘不同,基準(zhǔn)時鐘一般是由片外晶振產(chǎn)生的。定義基準(zhǔn)時鐘的原因是其他生成時鐘和時序約束通常都以基準(zhǔn)時鐘為參照。 很明顯,在DAC7512控制器中,CLK_IN是基準(zhǔn)時鐘。我們用下面的命令來創(chuàng)建這個基準(zhǔn)時鐘: create_clock -name CLK_IN -period 40 -waveform {0 20} [get_ports {CLK_IN}] 其中,create_clock是創(chuàng)建時鐘的命令,后面是命令的各種選項。其中-name CLK_IN選項給出了時鐘的名字,即CLK_IN。-period 40給出了時鐘的周期,即40ns。-waveform {0 20}給出了時鐘的占空比,即50/50。最后的[get_ports {CLK_IN}] 是嵌套的tcl命令,給出了CLK_IN對應(yīng)的port,實際上也就是CLK_IN的輸入引腳。 在sdc文件里添加上述命令后,在quartusII里編譯設(shè)計,然后通過tools –> TimeQuest Time Aanlyzer命令打開TimeQuest。在TimeQuest的Tasks窗口,找到Report Clocks,雙擊之,TimeQuest就會在右邊主窗口給出設(shè)計中已成功添加的時鐘信息。如下圖所示,可以看到CLK_IN,其類型為基準(zhǔn)時鐘,周期為40ns,頻率為25MHz,targets項為CLK_IN,即表示這個時鐘是連接在CLK_IN端口上的。這說明上面create_clock的命令已經(jīng)在設(shè)計中正確創(chuàng)建了時鐘CLK_IN。 實際上對于create_clock命令,我們可以通過quartus II的幫助系統(tǒng)(http://quartushelp./current/),查找它的語法。在QuartusII的幫助里,可以查找到:
PLL時鐘: 上面我們創(chuàng)建了基準(zhǔn)時鐘。下面我們創(chuàng)建PLL輸出的時鐘。 在Altera的FPGA中,PLL電路是通過ALTPLL的IP庫被添加到設(shè)計中的。下圖是一個典型的ALTPLL的結(jié)構(gòu)圖。 從圖上可以看到,當(dāng)我們選定了基準(zhǔn)時鐘和PLL的參數(shù)以后,PLL的輸出c0和c1的參數(shù)就隨之確定了。所以在QuartusII環(huán)境下,可以通過一個簡單的命令讓軟件自動生成PLL輸出的時鐘的時序約束。 derive_pll_clocks 這個命令會自動創(chuàng)建PLL輸出的C0和C1的相關(guān)時序約束。同樣的,在sdc文件里添加該命令,然后編譯,在TimeQuest里查看時鐘信息。如下圖所示,derive_pll_clocks在系統(tǒng)里添加了兩個時鐘,PLL1|altpll_component|auto_generated|pll1|clk[0]和PLL1|altpll_component|auto_generated|pll1|clk[1]??梢钥闯觯瑫r鐘是按“PLL層次結(jié)構(gòu)+時鐘端口名字”的規(guī)則命名的。時鐘的類型為created clock,周期頻率是在PLL里設(shè)定好的。duty_cycle為50/50。Clock source為PLL1|altpll_component|auto_generated|pll1|inclk[0],實際上就是我們之前定義的CLK_IN。 用derive_pll_clocks命令創(chuàng)建PLL相關(guān)的時鐘很是方便,但不好的地方就是,時鐘的命名太過復(fù)雜,我們在添加與此時鐘相關(guān)的時序約束時,就必須用這種名字很長的時鐘,容易出錯,且可讀性也差。所以建議還是采用create_generated_clock命令來創(chuàng)建PLL的時鐘。 create_generated_clock命令的語法如下,可以從quartusII的幫助系統(tǒng)里找到每個參數(shù)的詳細解釋。
可以用下面的命令來創(chuàng)建PLL的兩個時鐘C0和C1。我們把時鐘命名為CLK25M和CLK50M,source clock為CLK_IN。 create_generated_clock -name CLK25M -source CLK_IN -duty_cycle 50.000 -multiply_by 1 -master_clock {CLK_IN} [get_pins {PLL1|altpll_component|auto_generated|pll1|clk[0]}] create_generated_clock -name CLK50M -source CLK_IN -duty_cycle 50.000 -multiply_by 2 -master_clock {CLK_IN} [get_pins {PLL1|altpll_component|auto_generated|pll1|clk[1]}] 用這兩個命令創(chuàng)建的時鐘與derive_pll_clocks命令創(chuàng)建的時鐘的本質(zhì)是一樣的,只是給時鐘定義了不同的名字。當(dāng)然我們也可以用derive_pll_clocks中對時鐘的命名方式來使用create_generated_clock命令。 同樣的,可以按照上面的方法,在TimeQuest里查看創(chuàng)建時鐘的結(jié)果,如下圖所示。 到此為止,我們創(chuàng)建了PLL的基準(zhǔn)時鐘以及PLL輸出的兩個時鐘CLK25M和CLK50M。 DA_SCLK時鐘: 在TimeQuest的Tasks窗口里,選擇Report Unconstrained Paths命令,TimeQuest會報告出所有需要下約束但實際并沒有約束的情況。在Report里的Unconstrained Path列表下,我們可以查看這個報告。雙擊Clock Status Summary,就可以在主窗口看到所有時鐘的情況。見下圖,很明顯,軟件辨識出DAC7512模塊下的DA_SCLK為時鐘信號,但是我們并沒有對該時鐘添加約束,所以用紅色將這個時鐘顯示了出來。下一步我們就來創(chuàng)建這個時鐘。 DA_SCLK是用CLK50M通過二分頻電路得到的。所以其source clock為CLK50M。但是,我們在使用create_generated_clock命令創(chuàng)建該時鐘的時候,在-source的參數(shù)里,卻不能直接使用CLK50M,而必須使用CLK50M所對應(yīng)的pin,即PLL1|altpll_component|auto_generated|pll1|clk[1]。 這主要是因為-source參數(shù)只支持pins,ports和registers。 DA_SCLK是由CLK50M通過二分頻電路生成的,其代碼如下: reg DA_SCLK; always @(posedge CLK50M or negedge RESET) begin if(~RESET) DA_SCLK <= 1'b0; else DA_SCLK <= ~DA_SCLK; end 可以看到,本質(zhì)上DA_SCLK為一個寄存器的輸出,所以使用get_registers命令獲取DA_SCLK。DA_SCLK是由CLK50M經(jīng)二分頻電路生成的,所以-divide_by的參數(shù)應(yīng)該是2。 綜上所述,用下面的命令創(chuàng)建DA_SCLK: create_generated_clock -name DA_SCLK -divide_by 2 -source [get_pins {PLL1|altpll_component|auto_generated|pll1|clk[1]}] [get_registers {DAC7512:DAC7512|DA_SCLK} ] 到此為止,DAC7512控制器中所有4個時鐘都創(chuàng)建好了。如下圖所示: 我們再看TimeQuest中Unconstrained Paths中clock Status Summary,就會發(fā)現(xiàn),所有的時鐘都已經(jīng)被添加了約束。
|
|
|