一.概述
对于时序路径来说,一共有4种时序路径,如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/6911357a4b564c8f011e379af71b0294.png)
(1)从上游芯片最后一级触发器的时钟发送沿有效到FPGA中第一级触发器的输入。
(2)FPGA内部从上级触发器时钟发送沿有效到下级触发器的输入。
(3)从FPGA最后一级触发器的时钟发送沿有效到下游芯片第一级触发器的输入。
(4)从FPGA的输入端口经过组合逻辑直接到FPGA的输出端口。
根据不同的时序路径就有一些不同类型的时序约束。进行时序分析的前提是有正确的时序约束。
二.时序约束介绍
2.1主时钟约束
对于时序约束来说,主时钟约束是基准。主时钟有两种,第一种是外部晶振产生的时钟,第二种是GT产生的接收端时钟和发送端时钟。
create_clock -period 20.000 -name clk50m_i -waveform {0.000 10.000} [get_ports clk50m_i]
create_clock -name rxclk -period 3.33 [get_pins gt0/RXOUTCLK]
2.2手动生成的时钟
对于MMCM和PLL,只用约束他们的输入时钟(一般是主时钟),工具会自动生成他们的输出时钟。而对于自己手动生成的时钟,比如分频时钟,需要约束。
create_generated_clock -name clkdiv2 -source [get_ports clkin] -divide_by 2 [get_pins REGA/Q](由clkin分出来的二分频时钟)
2.1和2.2就把需要约束时钟周期的时钟介绍了,下面介绍其他类型时序约束。
2.3异步时钟组
对于异步时钟的跨时钟域,应告诉工具此为异步时钟组,不需要做时序分析,否则工具会对此做不正确的时序分析,增加编译时间,为了优化此处时序,还会侵占关键路径的布局布线资源。但是告诉工具不代表不用人为的去做跨时钟处理,只是让工具对此处不分析。
set_clock_groups -asynchronous -group CLKOUT0 -group CLKOUT1
2.4互斥时钟组
对于两个时钟A,B输入,然后经过一个BUFGMUX产生一个C时钟的情况,那么就会产生互斥时钟。
(1)若A、B、C三个时钟都没有交集,那么需声明A、B为逻辑互斥(-group对象不同,一个A,一个B)时钟组。
(2)若A、B、C三个时钟有交集,那么需声明由A产生的C时钟和由B产生的C时钟为物理互斥(-group对象相同,都是BUFGMUX的O端)时钟组。
![](https://i-blog.csdnimg.cn/blog_migrate/2295f6ec5cc590a0786df9971458b53b.jpeg)
2.5伪路径约束
对于上电才会工作的寄存器对应的路径、异步复位路径、只在测试时才会用到的逻辑对应的路径,都要告知工具这是一条不需要时序分析的路径。好处类似于异步时钟组约束。
set_false_path -from [get_pins rst_n_tmp_reg/C]
2.6多周期约束
下图是多周期约束的一些概念:
![](https://i-blog.csdnimg.cn/blog_migrate/d334d06a60f8bd315b56fd8004e06bf1.png)
由于缺省情况下,工具默认的是单周期约束,多周期约束的目的就是放松该条路径的时序,如果可以多周期约束的路径没有进行约束,那么就会按照单周期就行时序的过优化,侵占其他关键路径的布局布线资源,造成其他关键路径的时序为例和建立时间裕量变小。
案例:
![](https://i-blog.csdnimg.cn/blog_migrate/d5fb2b99a648a10f0f74ca64f1abc4dc.png)
2.7Input_delay约束
input_delay是上游芯片最后一级触发器的发送沿有效时到数据到达FPGA port时的延时。
![](https://i-blog.csdnimg.cn/blog_migrate/748d6590aadda443659b9d50abf8c0d9.png)
set_input_delay -clock clk 4 [get_ports din](告诉工具,上游芯片在数据输入到FPGA端口需要4ns,也就是在建立时间不违例的前提下,FPGA内部Tdata加Tsu最多有6ns的时间)
2.8Output_delay约束
output_delay是从FPGA的port到下游芯片的第一级触发器的捕获沿有效时的延时。反映的是下游芯片的第一级触发器能稳定捕获数据的时间段。
![](https://i-blog.csdnimg.cn/blog_migrate/83d41b2ba869ccf1ce5a02f3d71c92db.png)
set_output_delay -clock clk 6 [get_ports dout](告诉工具,下游芯片在数据输入后需要6ns才能满足建立时间需求稳定的采到数据,也就是FPGA内部Tco加Tdata需控制在4ns以内)
2.9Max_delay约束
FPGA输入port经过组合逻辑直接输出到输出port的延时。或者多周期路径、异步路径间使用(不常用)
![](https://i-blog.csdnimg.cn/blog_migrate/62d57426b4ba20e688d0a38e974a81f7.png)