在工程设计的逻辑描述后,整个工程的设计并没有完全结束。一般还要添加约束,以实现设计的最优效果。约束不仅存在于应用工程的设计中,在IP核的设计中同样存在约束,作为IP核在例化时的指导性文件。因此约束一般分为工程约束与IP核约束两个主要内容,IP核的约束一般提供相对位置,相对区域,相对时序的约束。IP核的约束最终也要满足工程约束的要求。因此如果IP的约束与系统的总约束发生冲突,以系统总约束为最终约束。如图1所示。

图1
除了IP核与工程总约束外,按照约束内容可以将约束分为如下几种情况。
1.约束分类
约束按照内容可分为物理约束和时序约束两种。
-
物理约束
物理约束包含 管脚锁定,电平标准,终端匹配电阻,区域约束,位置约束等。
-
时序约束
对时序进行约束,包括时钟周期,输入延时,输出延时,多时钟延时,非相关路径约束解除等内容。
由于约束的内容纷繁复杂,各项的功能也不完全一样,因此详细的内容将在后续章节中逐一介绍。
2.约束的目的
(1)物理约束的目的:
- 管脚锁定,由于在基于HDL语言描述的设计中为了保持电路的通用性,因此在设计时并不指定具体的管脚,因此在结合具体的工程与具体的器件,最终在工程中的约束文件中实现。
- 电平标准,在FPGA为基础的设计中,由于FPGA是按照BANK进行组织的,这样可以保证在同一颗FPGA的芯片上可以提供与FPGA外围周边电路最大的电平的适应性与兼容性,硬件工程师可以根据需要安排不同的BANK与不同的外围电路进行接口。如在FII-PRA100D 的开发板中用于DDR3接口的BANK,该BANK的IO供电电压采用1.5V(如果低电压系列应为1.35V等),而其它的BANK如开关、按键等外围电路对应的BANK一般供电电压采用3.3V, 以满足不同的适应性。如图2所示,

图2 FII-PRX100D 不同BANK的电压配置
- 终端匹配电阻约束,在使用LVDS等差分信号时,如果需要终端匹配电阻,可以在约束文件中加入相应的约束以实现FPGA片内的终端电阻的挂接,消除由片外硬件实现终端电阻的方案。
- 区域约束,在特殊的应用领域,可以将部分逻辑约束在一定区域内,实现最小的布线延迟。在高速或超高速的IP设计中尤为重要。一般可以把IP的区域约束设置为相对位置区域约束(re-location),在工程总体布线时由综合和布线工具决定定义的区域块的最终位置。如果工程的设计已经完成,也可以将区域设置设为绝对位置区域约束,这种设定往往对整个系统的优化有负面影响。
- 斜升率约束,通过可以改变IO的输出陡度,斜升率越高,IO的变化速度越快。
(2)时序约束目的
1)把最好的资源,留给最需要的部分,
2)timing report 文件,根据timing report 文件修改设计,如是否需要修改源代码,是否需要加区域约束等。
3)false-path ,利用false-path消除不需要的约束。在异步时钟域的设计中,对数据在异步时钟域的交换往往是由HDL源代码进行妥善处理,如果已经确保异步时钟域之间的数据交换可以可靠过渡,可以通过false-path 的约束方式通知综合布线工具忽略异步时钟的时序约束关系,加速系统的布局布线,同时也可以提高系统总体的时序收敛效果。
4)multi-clock,在众多的应用中,经常会出现在高频时钟内计算某一特定的值,但是计算结果往往并不需要在紧邻的下一个时钟内使用,可以给出宽松的约束。比如,在100M时钟下的组合逻辑延迟达到25ns, 此时在时序锁存时必然会报出时序收敛(timing closure)不满足的错误,如果该逻辑运算结果在三个时钟周期后才使用,实际应用中是没有问题的,但如果不加multi-clock的约束,综合与布线工具必然会尽量优化该部分逻辑与布线。最终结果该部分逻辑没有达到预定的结果(延时优化到10ns以内),可能还会将其它本该满足时序要求的逻辑电路变得时序上没有收敛。
5)时钟分组约束,一个系统中可能会存在很多时钟,不同的时钟提供不同的分组,或者多个时钟分 配到一个组中,关于分组时钟的内容,在后续文章中讲解。
6)调节数据与时钟的相位关系,如输入延迟,输出延迟,最大延迟等。使数据与时钟保持合理的相位关系,便于数据采样。
3. 约束文件及使用原则
(1)约束文件
约束的设定是通过文件实现的,在FPGA工程设计中Xilinx与Intel-Altera采用的约束文件不同。
Xilinx ISE: 采用扩展名为UCF(User Constraint File)的文件,时序和物理约束文件。
Xilinx Vivado: 采用扩展名为XDC(Xilinx Design Constraint)文件,时序和物理约束文件。
Intel-Altera: 物理约束采用扩展名为QSF(Quartus Prime Settings )的文件。
Intel-Altera: 时序约束采用扩展名为SDC (Synopsys Design constraint )文件。
(2)约束文件的使用原则:
一个工程文件可以有一个或多个约束文件,其中每个内含的子工程或IP都可以有自己的约束文件,最后工程一般都会有属于工程自己的约束文件。 约束文件的内容按照内容读取的先后顺序,后读取的约束可以覆盖先读取的相同约束。 子模块中的约束文件一般比工程文件的约束文件先读取。 在工程文件中如果有多个工程文件是按先后顺序读取的,在使用时应注意约束条件的相互覆盖带来的问题。应尽力避免相互覆盖。 如果使用PLL,则PLL子模块中会给出时钟的频率,周期,相位等约束,以及输入、输出时钟关系,同时PLL一般会有对时钟相位补偿的作用。
阅读本篇文章后对时序约束有了整体的了解,尤其对文中提到的“约束目的”部分理解最为深刻,感谢老师的精心撰写,期待更多有关“约束与优化”领域的文章,谢谢老师!
在阅读时遇到一些疑问,请老师解答:
1、对文中提到的“区域约束、位置约束”不太理解,请老师通过简单例子再介绍一下吧!
2、对文中提到的“非相关路径约束解除”不太理解,这里是指的异步时钟域的情况吗?
关于这些问题的解答,请参照视频中的详细解答。