时序约束系列:
- 如何约束时钟
主时钟、虚拟时钟、生成时钟、时钟组、时钟不确定性 - 如何约束输入输出延迟
输入延迟、输出延迟 - 如何约束时序例外
多周期路径、输入输出延迟、虚假路径、最大最小延迟 - 如何约束跨时钟域
总线偏斜
XIlinx的官方文档写的比任何一本讲时序约束的书都好,这里自己学习顺便整理翻译后的时序例外约束内容,方便复习。 😃
当逻辑以一种非默认情况时序的方式运行时,就需要一个时序例外(Timing Exception)。
每当希望以不同的方式处理时序时,必须使用时序例外命令(例如,对于在不同时钟周期捕获结果的逻辑)。
时序例外命令:
| 命令 | 功能 |
|---|---|
| set_multicycle_path | 指示将数据从路径的起点传播到终点所需的时钟周期数 |
| set_false_path | 指示不需要分析的设计中的逻辑路径。 |
| set_max_delay set_min_delay | 设置最小和最大路径延迟值。这将覆盖默认设置,并使用用户指定的最大和最小延迟值所定义的建立和 hold 约束 |
注意:出于运行时间考虑,Vivado工具不为冲突的时序例外提供动态分析。运行report_exceptions以全面分析和报告时序例外。
1 多周期路径(Multicycle Path)
多周期路径约束允许根据设计的时钟波形,修改时序分析器确定的setup和hold关系。
默认情况下,Vivado IDE时序引擎执行单周期分析。这种分析可能过于严格,并且可能不适合某些逻辑路径。
最常见的示例是逻辑路径,它需要多个时钟周期才能在 endpoint 稳定数据。
如果路径 startpoint 和 endpoint 的控制电路允许,Xilinx建议使用多周期路径约束来放松 setup 要求。
根据自己的意图,hold可能需要仍然保持为原来的hold关系(single-cycle分析下的hold关系)。这有助于时序驱动算法专注于其他要求更严格且具有挑战性的路径。它还可以帮助减少运行时间(runtime)。
1.1 设置多周期路径和时钟边沿
set_multicycle_path 命令用于修改路径关于源时钟或目标时钟的需求倍数(multiplier)(用于setup分析、hold分析或两者兼而有)。
1.1.1 set_multicycle_path 语法
set_multicycle_path <path_multiplier> [-setup|-hold] [-start|-end]
[-from <startpoints>] [-to <endpoints>] [-through <pins|cells|nets>]
必须指定 <path_multiplier> 时序分析器的默认值为:
- setup/recovery分析:1
- hold/removal分析:0
hold 关系与 setup 关系相关联。使用下面的公式来检索大多数常见情况下的 hold 周期数:
Hold cycles = <setup path multiplier> - 1 - <hold path multiplier>
- 默认情况下,setup 路径 倍数(multiplier)是相对于目标时钟(destination clock)定义的。要修改为与源时钟(source clock)相关的setup要求,可以使用 -start 选项。
- 类似地,hold 路径 倍数 是相对于源时钟定义的。要修改与目标时钟相关的 hold 要求,可以使用 -end 选项。
重要:每个 setup 关系都有两个 hold 关系。
- 第一个hold关系确保 [setup启动沿(launch edge)] 不会被 [有效捕获边沿(capture edge)之前到达的边沿] 捕获。
- 第二个hold关系确保 [有效启动沿之后的边沿] 不会被 [有效捕获边沿] 捕获。

所谓有效沿,就是我们需要分析的目标边沿,关系也很简单,当前沿不能采到上一个数据,当前数据不能被下一个沿采到。
重要:当对由相同时钟或由两个相同时钟(即时钟具有相同的波形,没有相移)驱动的路径应用多周期路径约束时,-start和-end选项没有明显的影响。
总结 -end 和 -start 选项如何影响有效的启动和捕获边沿:
| 源时钟(-start),移动启动边沿 | 目的时钟(-end),移动捕获边沿 | |
|---|---|---|
| setup | <----(向后) | ---->(向前)(默认) |
| hold | ---->(向前)(默认) | <----(向后) |
注意上表非常重要,需要理解牢记。这里时间增大方向为前,减小方向为后。
重要:set_multicycle_path命令的-setup选项不仅修改setup关系。它还影响始终与hold关系相关联的 hold 关系。
如果要将hold关系恢复到原来的位置,则需要使用-hold实现另一个set_multicycle_path规范。
注意:多周期约束可以设置在单个路径上,多个路径上,甚至两个时钟之间。
1.2 单时钟域下的多周期
1.2.1 放松setup关系,同时保持hold关系不变
定义在同一时钟域中或具有相同波形(无相移)的两个时钟之间的多周期约束具有相同的工作方式。

由静态定时分析(STA)工具定义的默认setup和hold关系:

这里的hold对于第一个hold关系:确保有效启动沿(当前启动沿)不被上一个 捕获沿 采到。相对应的,对于上一个 启动沿来说,这个hold就是第二个hold关系:确保下一个启动沿 不会被 自己对应的 捕获沿采到。
对于的setup和hold时序要求:
- setup 检查:TDatapath(max) < TCLK(t=Period) - TSetup
- hold 检查:TDatapath(min) > TCLK(t=0) + THold
有下面的电路,每两个周期产生一个有效数据,在这个路径上定义一个多周期路径约束是安全的,它表明目标时钟的第一个边沿是无效的,只有目标时钟的第二个边沿将捕获一个新数据。

下面的约束建立了一个新的setup关系: 确保 [setup启动沿(launch edge)] 不会被 [有效捕获边沿(capture edge)之前到达的边沿] 捕获。数据需要保持一整个周期才可以改变,需要在数据路径插入大量延迟。
set_multicycle_path 2 -setup -from [get_pins data0_reg/C] -to [get_pins data1_reg/D]
当修改 setup 关系时,hold 关系也会随着 setup 启动和捕获边沿的变化而修改。

重要:如果新的 hold 要求变得过于激进,可能会导致难以时序收敛。需要在保证设计安全的前提下,放宽要求。
难以收敛的原因:根据第一个hold关系,
由于启用了时钟,因此不需要将data0_reg中的数据保存一个周期,以使该路径发挥作用。在这种情况下,Xilinx建议将 hold 关系更改回原来的关系,即相同的启动和捕获边沿之间的关系。为此,必须添加第二个多周期路径约束,只修改hold检查:
set_multicycle_path 1 -hold -end -from [get_pins data0_reg/C] -to [get_pins data1_reg/D]
-end选项与set_multicycle -hold命令一起使用,因为捕获时钟的边沿必须向后移动。
注意:因为启动时钟和捕获时钟具有相同的波形,-end选项是可选的。向后移动捕获边沿与向前移动启动边沿会产生相同的保持关系。为了简化表达式,下面两个示例中删除了-end选项。

本文深入探讨了时序约束在数字集成电路设计中的应用,特别是Xilinx FPGA设计。内容涵盖了如何约束主时钟、虚拟时钟、生成时钟和时钟组,以及如何处理时钟不确定性。此外,还详细阐述了如何设置输入输出延迟、时序例外,如多周期路径、虚假路径、最大/最小延迟,并解释了如何处理跨时钟域的时序约束,如总线偏斜。文章通过实例解析了多周期路径的设置,包括单时钟域内的不同配置以及在不同时钟速率和相位关系下的跨时钟域约束。最后,介绍了虚假路径的使用以及如何通过最大/最小延迟来优化路径。
最低0.47元/天 解锁文章
3739

被折叠的 条评论
为什么被折叠?



