1.1概述
在前面的文章中,我们都是关键的时序路径包括时钟进行的约束都是常规约束。常规的约束是我们用的最多的,但是VIVADO会对一些无关紧要的路径,或者2个异步时钟之间也进行分析等等。所以我们得告诉VIVADO IDE那些路径需要Exceptions。关于Exceptions的含义就是区分于前面的常规分析的异常时序分析。由于没有找到更好的意会的翻译中文,暂且就以“异常”来翻译Exceptions。
1.2 多周期路径(Multicycle Paths)
默认情况下,Vivado IDE时序分析引擎采取单周期分析。这种分析可能过于严格,可能不适用于某些逻辑路径。多周期路径约束允许根据设计时钟波形来修改建立和保持关系。
最常见的例子就是数据在逻辑路径末端稳定需要多个时钟周期,如果路径起始端和末端允许路径控制,Xilinx建议使用“多周期约束”放松对建立时间的要求。保持时间要求可以保持与建立时间的默认关系,也可以根据设计者的需求进行修改,这样有助于时序驱动算法聚焦于关键路径,节省软件运行时间。
1.3 set_multicycle_path 指令
set_multicycle_path指令可以用于修改源时钟路径(source clock)和目的时钟路径(destination clock)成倍数关系的路径,可以用于设置建立时间(setup time)时序分析,保持时间(hold time)时序分析。
语法:
set_multicycle_path <path_multiplier> [-setup|-hold] [-start|-end] [-from <startpoints>] [-to <endpoints>] [-through <pins|cells|nets>]
要点:
1)、默认建立路径的周期倍数是相对于destination clock,使用-start属性可以修改为相对source clock;
2)、默认保持路径的周期倍数是相对source clock,使用-end属性将修改为相对destination clock;
3)、对于相同时钟域或者两个时钟的波形相同的情况下,-start和-end对对周期路径约束没有影响。
set_multicycle_path命令的-setup命令不仅会影响建立时间关系, 而且它还会影响与建立时间相关联的两个保持时间关系,一般还需要使用-hold命令约束保持时间的关系。
可以在单个路径,多个路径甚至两个时钟之间设置多周期约束。下面我们会一一介绍。
1.4单时钟域中的多周期(Multicycles in Single Clock Domain)
单时钟域中的多周期约束
默认建立和保持关系
建立和保持时序要求为:
• Setup check
TDatapath(max) < TCLK(t=Period) - TSetup
• Hold check
TDatapath(min) > TCLK(t=0) + Thold
1.5 具有ce使能的多周期约束
如下图所示是一个适合采用多周期路径分析的电路,data0_reg和data1_reg两个触发器间的路径使能CE每2个周期使能一次,可以使用多周期约束,让第一个destination clock采样沿不捕获新数据,而在第二个destination clock采样沿捕获新数据。
如下图所示,在没有进行多周期约束前,在capture edge1和capture edge2都要对时序分析,所以我们判断这是一条适合使用多周期路径分析的时序。
所以使用以下语句设置多周期约束,让VIVADO IDE时序工具从capture edge2 分析setup建立时间(setup是为了确保数据在caputre edge可以被打入D触发器,由于ce使能存在,需要在launch edge后的capture edge2才是真正的capture edge)。所以通过以下约束把默认的capture edge 移动到capture edge2
set_multicycle_path 2 -setup -from [get_pins data0_reg/C] -to [get_pins data1_reg/D]
当Setup check移动到了第二个capture edge2 ,默认情况下hold check会自动移动到第一个capture edge1。如下图所示:
Hold自动后,如果还是在capture dege1位置分析hold关系,相当于hold关系相对于launch edge保持了1个周期,有没要吗?没必要,如果还是不清楚,我们回顾下hold的作用:
hold的作用是为了数据可以从capture延稳定一段时间确保D触发器稳定输出,显然在caputre dege1无需考虑数据采集,更无需考虑数据setup也无需考虑数据的hold,所以这里可以放开hold保持的时序约束,把hold检查的capture edge后移1个周期,这样就和Launch edge 是同一个沿了。
set_multicycle_path 1 -hold -end -from [get_pins data0_reg/C] -to [get_pins data1_reg/D]
这里使用了-end 前面提到过,-end是将默认分析hold保持关系的source clock改为desttination clock。如下图所示:
上图就是我们最终分析后,
1)、从capture edge2分析,setup时间很长相当宽裕可以非常容易满足建立时间要求
2)、从capture edge0分析 hold 只要保持很小的时间就可以满足数据的保持要求
由于这里的source clock和destination clock是相同的时钟,所以可以不用-end也一样,最后的约束如下:
set_multicycle_path 2 -setup -from [get_pins data0_reg/C] -to [get_pins data1_reg/D]
set_multicycle_path 1 -hold -from [get_pins data0_reg/C] -to [get_pins data1_reg/D]
趁热打铁,假如CE 使能是每4个周期使能一次,那么setup 放宽到第4个capture edge,而hold依然放宽到destination clock的第一个edge,时序约束如下:
set_multicycle_path 4 -setup -from [get_pins data0_reg/C] -to [get_pins data1_reg/D]
set_multicycle_path 3 -hold -from [get_pins data0_reg/C] -to [get_pins data1_reg/D]
1.6 时钟有相位移动的多周期约束
如下图,CLK1和CLK2是2个时钟域的时钟,它们具有相同的时钟周期,只是存在相位差,这种时钟关系就可以使用多周期约束,来约束这2个时钟之间的关系。
如下图所示,source clock 和 destinaion clock 我们实现知道destinaion clock相移+0.3ns,默认情况下,在launch延后第一个capture edge 评估setup时序,而后一个延评估hold时序,显然,目前的情况都无法满足时序要求,这不仅仅导致过约束,而且直接导致VIVADO IDE软件没法实现时序收敛。这是由于软件太笨了,也许以后的软件更加智能了,FPGA工程师就不需要去掌握时序约束了。
所以我们需要采用多周期时序分析,并且进行正确的约束,如下图所示,把capture edge 提前一个时钟周期。这样就很容满足setup 时间和hold时间的要求。
set_multicycle_path 2 -setup -from [get_clocks CLK1] -to [get_clocks CLK2]
由于默认hold分析延迟于setup 分析一个周期,而这里是单周期时序分析,可以不对hold做多周期约束,当让如果非要做也可以但是一定要写对
set_multicycle_path 1 -hold -from [get_clocks CLK1] -to [get_clocks CLK2] –end
注意这里的-end是必须要写的,因为这里的时钟只是波形周期相同,相位不相同,-end告知VIVADO 时序分析工具,是以destination clock分析的。
既然相位可以前移,也可以后移,假设destination clock相位后移-0.3ns,那么我们看如下时序分析图,可以发现,在capture edge 的时序依然满足要求,只是相对的setup时间变小了,而hold 时间变长了。所以一般后移不大的情况下,可以不用多周期时序约束的,当然如果后移大了,导致setup不能满足要求,就得做多周期约束了。
1.7 慢到快的多周期约束
慢到快的多周期时序分析,和我们前面采用CE使能的多周期时序分析非常类似,下图我们需要在destination clock的第四个时钟上升沿,capure数据,因此把setup 移到第四个时钟上升沿。从我们前面学习到的除了移动了setup,hold默认只是延后于caputre一个时钟沿,显然下图中我们是可以放宽hold的,而每必要让hold保持3个时钟周期。
set_multicycle_path 3 -setup -from [get_clocks CLK1] -to [get_clocks CLK2]
set_multicycle_path 2 -hold -end -from [get_clocks CLK1] -to [get_clocks CLK2]
我们总结下,慢到快的时钟约束可以总结为以下公式:
set_multicycle_path N -setup -from [get_clocks CLK1] -to [get_clocks CLK2]
set_multicycle_path N-1 -hold -end -from [get_clocks CLK1] -to [get_clocks CLK2]
1.8快慢的多周期约束
如下图对快到慢的多周期时序分析,下图是默认的时序分析图,可以看到source clock 是destination clcok的3倍。前面提到了,对于setup 默认分析是对于destination clock的分析,而-start可以修改分析的时钟改为source clock,我们这里就要用到-start
我们要实现如下图所示的时序约束分析,对于hold默认就是对应source clock 所以往前移2个周期
最终的多周期时序约束如下:
set_multicycle_path 3 -setup -start -from [get_clocks CLK1] -to [get_clocks CLK2]
set_multicycle_path 2 -hold -from [get_clocks CLK1] -to [get_clocks CLK2]