fpga 时序约束

参考bilibili网址:https://www.bilibili.com/video/BV1ME41127So?p=4

参考****网址:https://blog.****.net/zhanghaijun2013/article/details/104105707

参看知乎网址:https://zhuanlan.zhihu.com/p/37068922

 

 

1、如何查看时钟周期约束状态

fpga 时序约束

 

(1)在上图中tcl命令框里,输入命令

report_clock_neworks -name mainclock

会出现

fpga 时序约束

里面包含了已经约束的时钟和未被约束的时钟

(2)输入命令

check_timing -override_defaults no_clock

在tcl框里面出现

fpga 时序约束

这里可以看到,有驱动59个寄存器的时钟未被约束。

2、如何查看时钟约束是否生效

在tcl命令输入

report_clocks

fpga 时序约束

这里的话,实际上pll的输出时钟已经添加的了约束。

其中clkfbout是一个PLL会自动输出一个反馈时钟。

fpga 时序约束 

我这里的320m实际上是用的200m,所以周期是5ns

 一般来讲,我们的输入时钟都是差分的,此时我们只对P端进行约束即可。如果同时约束了P端和N端,通过report_clock_interaction命令可以看到提示unsafe。这样既会增加内存开销,也会延长编译时间。

 

3、clock_group的用法

使用方法为:

 

set_clock_groups -asynchronous -group <clock_name_1> -group <clock_name_2>

set_clock_groups -physically_exclusive  -group <clock_name_1> -group <clock_name_2>

 

  这个约束常用的方法有三种,第一种用法是当两个主时钟是异步关系时,使用asynchronous来指定。这个在我们平时用的还是比较多的,一般稍微大点的工程,都会出现至少两个主时钟,而且这两个时钟之间并没有任何的相位关系,这时就要指定:

 

create_clock -period 10 -name clk1 [get_ports clk1]

create_clock -period 8 -name clk2 [get_ports clk2]

set_clock_groups -asynchronous -group clk1 -group clk2

 

  第二种用法是当我们需要验证同一个时钟端口在不同时钟频率下能否获得时序收敛时使用。比如有两个异步主时钟clk1和clk2,需要验证在clk2频率为100MHz,clk1频率分别为50MHz、100MHz和200MHz下的时序收敛情况,我们就可以这样写。

 

create_clock -name clk1A -period 20.0 [get_ports clk1]

create_clock -name clk1B -period 10.0 [get_ports clk1] -add

create_clock -name clk1C -period 5.0  [get_ports clk1] -add

create_clock -name clk2 -period 10.0 [get_ports clk2]

set_clock_groups -physically_exclusive -group clk1A -group clk1B -group clk1C

set_clock_groups -asynchronous -group "clk1A clk1B clk1C" -group clk2

 

  第三种用法就是当我们使用BUFGMUX时,会有两个输入时钟,但只会有一个时钟被使用。比如MMCM输入100MHz时钟,两个输出分别为50MHz200MHz,这两个时钟进入了BUFGMUX,如下图所示。

  fpga 时序约束

在这种情况下,我们需要设置的时序约束如下:

 

 

set_clock_groups -logically_exclusive \

-group [get_clocks -of [get_pins inst_mmcm/inst/mmcm_adv_inst/CLKOUT0]] \

-group [get_clocks -of [get_pins inst_mmcm/inst/mmcm_adv_inst/CLKOUT1]]

 

4、开始进行时序约束

(1)梳理时钟树,确定主时钟和衍生时钟等等内容。

(2)查看各个时钟之间是否有交互,及clkA产生的数据是否在clkB的时钟域中被使用。

 

然后依次进行约束,在vivado中,可以在

Edit timing constraints 里面进行约束

fpga 时序约束

这里面几乎涵盖了所有的时钟约束类型,一个一个去了解的话,参考文章开头的网址链接,里面有详细的说明。

 

另一个是在

Constraint wizard里面

界面如下:

fpga 时序约束 时序约束向导会按照主时钟约束、衍生时钟约束、输入延迟约束、输出延迟约束、时序例外约束、异步时钟约束等的顺序引导设计者创建约束。

 

 

 

fpga 时序约束