(FPGA时序约束)set_multicycle_path详解

 1.定义

        和set_max_delay/set_min_delay一样属于时序例外的一种。

        时序例外在之前的文章中讲过,如果不去约束的话,可能会造成时序资源的浪费,不因该分析的分析了,不应该优化的优化了,不应该这么严格去分析的也这么严格的去分析了,跑这样的程序浪费电脑资源,同样也会增加运行时间。

        时序例外有几种:

        (1)set_false_path:直接设置不分析

        (2)set_max_delay/set_min_delay:直接覆盖默认requirement

        (3)set_case_analysis:设置pin或port为常数或特定跳变沿,相当于设置palse_path

        (4)set_multicycle_path:相对于源时钟或者目的时钟去调整requirement

        针对set_multicycle_path,其定义为:根据源时钟或目的时钟,通过修改路径requirement倍数,改变路径requirement,来放松该路径的setup或hold分析要求,以满足时序收敛。

        这里再解释一下什么是requirement,vivado工具默认进行的是单周期的时序分析,一般一条时序路径默认对应了一个requirement,是根据时钟周期来确定的,也就是一般情况下setup的requirement是一个时钟周期(默认单周期分析,当前时钟launch,下个时钟周期capture),hold的requirement就是0;

2.语法及说明

        set_multicycle_path <path_multiplier> [-setup|-hold] [-start|-end] [-from <start_point>] [-to <endpoint>] [-through <pins|cells|nets>]

        其中:

        [-setup|-hold]表明是调整建立时间的还是保持时间的;

        [-start|-end]表明是相对于源时钟还是相对于目的时钟来调整,setup默认对应-end,hold默认对应-start,如果要对应源时钟来调整setup,则使用-setup -start,hold同理,如果是两个时钟一致,则-end/-start没有区别,UG903里有一个官方的总结:

        上图中的Moves the launch edge和Moves the capture edge也正是set_multicycle_path的调整方式,就是挪动默认的发起沿和捕获沿, 无论是setup还是hold,requirement就是两个沿的时间差。

        但是这里需要注意的是,由于保持时间检查是在建立时间检查的基础上进行的,也就是说,得先确立一条路径的建立时间检查的发起沿和捕获沿,才能确认该路径的保持时间检查需求,这是因为,保持时间检查是为了确保两个事儿:

        (1)当前发起沿发送的数据,不被当前捕获沿之前的时钟沿所捕获

        (2)当前发起沿的下一个时钟沿发送的数据,不被当前捕获沿所捕获

        然后工具会去分析,以上两个关系中哪个情况比较恶劣,选最坏的哪个作为该路径的hold分析时钟沿基础,这是xilinx所有FPGA时序分析的基础,也比较关键。

        再回到主题,如果你只调了建立时间的multicycle,相当于发起沿或者捕获沿的位置变了,这时候,hold分析用的时钟沿关系就也变化了,所以,一般调整了setup的多周期路径,就得跟着调整hold的多周期路径。

