多周期路径约束(Set Multicycle Path)
图1
**一个数据到达,对本周期时钟来讲,是发起沿,对上一时钟来讲是已经是数据的捕获沿,因此,接收到一个数据,可以同时判定建立时间和保持时间是否满足,因此,保持时间要和前面的最近的上升沿对齐,建立时间要和后面的最近的上升沿时钟对齐。**本质和图2没啥区别,保持时间的分析点时刻选取不同而已,图二的分析时刻选取,更符合模型,容易理解。
此处有点绕,解释一下:每发送一个数据,就有了数据的时钟发送沿和数据的时钟捕获沿,时钟发送沿(针对源时钟)和时钟捕获沿(针对源时钟)在经过线延迟之后到达目的寄存器,会变成时钟发送沿(针对目的时钟)和时钟捕获沿(针对目的时钟)。当数据到达目的寄存器的时候,从数据发送的初始时刻(时钟发送沿(针对源时钟))与时钟发送沿(针对目的时钟)计算,可以计算hold time,从数据发送的初始时刻(时钟发送沿(针对源时钟))与时钟捕获沿(针对目的时钟)计算,可以得到建立时间。
定义:允许数据在多个时钟周期内从起点传播到终点,而不是默认的单个时钟周期。
使用场景:适用于路径上逻辑复杂(经常会碰到数据被发起后,由于路径过长或者逻辑延迟过长要经过多个时钟周期才能到达捕获寄存器;又或者在数据发起的几个周期后,后续逻辑才能使用。这时如果按照单周期路径进行时序检查,就会报出时序违规。)或者需要额外时间稳定数据的场景(跨时钟域打拍可以使用多周期路径约束)。
命令:set_multicycle_path <num_cycles> [-setup|-hold] [-start|-end][-from ] [-to ] [-through <pins|cells|nets>]
参数:可以设置setup和hold路径的多周期数,指定路径的起点、终点和中间点等。
对于建立时间,num_cycles是指多周期路径所需的时钟周期个数;对于保持时间,num_cycles是指相对于默认的捕获沿,**实际捕获沿应回调的周期个数。**本质是在讲保持时间或者建立时间可以被允许超过一个时钟周期或者N个时钟周期,因此,在进行计算的时候,建立时间是往后延几个周期,才能确保建立时间是增大几个周期,保持时间是要往前回调几个周期的,这样才能保证保持时间是大于一个周期的。
发起沿和捕获沿可能是同一个时钟,也可能是两个时钟,参数start和end就是选择参考时钟是发送端还是接收端。
start表示参考时钟为发送端(发端)所用时钟,对于保持时间的分析,若后面没有指定start或end,则默认为为-start;
end表示参考时钟为捕获端(收端)所用时钟,对于建立时间的分析,若后面没有指定start或end,则默认为为-end;
上面这两句话也不难理解,因为setup-time是在下一个时钟沿进行捕获时的约束,因此默认是对接收端的约束;而hold-up-time是对同一个时钟沿的约束,目的是发送端不能太快,是对发送端的约束。注意,对发送端约束,则指的是发起的时刻的约束,数据发起沿提前或者滞后一个周期。end接收端的约束,则是指的接收数据的时刻进行约束,数据捕获沿提前或者滞后一个周期。**发送端和接收端的时钟都是指的最开始的源时钟经过走线,到达目的寄存器的那个时钟,计算的时候也要注意分清楚分析的时钟是到达目的寄存器的时钟。**但是分析时的时钟起点,依然是以到达源寄存器的时钟作为时钟的起点的。
对于建立时间保持时间来讲,最根本的还是要以到达寄存器的时钟为主,去分析时钟拉高之前的数据什么时候到,看是否满足建立时间。时钟拉高之后的数据什么时候到即可,去分析是否满足保持时间,这样去选择时钟沿分析建立保持时间。数据什么时候到,就要以source clock为基准了,取连续两个时钟的数据,第一次是destnition clock上升沿 提前到,则是计算建立时间,第二次的数据是滞后destnition 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]
这里的hold约束中没有加-end参数,这样的话默认就是-start,是因为我们把发起时钟回调2个周期,如下图所示。
图3
图3实质上是人为等效为中间的传输延迟经历了好几个周期,但是在分析保持时间的时候,依然是要看source clock最新的数据什么时候到,就选择source clock哪个时钟沿去分析保持时间。
对于单周期路径来说,setup的num_cycles为1,hold的num_cycles为0.
实际中我们是根据Timing report来进行约束的,即便多周期约束的几种场景都存在,但如果Timing report中没有提示任何的时序 warning,我们往往也不会去添加约束。