还没有用到,但很快就会,先整理自己留着,用过后再加入一写总结之类。
在http://asdf123321123.spaces.eepw.com.cn/articles/article/item/61813基础上整理的。
=======================
概述:
将输入输出管脚约束到芯片IOB中的一种约束,让输入、输出的寄存器快一些,以保证管脚处的时序稳定快速一些。
方法:Assignment Editor - 找到管脚 - 选Fast Input/Output Register - On
注意:
1、一般来讲,IOB中只有少量的逻辑资源,它会有寄存器,但它几乎没有任何组合逻辑资源,因此需被约束到管脚上的寄存器不能有任何组合逻辑。
如果输入一进来就是一驱多,输出是经过组合逻辑后直接输出到管脚上的寄存器,则会出现布线布不通的问题。
事实上,如果不是资源或功耗要求很高,我们一般都会采用同步设计方式。对外接口部分在同步设计中一般被视作异步接口,设计中会对接口做同步处理。
常用的同步处理做法就是将变量用系统时钟打二拍,如果你的每个管脚都用寄存器打过两拍,那么基本上也就不存在上述问题了
2、被约束的寄存器除了受组合逻辑影响外,还会受到时钟驱动区域的影响。
在设计中,为了保证时钟的Skew等性能,一般会将时钟加入全局时钟网络或区域时钟网络。
如果是全局时钟网络自不必管,它可驱动整个芯片。
区域时钟的驱动范围是“a single quadrant”(quadrant = quad),“a single quadrant”的区域驱动范围也就是说用这个时钟驱动的寄存器只能待在这个时钟所属的1/4芯片范围内,而不能越界到其它地盘上!
我的例子:
clk1驱动芯片左下角的PLL,产生clk2,clk2被约束成区域时钟,驱动多个管脚;
不幸的是,硬件上这几个管脚都远在芯片的右上角。。。
于是,我的布线始终不通过,说是有冲突,还列出了两条Info,显示了两个寄存器,其中一个还是FIFO的输出,开始怎么也不明白它们两个会有什么冲突,后来再仔细看不是说它们俩有冲突,而是说可能与时钟约束有冲突;
记得哪里曾经提到,如果这一约束与Location约束相冲突,系统在这种情况下默认选择了Location约束,找到那篇文章后发现那里列出的Warning非常明显,一看就明白是选了Location约束而未实现此约束,但那条Warning的样子与我的一点不同,在又想了想,想不出别的思路后,我还是觉得与Location有点关系;
于是查询该寄存器所用时钟约束,发现我虽然未对其做任何约束,但在从PLL输出后,系统自动将其处理成了区域时钟!区域时钟只能走1/4芯片范围,于是我又查了我要约束的寄存器输出管脚,发现其果然不在此quad,而在对角quad。
解决:
我将CLK1约束成全局时钟,再约束其驱动的PLL为右上角的PLL,即管脚所在的quad,结果布线果然通过。
总结一下,如果碰到这种情况,我能想到的方法如下:
1) 如上,clk1-全局时钟,clk1驱动的管脚与clk1所在quad的PLL;
方法:Assignment Editor-选PLL-找到该时钟所在PLL-约束到所需PLL位置,PLL的位置可以在Datasheet上查到;
2) 将clk2约束成全局时钟
如果全局时钟资源够的话,这种方法最简单了。
方法:Assignment Editor - 找到clk2 - 约束为Global Signal - On;。
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
文章评论(0条评论)
登录后参与讨论