打印

xilinx的约束实现(2)

[复制链接]
1319|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shang651|  楼主 | 2012-10-11 22:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
xilinx的约束实现(2)2)偏移约束
偏移约束规定了外部时钟和数据输入输出引脚之间的时序关系,只用于与PAD相连的信号,不能用于内部信号。
使用该约束可以为综合实现工具指出输入数据到达的时刻,或者输出数据稳定的时刻,从而在综合实现中调整布局布线过程,
使正在开发的FPGA/CPLD的输入建立时间以及下一级电路的输入建立时间满足要求。

基本语法如下:
OFFSET = {IN|OUT} “offset_time” [units] {BEFORE|AFTER} “clk_name” [TIMEGRP “group_name”];
其中{IN|OUT}说明约束的是输入还是输出,offset_time为FPGA引脚数据变化与有效时钟沿之间的时间差,BEFORE|AFTER说明该时间差在有效时钟沿的前面还是后面,TIMEGRP “group_name”定义了约束的触发器组,缺省时约束该时钟驱动的所有触发器。
OFFSET根据芯片外围电路的时序特性约束了内部延时。
OFFSET_IN 约束输入信号
OFFSET_IN_AFTER:输入信号(in)在时钟后(after)多长时间进入芯片。
OFFSET_IN_BEFORE:输入信号(in)在时钟前(before)多长时间进入芯片。
显然 CLOCK = OFFSET_IN_AFTER + OFFSET_IN_BEFORE。
OFFSET_IN_AFTER 反映的是外围电路的时序特性,我们无法左右。
OFFSET_IN_BEFORE 是留给芯片的时序余量。PAR的目的就是要满足这个余量,不得超过。
OFFSET_OUT 约束输出信号
OFFSET_OUT_AFTER:输出信号(out)在时钟后(after)多长时间输出芯片。
OFFSET_OUT_BEFORE:输出信号(out)在时钟前(before)多长时间输出芯片。
显然 CLOCK = OFFSET_OUT_AFTER + OFFSET_OUT_BEFORE。
OFFSET_OUT_BEFORE 反映的是外围电路的时序特性,我们无法左右。
OFFSET_OUT_AFTER 是留给芯片的时序余量。PAR的目的就是要满足这个余量,不得超过。

OFFSET = IN 10 ns BEFORE "i_ref_clk";
NET “Q_OUT” OFFSET=OUT 15.0 BEFORE “CLK_SYS”;
说明:第二个例子好理解,第一个例子没有指明对象,表示所有受到“i_ref_clk”约束的信号都被施加了该约束

3)分组约束
使用TNM(Timing Name)约束可以选出构成一个分组的元件,并赋予一个名字,以便给它们附加约束。
TNM_NET(timing name for nets)约束只加在网线上,其作用与TNM加在网上时基本相同,即把该网线所在路径上的所有有效同步元件作为命名组的一部分。
不同之处在于当TNM约束加在PAD NET上时,TNM的值将被赋予PAD,而不是该网线所在的路径上的同步元件,即TNM约束不能穿过IBUF。
而用TNM_NET约束就不会出现这种情况。
TNM是Timing Name的缩写,是一种grouping约束,用于把若干信号组合成一个特定的组以施加相同的约束。例如
INST "o_dbg_out[0]" TNM = "dbg_out";
INST "o_dbg_out[1]" TNM = "dbg_out";
......
INST "o_dbg_out[63]" TNM = "dbg_out";
采用该方法后一些列信号都被列入名为“dbg_out”的组合。然后可以统一施加约束。如
TIMESPEC "TS_FFS_2_dbg_out" = FROM "FFS" TO "dbg_out" TIG;

4)专门约束
附加约束的一般策略是首先附加整体约束,例如PERIOD、OFFSET等,然后对局部的电路附加专门约束,这些专门约束通常比整体约束宽松,
通过在可能的地方尽量放松约束可以提高布线通过率,减小布局布线的时间。

FROM_TO约束在两个组之间定义时序约束,对两者之间的逻辑和布线延迟进行控制,这两个组可以是用户定义的,也可以是与定义的。
用户可以使用TNM_NET、TNM和TIMEGRP定义组,而与定义组主要包括FFS、LATCHES、PADS和RAMS等。语法如下:

TIMESPEC “TSname” = FROM “group1” TO “group2” value;
其中value为延迟时间,可以使具体数值或表达式。
MAXDELAY约束定义了特定网线上的最大延迟,其语法如下:
NET “net_name” MAXDELAY = value units;
TIG是Timing IGnore的缩写。表示忽略该对象上的时序约束。例如
NET “RESET” TIG=TS_fast, TS_even_faster;
表示对RESET信号,时序约束TS_fast和TS_even_faster无效。

关于from to 的约束是一个比较实用,也比较好用的约束。 尤其在跨时钟域处理中的应用,特别有效。
举例: 设计中有两个时钟,一个是PLL的输入,一个是PLL的输出,并且两者为异步形式,当设计中有数据在该两个时钟域中传递时,
又没有用到fifo隔离,那么这个使用就需要用这个约束。
TIMEGRP "tg_from" = RISING "PLL_IN" ;
TIMEGRP "tg_to" = RISING "PLL_OUT" ;

TIMESPEC "TS_CLK" = FROM "PLL_IN" TO "PLL_OUT" TIG;
TIMESPEC "TS_CLK" = FROM "PLL_OUT" TO "PLL_IN" TIG;

这样工具就不会对该两个跨时钟路径就不会分析了。
如果不加这个约束,时序会比较紧,很容易造成其它模块的时序过不去。
当然如果不用TIG,给具体的时间也是可以的,那么时钟域之间的延时只要小于你给的时间值就不会报错。

相关帖子

沙发
GoldSunMonkey| | 2012-10-11 22:32 | 只看该作者
总结的不错。谢谢啦。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

305

帖子

1

粉丝