相信很多人接触FPGA后,或多或少都听说过时序约束的概念;也看过很多的时序约束教程,但是大部分教程都是通用的、理论性的,很少会有教程告诉你,针对某一款工具,我们究竟该怎么去做时序约束。更有甚的,有的人把时序约束和时序分析混为一谈,把人越搅越晕。
一 时序约束与时序分析
那么,要讲清楚时序约束,我觉得有必要先讲清楚什么是时序约束?时序约束和时序分析是什么关系?
约束、约束、何为约束?除了时序约束,还有物理约束对吧!那么物理约束是干嘛的呢,我们基础的物理约束包括pin脚位置约束 和 电平约束。所以从这里我们不难看出,所谓约束,就是我们将自己的设计信息告诉工具的一种方式。物理约束告知pin脚位置和电平(当然还有一些高阶的物理约束可以固定BRAM/DSP core的位置),时序约束顾名思义就是告知频率、占空比、IN/OUT delay等等信息,告知工具我们设计的时序条件。
再说,时序约束 与 时序分析有什么关系!
很多人估计都见过这种静态时序分析模型;
跟着别人在那算来算去,最后也没搞明白怎么做时序约束。一通运行下来,时序“爆红”一大堆也不知道怎么解决,本着能用就行的态度,也放那不管,等下一个有缘人。 那么到底什么是时序分析?简单来说,时序分析是工具检查设计是否满足时序要求的一个步骤;所以这里有个重点,时序分析是工具来执行的,不是工程师,工程师只需要知道其分析的原理,知道出现时序“爆红”时的改善方向。那么,工具用来分析是否满足时序要求的标准,这个标准就是时序约束。所以,做时序约束,也可以理解为告知工具我们的时序目标,这个要求不是越严越好,也不是越宽松越好;准确最重要。
二 时序约束的内容
其实,对于不同的工具,其约束的内容也会不一样。比如:ISE就是从FPGA的视角看问题,它会认为所有缺省的的时钟之间的约束都是异步的,不会主动进行时序分析(除非事先约束为同步);而Vivado则完全相反,Vivado默认所有的时钟除非事先声明都作同步处理,没有作例外约束或时钟分组,工具会主动分析每一条跨时钟域路径。这也是为什么很多人由ISE切换到Vivado之后,吐槽Vivado综合实现慢的原因;看看“爆红”的路径,有没有“requirement = 0.x” 的无理要求,这明显就是时序约束没有设置正确的原因。
那么针对 Vivado 我们需要进行哪些时序约束设置呢?这里只做简述,后续文章再展开介绍
1、时钟约束:
create_clock
设置输入时钟约束,包括晶振的输入和GTX的输入;最重要需要最早设置 ;
create_genarate_clock
设置衍生时钟约束
set clock group
设置时钟分组,告知工具各时钟的异步和同步关系
2、IO约束:
set input/output delay
set max/min delay
缺省IO约束,Vivado 会默认时序要求无穷大,综合实现都不会考虑I/O的时序优化,时序分析时也不会针对未约束的路径“爆红”
3、例外约束
set false path
伪路径约束,告知工具不用分析该路径;
set multicycle
多周期约束,放宽时序分析条件,但还不是完全不分析;
三、如何在Vivado进行时序约束
1、推荐通过Constraints Wizard来进行约束
2、通过Tool --> language Templates --> XDC 中的模板直接编写XDC文件进行约束