在进行FPGA的设计时,经常会需要在综合、实现的阶段添加约束,以便能够控制综合、实现过程,使设计满足我们需要的运行速度、引脚位置等要求。通常的做法是设计编写约束文件并导入到综合实现工具,在进行FPGA/CPLD的综合、实现过程中指导逻辑的映射和布局布线。下面主要总结一下Xilinx FPGA时序约束设计和分析。
一、周期约束
周期约束是Xilinx FPGA 时序约束中最常见的约束方式。它附加在时钟网线上,时序分析工具会根据周期约束来检查时钟域内所有同步元件的时序是否满足需求。周期约束会自动的寄存器时钟端的反相。如果相邻的两个元件的时钟相位是相反的,那么它们之间的延迟将被默认的限制成周期约束的一半。
在进行周期约束之前,必须对电路的时钟周期明了,这样才不会出现约束过松或者过紧的现象。一般情况下,设计电路所能达到的最高运行频率取决于同步元件本身的Setup Time 和 Hold Time,以及同步元件之间的逻辑和布线延迟。周期约束一般是使用下面的约束方法:
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]INPUT_JITTER value;
很多时候为了能够定义比较复杂的派生关系的时钟周期,就要使用该方法。其中TIMESPEC在时序约束中作为一个标识符表示本约束为时序规范;TSidentifier包括字母TS和一个标识符identifier共同作为一个TS属性;TNM reference指定了时序约束是附加在哪一个组上,一般情况下加在TNM_NET定义的分组上。HIGH | LOW 指的是时钟的初始相位表明第一个时钟是上升沿还是下降沿;high or low item 表示的是时钟占空比,即就是high或者low的时间,默认为1:1, INPUT_JITTER 表示的是时钟的抖动时间,时钟会在这个时间范围内抖动,默认单元为ps。比如周期约束:
NET "ex_clk200m_p" TNM_NET = TNM_clk200_p;
TIMESPEC "TS_clk200_p" = PERIOD "TNM_clk200_p" 5.000 ns HIGH 50 %;
建立一个TNM_clk200_p的时序分组,包括时钟网络ex_clk200m_p驱动的所有同步元件,这些同步元件都将受到时序规范TS_clk200_p的约束。同步元件到同步元件有5ns的时间要求。占空比为1:1.
二、偏移约束
偏移约束包括OFFSET_IN_BEFORE、OFFSET_IN_AFTER、OFFSET_OUT_BEFORE和OFFSET_OUT_AFTER等4种约束。属于基本的时序约束,它规定了外部时钟和数据输入输出引脚之间的时序关系,只能用于与引脚相连接。其基本的语法为:
OFFSET = {IN | OUT} “offset_time” [units] {BEFORE | AFTER} “clk_name” [TIMEGRP “group_name”];
其中,[IN | OUT] 说明约束是输入还是输出,”offset_time”为FPGA引脚数据变化与有效时钟之间的时间差,[BEFORE | AFTER]说明该时间差在有效时钟沿的前面还是后面,”clk_name”时钟名,[TIMEGRP “group_name”]定义约束的触发器组,缺省时约束clk_name驱动的所有触发器。
1、OFFSET_IN_BEFORE、OFFSET_IN_AFTER约束
OFFSET_IN_BEFORE和OFFSET_IN_AFTER都是输入偏移约束。OFFSET_IN_BEFORE说明了输入数据比有效时钟沿提前多长时间准备好。于是芯片内部与输入引脚相连的,组合逻辑的延迟不能大于这个时间,否则会发生数据采样错误。OFFSET_IN_AFTER是输入数据在有效时间沿之后多久到达芯片的输入引脚。
OFFSET_IN_BEFORE对芯片内部的输入逻辑的约束,约束如下:
NET data_in OFFSET = IN Time BEFORE CLK;
2、OFFSET_OUT_AFTER、OFFSET_OUT_BEFORE约束
这两个都是输出约束,OFFSET_OUT _AFTER规定了输出数据在有效沿之后多久稳定下来,芯片内部的输出延迟必须小于这个数值。OFFSET_OUT_BEFORE是指下一级芯片的输入数据应该在有效时钟沿之前多久准备好。从下一级的输入端的延迟可以计算出当前设计输出的数据必须在何时稳定下来。其基本的语法规则为:“NET data_out” OFFSET=OUT
Time AFTER CLK“;
|