周期約束分析
周期〈Period)約束的對象是該時鐘所驅(qū)動的所有同步元件之間的路徑,但是不會覆蓋如圖1所示的A、B、C和D路徑,以及輸入引腳到輸出引腳〈純組合邏輯〉、輸入引腳到悶步元件、同步元件到輸出引腳,還有Clk1到Clk2之間的異步路徑,
在進(jìn)行周期Period約柬之前,需要對電路的時鐘周期進(jìn)行估計,不要便用過松或過緊的約束。設(shè)討內(nèi)部電路所能達(dá)到的最南運(yùn)行頻率取決于同步元件本身的建立保持時間,以及同步元件之間的邏輯和布線延遲。雖然布線延時無法估計,但邏輯延時應(yīng)該可以大致估計,如圖2所示。通常可以根據(jù)邏輯延時和布線延時各占40%和60%的比例來判斷將要設(shè)置的周期約束對于當(dāng)前的設(shè)計是否現(xiàn)實或合理。
圖1 周期約束所達(dá)到的范圍
圖2 估算邏輯之間的延時
通過約束編輯器的文本編輯窗口,可以采用以下兩種方式的UCF語句來做時鐘約束。
(1)period_item PERIOD=period{HIGH|LOW} [high_or low_item]
其中,period_item可以是NET或TIMEGRP,分別代表時鐘線名稱net name或元件分組名稱group-name。用NET表示PERIOD約束作用到名為“net name”的時鐘網(wǎng)線所驅(qū)動的同步元件上,用TIMEGRP表示PERIOD約束作用到TiMEGRP所定義的分組(包括FFS、LATCH和RAM等同步元件)上。period是目標(biāo)時鐘周期,單位可以是ps、ns、μS和ms等。HIGH|LOW指出時鐘周期中的第1個脈沖是高電平還是低電平,high_or_low_time為HIGH LOW指定的脈沖的持續(xù)時間,默認(rèn)單位是ns。如果沒有該參數(shù),時鐘占空比是50%。例如, NET SYS_CLK PERIOD=10 ns HIGH 4ns
(2)NET“clock net name”TNM_NET=“timing group name”;
TIMESPEC“TSidentifier”=PERIOD “TNM reference”period {HIGH LOW} [high_or low_item]
下面舉個例子來說明如何設(shè)置周期約束??紤]圖3所示的電路設(shè)計范例1,輸入時鐘的周期是10ns,并且是上升沿動作,占空比為45%高電平,55%低電平。
我們可以用這樣的UCF語旬來定義這個時鐘:
NET“SysClk” TNM_NET =“SysClk”;
TIMESPEC “to ̄ SysClk ” = PERIOD "SysClk" 10 ns HIGH 45%;
圖3 周期約束設(shè)計范例一
這個例子首先在時鐘網(wǎng)線上附加了TNM_NET約束,把Clk驅(qū)動的所有同步元件定義成一個名為“sys_clk”的分組,然后使用TIMESPEC約束定義時鐘周期。這種定義時鐘周期的方法使用了標(biāo)識符,在定義其他時鐘周期時可以引用這個標(biāo)識符,大大方便了派生時鐘的定義。
一種特殊情況的周期約束是相關(guān)時鐘。前面提到周期約束不會覆蓋異步路徑,如圖1所示的D路徑。但是如果兩個時鐘是“相關(guān)”的,則實現(xiàn)工具和時序分析工具會考慮這個路徑。因此對這樣的路徑不需要再設(shè)置FROM TO約束,相關(guān)內(nèi)容包括自動相關(guān)和人為相關(guān)。我們來分別看看幾種情況。
(1)圖4所示的相關(guān)時鐘約束1為兩個時鐘來自于同一個DCM,我們只需對DCM的輸入時鐘執(zhí)行周期約束,則DCM輸出的兩個時鐘就會通過DCM自動關(guān)聯(lián),它們之間的路徑就會自動地被分析。
圖4 相關(guān)時鐘約束1
例如,我們做如下約束:
NET "CLKIN"TNW_NET = "CLKIN";
TIMESPEC "TS_CLKIX" = PERTOD "CLK△N"10.O ns HIGH 50%;
則兩個時鐘之間的路徑就會被這樣分析:
Slack:3.926ns
Source:DataRegSlow._d2_3 (FF)
Destination:DataRegFast_d3_3 (FF)
Requirement :5.OOOns
Data Path Delay :0.874ns (Levels of Logic = 0)
Clock Path Skew:0.000ns
Source Clock: C=CLK1X rising at O.000ns
Destination Clock: CLKZX_DCM rising at 5.000ns
Clock Uncertainty : 0.200ns
(2)如剛才的電路可以不對DCM輸入時鐘做約束,而分別對兩個時鐘單獨(dú)做周期約束,如圖5所示。由于CLK2X的周期是基于CLK1X的周期定義的,所以這樣兩個時鐘就被人為地關(guān)聯(lián)起來,它們之間的路徑也會自動地被分析。
圖5 相關(guān)時鐘約束2
例如,我們做如下約束:
NET"CLKI1X"TNM_NET = "CLK1X";
NET"CLK2X"TNM_NET = "CLK2X";
TIMESPEC "TS_CLK1X" = PERIOD "CLK1X" lO.O ns HIGH 50%;
TIMESPEC "TS_CLK2X" = PERTOD "CLK2X" TS_CLX△CLK1X/2;
則其之間的路徑就會被這樣分析:
Slack:3.926ns
Destination :DataRegSlow_d2_3 (FF)
Requirement :DataRegSlow_d2_3 (FF)
Data Path Delay :0.874ns (Levels of Logic=0)
Clock Path Skew:0.0O0ns
Source Clock :CLK1X rising at O.000ns
Destination Clock:CLK2X rising at 5.000ns
Clock Uncertainty :0.200ns
(3)兩個時鐘都是從FPGA外面送進(jìn)來的,如圖6所示,也可以對它們單獨(dú)設(shè)置的周期約束,但是CLK2X的周期是基于CLK1X的周期定義。通過這種方式可以把兩個時鐘人為關(guān)聯(lián)起來,它們之間的路徑也會自動地被分析。
圖6 相關(guān)時鐘約束3
例如,我們做如下約束:
NET "CLK1X" TNM NET = "CLK1X";
NET "CLK2X" TNM NET = "CLK2X";
TIMESPEC "TS_CLK1X" = PERTOD "CLK1X"10.O ns HIGH 50%;
TIMESPEC "TS_CLK2X" = PERTOD "CLK2X" TS_CLK1x/2;
則兩個時鐘之間的路徑就會被這樣分析:
Slack: 3.926ns
Source: DataRegSlow_d2_3 (FF)
Destination:DataRegFast_d2_3 (FF)
Requirement:5.OOOns
Data Path Delay: 0.874ns (Levels of Logic =0)0.OOOns
Clock Path Skew: 0.0OOns
source clock:CLK1X rising at 0.000ns
Destination Clock: CLK2X rising at 5.000ns
Clock Uncertainty:0.200ns
(4)兩個時鐘都是從FPGA外面送進(jìn)來的,而且還有特定的相位關(guān)系。這種情況也可以單獨(dú)做周期約束,但是CLK2X的周期是基于CLK1X的周期定義,同時需要再加上相位關(guān)系。通過這種方式可以把兩個時鐘人為地關(guān)聯(lián)起來,它們之間的路徑也會自動地被分析,如圖7所示。
圖7 相關(guān)時鐘約束4
例如,我們做如下約束:
NET "ClklX" TNM_NET = "ClklX"
NET "Clk2X180" TNM_NET = "Clk2X180";
TIMESPEC "TS_Clk1X" = PERIOD "ClklX"10.0ns;
TIMESPEC "TS_Clk2X180" =PERTOD "Clk2X180" TS_ClklX/2 PHASE+2.5 nS:
則該路徑會被按照2.5 ns來分析。
在ISE的語言模版中有UCF的語法模板可供用戶參考,如圖8所示。
圖8 約束設(shè)置UCF模板示意
來源:ks991次