3.举几个例子

        (1)相同时钟域下的多周期路径

        这种路径也是非常常见的一种多周期路径,默认情况下,静态时序分析工具(STA)会认定其建立与保持时间关系为:

        这也是在实际工程中比较常见的场景,此时可能由于DATAPATH过于复杂,导致数据无法在一个时钟周期内稳定下来,或者数据能在一个时钟周期内稳定下来,但是在几个时候周期后才会去使用它,这时候就需要用户去指示STA工具这是一条多周期的路径,需要以例外的方式处理它。

        0ns处为发起沿,4ns处为捕获沿,这是这条路径最差的建立时间关系,所以setup requirement就是4ns(一个时钟周期),在此基础上,衍生出两个hold关系(如前面所述),选其中最差的(两个一致),就是途中标hold的那个关系,两个时钟沿做差,结果为0,所以hold requirement就是0ns。 

        在上述基础上,给两个寄存器加上个CE(clock enable)信号,这个信号两个时钟周期拉高一次,也就是如下图所示的关系:

        这时候,如果还是按照上图中的关系去分析建立时间,会造成STA的资源浪费,应为没有必要让建立时间关系这么紧,实际上,建立时间关系可以放松到下一个时钟沿,也就可以如下设置多周期:

        set_multicycle_path -setup -end 2 -from <startpoint> -to <endpoint>

        其中2是path_multiplier,可以这么理解,setup是指定分析沿向指定方向移动path_multiplier-1个时钟周期,hold的path_multiplier是指定分析沿向指定方向移动path_multiplier个时钟周期

        但是经过这么一调整,setup的requirement放松了,但是hold关系变了,变成下面的关系了:

        这样的hold关系是很难满足的,因为捕获沿后移,对应的捕获沿前一个时钟沿也相当于后移了,根据hold slack = data_arrive_time - require_time,而其中的require_time = capture_edge + clock_delay + hold_time,capture_edge变大了,slack为正的难度就变大了。

        所以这时候就需要再对hold的关系进行调整:

        set_multicycle_path 1 -hold -end -from <start_point> -to [end_point]

        这里的1代表,将hold分析中的目的时钟沿(由于使用了-end)向前移动1个时钟周期。

        这时候,setup和hold关系就变为:

        STA在以上的基础上去分析才是最优的。

        (2)同频不同相的两个不同时钟之间的多周期

        假设clk1和clk2周期相同为4ns,相位差0.3ns,如下所示:

        默认时序分析图如下:

        因为vivado会在两个时钟公共周期内取最差的一条来当作setup分析的基础,所里这里setup需求为0.3ns,这基本是不可能满足的,且在这种情况下hold分析的需求是-3.7ns,这个需求又是十分宽松的。所以需要通过多周期进行调整这些不合理:

        set_multicycle_path 2  -setup -from [get_clocks clk1] -to [get_clocks clk2]

        (3)慢时钟到快时钟

        假设clk1周期是clk2的三倍,默认关系如下:

        应调整为:

        set_multicycle_path 3 -setup -from <start_point> -to <end_point>

        set_multicycle_path 2 -hold -end -from <start_point> -to <end_point>

        调整之后:

        (4)快时钟到慢时钟

        假设clk2周期是clk1的3倍,默认关系如下:

        应调整为:

        set_multicycle_path -setup -start 3 -from <start_point> -to <end_point>

        set_multicycle_path -hold 2 -from <start_point> -to <end_point>

        调整之后:

  • 8
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: set_multicycle_path是一种时序约束,在FPGA和ASIC设计中广泛使用。它允许在时序路径上设置一个或多个时钟周期的延迟,以解决在时序分析时可能出现的一些问题。 当一个时序路径比其他路径更长时,它可能需要更多的时钟周期才能到达目标寄存器。 如果没有设置multicycle约束,时序分析可能会认为该路径无法满足其限制,从而导致设计失败。设置multicycle路径允许设计人员通过允许路径在时钟周期中存在延迟来解决这个问题,从而提高设计的可靠性。 需要注意的是,设置multicycle路径可能会对设计的性能产生一定的影响。因此,在使用该约束时,需要仔细考虑延迟的数量和位置,以确保设计仍能满足其性能要求。 ### 回答2: set_multicycle_path是在时序设计中常用的一个命令,其作用是定义某个时钟域下,某些时序路径的最小传播时间要大于一个时钟周期。set_multicycle_path命令是在时序约束中使用的,其语法如下: set_multicycle_path -setup|-hold|-both -from <startpoint> -to <endpoint> [N] 其中,-setup表示该路径是基于setup时间约束的,-hold表示该路径是基于hold时间约束的,-both表示同一路径即要求满足setup要求,也要求满足hold要求。-from和-to分别表示路径起点和终点。N为正整数,表示路径的传播时间至少要比时钟周期多N倍。 多周期约束在时序设计中非常重要,主要应用在以下的场景中: 1. 在时序迭代过程中,需要对部分时序路径进行暂时性调宽。可以使用set_multicycle_path命令,将某条时序路径的最小传播时间拉长一些,以避免潜在的时序故障。 2. 在设计中,时钟频率非常高,芯片功能复杂,可能会有很多时序路径因为逻辑和导线长度的限制,并不能满足单周期时序约束。此时就需要使用多周期约束命令来松弛时序约束,使设计更加容易达到时序约束。 3. 在时钟域划分比较复杂的时候,需要使用多周期约束命令来定义某些时序路径在时钟域之间传输时的最小传播时间。 总之,set_multicycle_path命令在时序约束中有着非常重要的作用,其使用方法需要遵循规范,针对具体的设计情况进行设置。只有合理使用多周期约束命令,才能保证设计的稳定性和性能。 ### 回答3: set_multicycle_path是一个IP核构建工具,它用于设置多时钟跨越路径,以使时序逻辑电路正确运行。其主要作用是在设计采用了多个时钟的情况下,保证异步时序电路的正确性。 多时钟异步系统中,来自不同时钟域的数据在不同的时钟周期内更新,如果异步时序电路中没有按照正确的路径进行时序控制,则可能出现元件与外部时钟之间出现多次边沿跨越,导致出现逻辑错误,从而可能导致系统的不可靠性。 set_multicycle_path可以用于解决这种问题,它将一个时序路径定义为多周期路径,这样就能够让信号在多个时钟周期内完成传输,保证信号的正确性和时序器件的正确运行。 在使用set_multicycle_path时,首先需要确定哪些信号是多周期路径的一部分,然后设置合适的寄存器或DMA控制器的时钟延迟,以便使信号在多个时钟周期中完成传输。 在设置multicycle_path时,还需要注意一些细节。首先是确保不能设置不可达路径、互锁路径和环路路径等,不然容易导致逻辑错误;其次是在设置多周期路径时,必须在源时钟域和目标时钟域之间设置同步器,保证信号的稳定和正确;最后,为了避免过多的时钟延迟,应当设置尽可能少的多周期路径。 总之,set_multicycle_path是一个非常重要的IP核构建工具,它可以帮助设计人员解决多时钟异步系统中的时序问题,确保系统的正确性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值