"); //-->
在设计中为了保证时序的性能,常常要加入一些约束,使布局布线能优化一些或是按照我们的意思走;
以前对于约束相当地陌生,只知道给时钟加上约束,如100MHz的时钟在布局线前要给它加大于100MHz的时钟约束(如125MHz),以便布线结果可以朝着这个结果去布,这样的约束可以尽量提高这一时钟Slack的性能,如果设计不是组合逻辑很多、扇出太大等,一般这一要求加上这一约束都是可以达到的;题外话多了,呵呵
这里要说的不是这一约束,而是将输入输出管脚约束到芯片IOB中的一种约束。
顾名思义,这一约束就是要让输入、输出的 寄存器 快一些:)以保证其在管脚处的时序稳定快速一些
方法:Assignment Editor - 找到管脚 - 选Fast Input/Output Register - On:)
注意:
1、一般来讲,IOB中只有少量的逻辑资源,它会有寄存器,但它几乎没有任何组合逻辑资源,因此需被约束到管脚上的寄存器不能有任何组合逻辑;
如果输入一进来就是一驱多,输出是经过组合逻辑后直接输出到管脚上的寄存器,则会出现布线布不通的问题;
但事实上,如果不是资源或功耗要求很高,我们一般都会采用同步设计方式,而对外接口部分在同步设计中一般被视作异步接口,设计中会对接口做同步处理;
常用的同步处理做法就是将变量用系统时钟打二拍,如果你的每个管脚都用寄存器打过两拍,那么基本上也就不存在上述问题了
2、被约束的寄存器除了受组合逻辑影响外,还会受到时钟驱动区域的影响;
在设计中,为了保证时钟的Skew等性能,一般会将时钟加入全局时钟网络或区域时钟网络,如果是全局时钟网络自不必管,它可驱动整个芯片,但如果是区域时钟约束就要注意了;
区域时钟的驱动范围是“a single quadrant”,在ALTERA的Datasheet中经常出现quadrant或quad等词,怀疑了好久,原来它的确就是“四分之一”的意思,“a single quadrant”的区域驱动范围也就是说用这个时钟驱动的寄存器只能待在这个时钟所属的1/4芯片范围内,而不能越界到其它地盘上!
我的例子:
CLK1驱动芯片左下角的EPLL,产生CLK2,CLK2被约束成区域时钟,驱动多个管脚;
不幸的是,硬件上这几个管脚都远在芯片的右上角。。。
于是,我的布线始终不通过,说是有冲突,还列出了两条Info,显示了两个寄存器,其中一个还是FIFO的输出,开始怎么也不明白它们两个会有什么冲突,后来再仔细看不是说它们俩有冲突,而是说可能与时钟约束有冲突;
记得哪里曾经提到,如果这一约束与Location约束相冲突,系统在这种情况下默认选择了Location约束,找到那篇文章后发现那里列出的Warning非常明显,一看就明白是选了Location约束而未实现此约束,但那条Warning的样子与我的一点不同,在又想了想,想不出别的思路后,我还是觉得与Location有点关系;
于是查询该寄存器所用时钟约束,发现我虽然未对其做任何约束,但在从PLL输出后,系统自动将其处理成了区域时钟!区域时钟只能走1/4芯片范围,于是我又查了我要约束的寄存器输出管脚,发现其果然不在此quad,而在对角quad:)
于是,我立刻联想起了那篇文章中与Location约束冲突的文章,我想应该就是这个问题了;
解决:
我将CLK1约束成全局时钟,再约束其驱动的PLL为右上角的PLL,即管脚所在的quad,结果布线果然通过:)
不过此时会出现一个严重警告,说是你的PLL用的时钟不是其专用的时钟管脚,它的JITTER性能可能会下降;
第一次碰到严重警告,有点心虚,测了一下布线结果基本上没什么问题,于是就没大理,但始终不太明白怎么回事。。。
后来咨询了下ALTERA的FAE,得知,每个PLL都有几个专用的外部输入管脚,反过来说,就是从那几个专用时钟管脚进来的时钟就应该被安排到它所属的那个PLL,如果你用了别的PLL,那么理论上,它就不能保证时序是最优的了,但问题不大:)
总结一下,如果碰到这种情况,我能想到的方法如下:
1) 如上,CLK1-全局时钟,CLK1驱动管脚所在quad的PLL;
方法:Assignment Editor-选PLL-找到该时钟所在PLL-约束到所需PLL位置,PLL的位置可以在Datasheet上查到;
2) 将CLK2约束成全局时钟
如果全局时钟资源够的话,这种方法最简单了:)
方法:Assignment Editor - 找到CLK2 - 约束为Global Signal - On;
3) 刚才想着来着,这一会儿就忘了,以后补上。。。
3、Fast Output Enable Register
只知道其和三态有些关系,但具体的用法知之不细,这里只列出我所知道的一点
用于约束inout类型变量,如CPU接口的双向数据总线;
需要注意的一点是,在约束时它不是单独用,而是要三管齐下!
想想也对,inout变量本来就有in,out两种属性,再加上其的确需要有Enable信号来控制选择in还是out,所以当然应该加Enable
于是,对inout变量的管脚约束,需要有
Fast Input Register
Fast Output Register
Fast Output Enable Register
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。