周期约束分析
扫描二维码
随时随地手机看文章
周期〈Period)约束的对象是该时钟所驱动的所有同步元件之间的路径,但是不会覆盖如图1所示的A、B、C和D路径,以及输入引脚到输出引脚〈纯组合逻辑〉、输入引脚到闷步元件、同步元件到输出引脚,还有Clk1到Clk2之间的异步路径,
在进行周期Period约柬之前,需要对电路的时钟周期进行估计,不要便用过松或过紧的约束。设讨内部电路所能达到的最南运行频率取决于同步元件本身的建立保持时间,以及同步元件之间的逻辑和布线延迟。虽然布线延时无法估计,但逻辑延时应该可以大致估计,如图2所示。通常可以根据逻辑延时和布线延时各占40%和60%的比例来判断将要设置的周期约束对于当前的设计是否现实或合理。
图1 周期约束所达到的范围
图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”的时钟网线所驱动的同步元件上,用TIMEGRP表示PERIOD约束作用到TiMEGRP所定义的分组(包括FFS、LATCH和RAM等同步元件)上。period是目标时钟周期,单位可以是ps、ns、μS和ms等。HIGH|LOW指出时钟周期中的第1个脉冲是高电平还是低电平,high_or_low_time为HIGH LOW指定的脉冲的持续时间,默认单位是ns。如果没有该参数,时钟占空比是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]
下面举个例子来说明如何设置周期约束。考虑图3所示的电路设计范例1,输入时钟的周期是10ns,并且是上升沿动作,占空比为45%高电平,55%低电平。
我们可以用这样的UCF语旬来定义这个时钟:
NET“SysClk” TNM_NET =“SysClk”;
TIMESPEC “to ̄ SysClk ” = PERIOD "SysClk" 10 ns HIGH 45%;
图3 周期约束设计范例一
这个例子首先在时钟网线上附加了TNM_NET约束,把Clk驱动的所有同步元件定义成一个名为“sys_clk”的分组,然后使用TIMESPEC约束定义时钟周期。这种定义时钟周期的方法使用了标识符,在定义其他时钟周期时可以引用这个标识符,大大方便了派生时钟的定义。
一种特殊情况的周期约束是相关时钟。前面提到周期约束不会覆盖异步路径,如图1所示的D路径。但是如果两个时钟是“相关”的,则实现工具和时序分析工具会考虑这个路径。因此对这样的路径不需要再设置FROM TO约束,相关内容包括自动相关和人为相关。我们来分别看看几种情况。
(1)图4所示的相关时钟约束1为两个时钟来自于同一个DCM,我们只需对DCM的输入时钟执行周期约束,则DCM输出的两个时钟就会通过DCM自动关联,它们之间的路径就会自动地被分析。
图4 相关时钟约束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输入时钟做约束,而分别对两个时钟单独做周期约束,如图5所示。由于CLK2X的周期是基于CLK1X的周期定义的,所以这样两个时钟就被人为地关联起来,它们之间的路径也会自动地被分析。
图5 相关时钟约束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外面送进来的,如图6所示,也可以对它们单独设置的周期约束,但是CLK2X的周期是基于CLK1X的周期定义。通过这种方式可以把两个时钟人为关联起来,它们之间的路径也会自动地被分析。
图6 相关时钟约束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外面送进来的,而且还有特定的相位关系。这种情况也可以单独做周期约束,但是CLK2X的周期是基于CLK1X的周期定义,同时需要再加上相位关系。通过这种方式可以把两个时钟人为地关联起来,它们之间的路径也会自动地被分析,如图7所示。
图7 相关时钟约束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 约束设置UCF模板示意
来源:ks991次