https://blog.csdn.net/weixin_44109405/article/details/104027995
深入讲解set_multicycle_path多周期约束---理论篇\
图片无法拷贝
红色闪电007
于 2020-01-31 17:18:39 发布
8777
收藏 142
分类专栏: Xilinx FPGA MPSOC
版权
Xilinx
同时被 3 个专栏收录
3 篇文章2 订阅
订阅专栏
FPGA
4 篇文章0 订阅
订阅专栏
MPSOC
2 篇文章0 订阅
订阅专栏
网上看了一些有关多周期约束的一些文章,有些只给出了结论,有些讲得不太透彻,最后看完可能还是云里雾里的。所以本人在阅读一些网上资料的同时,结合Xilinx的UG903和UG906写了一些体会,仅供参考,如有错误,欢迎指正。
1. 为什么要进行多周期约束?
赛灵思是这么说的,时序分析工具在进行分析的时候,默认是进行一个周期的分析的。这种分析可能过于严格,可能不适用于某些逻辑路径。如果你的设计中允许数据在2个甚至多个周期之后稳定,那么你就可以使用多周期约束。这样会使得在布线过程中释放布线资源,同时也会降低布线运行时间。
2. 周期约束的宗旨:
(1)当前发射沿发送的数据不能被前一个捕获沿捕获。
此处为:Source clock中的4ns发射的数据不能被Destination clock中的4ns处为捕获。
(2)下一个发射沿发送的数据不能被当前捕获沿捕获。
此处为:Source clock中的8ns发射的数据不能被Destination clock中的8ns处为捕获。
归纳起来就是,当前发射沿发送的数据只能给当前的捕获沿捕获。默认的周期为1的约束,捕获沿为发射沿之后的下一个时钟沿。此处,若Source clock中的4ns为发射沿,那么Destination clock中的8ns处为捕获沿。说明白点就是如果在4ns处发射一个数据,那么该数据如果延时为0,直接轰到下一个触发器,那么会造成下一个触发器在捕获上一个数据时(上一个数据的发射沿为0ns,捕获沿为4ns)的HOLD时间无法满足。
3. 相同时钟域的多周期约束
相同时钟域的多周期约束比较简单, 一般出现的情况,当系统中存在CE信号时,这时候根据CE信号的频率设置相应的周期数,而不是按照默认的1个时钟周期使得约束过紧。
图5-5中的BEFORE为当不加周期约束的时候捕获沿在4ns处,但是此时根据CE信号可知,系统不会再4ns处进行捕获,而是在8ns处进行捕获,所以可以将setup的分析在捕获沿为8ns处,即将捕获沿向后移动一个周期(相对于Destination clock),即变成图5-5 AFTER中的模式。根据分析工具的默认,此时HOLD的分析也会同样向后移动一个周期。原来的周期约束的宗旨变为如下:
(1)当前发射沿发送的数据不能被前一个捕获沿捕获。
此处为:Source clock中的0ns发射的数据不能被Destination clock中的4ns处为捕获。
(2)下一个发射沿发送的数据不能被当前捕获沿捕获。
此处为:Source clock中的4ns发射的数据不能被Destination clock中的8ns处为捕获。
这显然增加了HOLD约束的难度,就是原来我路径延时2ns可以保证HOLD时间,现在必须2ns+4ns=6ns。
同时根据本系统,也没有必要。该系统只需保证如下宗旨:
(1)当前发射沿发送的数据不能被前一个捕获沿捕获。
此处为:Source clock中的0ns发射的数据不能被Destination clock中的0ns处为捕获。允许被Destination clock中的4ns处为捕获。
(2)下一个发射沿发送的数据不能被当前捕获沿捕获。
此处为:Source clock中的4ns发射的数据不能被Destination clock中的4ns处为捕获。允许被Destination clock中的8ns处为捕获。
该约束的语法表达式如下:
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]
通常,在一个时钟域或在具有相同波形的两个时钟之间,当定义了N的多周期约束时,其语句如下所示。
4.同周期有相位差的两个时钟
在本例中,由相移引起的设置约束为0.3ns。这使得几乎不可能实现时序收敛。另一方面,hold检查为-3.7ns,这太宽松了。所以有必要对其进行调整,调整之后如下图所示:
对于负相移的情况,一般也不需要进行特别的约束,如下图所示:
5. 慢时钟到快时钟的多周期约束
CLK1的周期是CLK2的3倍,分别为12ns和4ns,其默认的时序分析如上图。由上图分析可知,捕获沿没有必要再4ns处,捕获沿可以放宽在12ns处。如下图所示。
由上图可知,捕获沿已经设置在12ns,这有利于setup的分析。但是同时hold的分析在8ns处。也就是发射沿0ns发出的数据不能被8ns处的捕获,这显然没有必要。我们只需要保证如下两个原则:
1:CLK1发射沿0ns发出的数据不被CLK2的0ns捕获;
2:CLK1发射沿12ns发出的数据不被CLK2的12ns捕获;
所以分析图将变成如下情况:
对应上图的约束语句如下:
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]
此时 hold的约束让原本处于8ns处的捕获沿往后移动两个周期。
一般的对于从慢时钟域向快时钟域穿越,总结如下:
6. 快时钟到慢时钟的多周期约束
CLK2的周期是CLK1的3倍,分别为12ns和4ns,其默认的时序分析如上图。其捕获沿在CLK2的12ns处,其发射沿在CLK1的8ns处。由上图可知,分析setup时,其发射沿没有必要在8ns处,造成时序过紧。可设置发射沿在0ns处。
再开来看,对于hold的分析,根据两原则可知:
(1)当前发射沿发送的数据不能被前一个捕获沿捕获。
此处为:Source clock中的8ns发射的数据不能被Destination clock中的0ns处为捕获。一般情况下永远不会发生。
(2)下一个发射沿发送的数据不能被当前捕获沿捕获。
此处为:Source clock中的12ns发射的数据不能被Destination clock中的12ns处为捕获。
所以我们只需要保证原则(2)即可。
由于分析setup时其发射沿会后移到0ns处,这样hold会后移到4ns处,所以重新将hold移动到12ns处。
所以进行实际应该设定的约束的图如下:
约束语句如下:
set_multicycle_path 3 -setup -start -from [get_clocks CLK1] -to [get_clocks CLK2] 发射沿后移3个周期。
set_multicycle_path 2 -hold -from [get_clocks CLK1] -to [get_clocks CLK2] 发射沿前移2个周期。
一般的对于从快时钟域向慢时钟域穿越,总结如下:
7.几点注意事项:
上一张总结图:setup约束默认的是移动捕获沿,hold 约束默认的是移动发射沿。记住移动的是两个沿,捕获沿和发射沿。
对于快慢时钟域问题:
(1)慢到快
set_multicycle_path 3 -setup -from [get_clocks CLK1] -to [get_clocks CLK2]
捕获沿前移3个周期。
set_multicycle_path 2 -hold -end -from [get_clocks CLK1] -to [get_clocks CLK2]
捕获沿后移2个周期。
setup的约束时捕获沿向前移动,同时hold约束时将原本由于setup约束引起的向前移动,重新往后移动,回到原点。
(2)快到慢
set_multicycle_path 3 -setup -start -from [get_clocks CLK1] -to [get_clocks CLK2] 发射沿后移3个周期。
set_multicycle_path 2 -hold -from [get_clocks CLK1] -to [get_clocks CLK2]
发射沿前移2个周期。
setup的约束时发射沿向后移动,同时hold约束时将原本由于setup约束引起的向后移动,重新往前移动,回到原点。
总结:不同的时钟域在做setup和hold约束时,其实移动的是同一个沿,要么是捕获沿要么是发射沿。
那我们再来看下一个时钟下的约束:
set_multicycle_path 2 -setup -from [get_pins data0_reg/C] -to [get_pins data1_reg/D] 此句将捕获沿向前移动2个周期。
set_multicycle_path 1 -hold -from [get_pins data0_reg/C] -to [get_pins data1_reg/D] 此句将发射沿向前移动2个周期。
在这个约束中,对于setup和hold的约束移动的是不同的沿。为什么可以这么操作呢?看看Xilinx给出的答案就能理解了。
因为发射时钟和捕获时钟的波形是一样的,所以后移捕获沿就与前移发射沿的结果是一样的,所以这里面进行了简化的操作。
时序约束的目标就是让发射沿发射的数据能够被捕获沿捕获,就是考虑两个沿移动的问题,在两个沿之间保留特定的时间。
————————————————
版权声明:本文为CSDN博主「红色闪电007」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44109405/article/details/104027995
本文来自博客园,作者:{e_shannon},转载请注明原文链接:https://www.cnblogs.com/e-shannon/p/16244611.html