xf2016的个人空间 https://blog.eetop.cn/1536195 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

set_multicycle_path使用说明

热度 1已有 178 次阅读| 2025-7-30 16:14 |个人分类:DC|系统分类:芯片设计

在 IC 设计中,set_multicycle_path 是一条非常重要的时序约束命令,用于告知静态时序分析(STA)工具,路径起点(通常是源寄存器)的时钟沿和路径终点(通常是目标寄存器)的采样时钟沿之间,实际上存在超过一个时钟周期的间隔,以便路径上的逻辑有足够的时间完成计算。

核心理解:为什么需要它?

  1. 默认的单周期假设: STA 工具(如 PrimeTime)默认假设所有路径都必须在一个源时钟沿到下一个目标时钟沿(通常是下一个上升沿)的周期内稳定下来(满足 Setup 时间)。这意味着组合逻辑的最大延迟不能超过 时钟周期 -      Setup 时间。

  2. 长逻辑路径的现实: 很多逻辑路径,特别是一些计算密集型模块(如复杂算法、除法器、长总线译码、大位宽计数器、状态机转换逻辑等),其传播延迟必然大于一个时钟周期。如果强行要求它们在单周期内完成,要么时钟频率会降到不可接受的程度,要么根本不可实现。

  3. 打破默认约束:      set_multicycle_path 就是用来告诉 STA 工具:“这条路径实际可以用 N 个时钟周期来完成信号传递,请不要用单周期的严格标准来检查它,放宽要求吧!

命令的核心语法

 

set_multicycle_path <path_multiplier> [-setup|-hold] [-start|-end] [-from <startpoint_list>] [-to <endpoint_list>] [-through <pin_or_net_list>]

  • <path_multiplier> (N) 最关键参数! 指定此路径实际可用的时钟周期数。例如 N      = 2 表示这条路径可以用 2 个时钟周期来传递信号。

  • -setup / -hold 指定该多周期设置是应用于建立时间检查(Setup Check)还是保持时间检查(Hold Check)。-setup 必须指定,-hold 可选(但强烈建议显式设置)。

  • -start / -end 指定 <path_multiplier> 是与起点时钟还是终点时钟相关联。

    • start (默认): 最常用。意味着 <path_multiplier> 表示从起点时钟发射沿之后的       第 N 个终点时钟采样沿才是这条路径实际要求的 Setup/Hold 检查沿。公式可理解为:有效采样沿 = 发射沿 + N * 时钟周期。

    • -end 较少用。意味着 <path_multiplier> 表示从终点时钟采样沿向前推算       第 N 个起点时钟发射沿才是这条路径有效的发射沿。公式可理解为:有效发射沿 = 采样沿 - (N-1) * 时钟周期。

  • -from <startpoint_list>指定路径的起点,通常是源寄存器的时钟引脚或数据输出引脚。

  • -to <endpoint_list>指定路径的终点,通常是目标寄存器的数据输入引脚。

  • -through <pin_or_net_list>:(可选)指定路径必须经过的中间节点(引脚或线网),用于更精确地限定约束范围。

至关重要的概念:-start vs -end 与 Setup/Hold

理解 -start/-end 和 -setup/-hold 的关系是掌握此命令的关键。

  1. Setup Check (-setup):

    • 告诉 STA 工具,当起点在时间 T_launch 发射数据后,终点应该在时间       T_capture_setup = T_launch + N * clock_period 采样该数据,而不是默认的 T_launch + clock_period。

    • 放松了 Setup 检查的时序要求(允许更长的组合逻辑延迟)。

    • 如何设置? 几乎总是使用 -setup -start N。这是最符合直觉的设置:“从起点发射后,过 N 个周期再在终点采样”。

  2. Hold Check (-hold):

    • 保持时间检查的作用: 确保在终点寄存器采样沿附近,输入数据保持稳定(不被新发射的数据过早覆盖)。

    • 默认行为的改变: 当你设置了 Setup Multicycle Path(例如 N=2),默认的 Hold 检查也会移动! 默认的       Hold 检查会移动到你设置的 Setup 捕获沿的前一个时钟沿(如 N=2时,默认 Hold 检查移动到 T_launch + clock_period 而不是原来的       T_launch)。

    • 默认 Hold 移动的问题: 这个默认移动通常是错误的过于严格的!它要求数据在 T_launch + clock_period 时就已经稳定(等待下一个       Setup 采样),这违背了多周期路径允许逻辑延迟超过单周期的初衷。目标寄存器需要保持数据的稳定时间窗口是针对它自己的采样沿的,而不是针对那个提前了的默认 Hold 检查沿

    • 正确的 Hold 约束 (-hold):

      • 目的:告诉 STA        工具,进行 Hold 检查时,参考的采样沿应该是        Setup 采样沿(T_launch + N * clock_period)本身,而不是它之前的那个沿。

      • 效果:这 收紧 了 Hold 检查的要求(防止数据过早被覆盖),使其对应于实际有效的采样沿。

      • 如何设置? 几乎总是使用 -hold -start (N-1)。

        • 推理:为了将         Hold 检查参考沿从默认的 (T_launch + clock_period) 移动到实际的 Setup 采样沿 (T_launch + N *         clock_period),我们需要将 Hold 检查沿向前移动 (N-1) * clock_period。在工具内部计算中,使用         -start (N-1) 正好实现了这个效果(相对于起点时钟,设置参考点为第 (N-1) 个终点沿)。

      • 关键:-hold 约束通常必须与 -setup 约束配对使用,且 -hold 的 <path_multiplier> 设置为 (N-1),-setup 的设置为 N。

图解 Setup/Hold 多周期约束 (N=2)

Clock Period = T

 

源寄存器时钟 (CLK1) 边沿:  T0        T1         T2        T3        T4

                   |         |           |         |         |

发射数据 (Q1):         [ D1 ]------->         [ D2 ]------->            [ D3 ]->

 

目标寄存器时钟 (CLK2) 边沿: T0        T1           T2        T3         T4

                   |         |           |         |           |

采样数据 (D2):          ?         |         [ D1 ]        |          [ D2 ]  -> 

 

* 默认 Setup 检查 @ T1:要求 D1 在 T1 前稳定 (≈ 要求延迟 < T)

* 默认 Hold 检查 @ T0:要求 D1 在 T0 后稳定一小段时间 (防止被 T0 发的新数据覆盖)

 

设置 set_multicycle_path 2 -setup -from CLK1 -to CLK2

 

有效的 Setup 捕获沿: 移动到 T2 (T0 + 2T) → 允许路径延迟接近 2T

默认 Hold 检查也移动:移动到 T1 (T0 + T) → 要求 D1 在 T1 前稳定!(延迟要小!) --> 这太严格了且错误

 

正确配对 Hold 约束:set_multicycle_path 1 -hold -from CLK1 -to CLK2

 

* 有效的 Hold 检查参考沿: 强制移动回 T2 (实际的 Setup 捕获沿) --> 要求数据在 T2 后稳定一小段时间 (防止被 T2 发射的新数据D2覆盖)

* 新的有效 Hold 检查范围:逻辑路径上数据必须在窗口 [T2 - Hold_Time, T2 + ?] 保持稳定。

典型应用场景示例

  1. 慢速计算单元:

# 假设 U_CALC 模块的延迟需要 3 个周期

set_multicycle_path 3 -setup -from [get_clocks clk] -to [get_pins U_CALC/result_reg/D]

 

set_multicycle_path 2 -hold -from [get_clocks clk] -to [get_pins U_CALC/result_reg/D]

    • Setup:允许数据在第 3 个时钟沿采样。

    • Hold:要求数据在目标寄存器自己的第 3 个采样沿附近保持稳定(防止第 3 个采样沿前更新的新数据过早覆盖它),检查参考沿是 T0 + 3T。

  1. 时钟使能控制的多周期路径:

# 一个每4个周期才更新一次数据的路径

set_multicycle_path 4 -setup -from [get_clocks clk] -to [get_pins U_DATA_HOLD/out_reg/D] -through U_EN_GEN/enable_signal

 

set_multicycle_path 3 -hold -from [get_clocks clk] -to [get_pins U_DATA_HOLD/out_reg/D] -through U_EN_GEN/enable_signal

  1. 移位链(按位): 有时需要区分路径的方向。

# 从 regA[0] 到 regB[3] 的路径比到 regB[0] 的长 3 个位

set_multicycle_path 4 -setup -end -from [get_pins regA[0]/Q] -to [get_pins regB[3]/D]

 

set_multicycle_path 3 -hold -end -from [get_pins regA[0]/Q] -to [get_pins regB[3]/D]

 

# 注意这里用了 -end 和 -end/-hold (N-1) 的组合,逻辑是终点采样沿决定了起始点是它之前的第 (N-1) 个沿。

使用set_multicycle_path注意事项和陷阱

  1. 必须成对使用 Setup 和 Hold: 这是最常犯错的地方! 设置了      -setup N,几乎肯定需要设置对应的      -hold (N-1)。忽略 -hold 约束会使保持时间检查过于严格,可能导致工具错误地插入过多的缓冲器(Buffer)来修复实际上并不存在的 Hold 违例,浪费功耗和面积,甚至掩盖了真正的设计问题。

  2. 理解 -start vs -end: 绝大多数情况下使用 -start。仅在某些特殊逻辑结构(如特定方向的移位)或非常明确的时序关系下才考虑 -end。确保你清楚选择了哪个选项以及为什么。

  3. 精确指定路径 (-from/-to/-through): 约束范围一定要精确,避免将不应放宽约束的路径错误地包含在多周期路径内。使用 -through 可以更精确地定位路径。

  4. 同步设计原则: 多周期路径两端必须相同时钟域的时钟驱动(或者具有确定相位关系的不同时钟域)。异步时钟域之间的路径应该使用 set_false_path 或 set_clock_groups      -asynchronous,而不是 set_multicycle_path

  5. 与 set_false_path 区分: set_multicycle_path 放宽了路径的时序要求,但路径依然存在时序检查。set_false_path 则是完全移除路径上的时序检查(无论多长延迟都认为满足时序)。误用 set_false_path 代替 set_multicycle_path 会导致设计根本没有时序检查,风险极大!

  6. 设计实现(逻辑综合、布局布线): 约束需要在综合 (Synthesis) 和布局布线      (Place & Route) 阶段都生效。确保约束文件被正确读入。

  7. 功能验证: 在 RTL 仿真和门级网表仿真中,确保多周期路径的逻辑控制(如使能信号)行为与约束的周期数一致。错误的逻辑可能导致数据被提前采样或延迟采样出错。

  8. 文档: 清晰地在约束文件和设计文档中记录所有多周期路径约束及其原因,方便后续维护和调试。

总结

set_multicycle_path 是管理长逻辑延迟路径的核心时序约束命令。它的核心作用是:

  • -setup N      -start放松 Setup 要求,允许路径延迟达到接近 N 个时钟周期。

  • -hold (N-1)      -start收紧 Hold 要求(使其对应实际的 Setup 采样沿),防止新数据过早覆盖老数据。

正确理解和应用 -setup 与 -hold 的配对关系 (N 和 N-1),并精确指定目标路径,是避免时序分析错误、确保芯片功能可靠性的关键。 务必在进行多周期路径约束后,仔细检查 STA 报告,确认 Setup 和 Hold 的检查点是否符合预期。


1

点赞

刚表态过的朋友 (1 人)

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 2

    周排名
  • 4

    月排名
  • 10

    总排名
  • 0

    关注
  • 4

    粉丝
  • 1

    好友
  • 12

    获赞
  • 2

    评论
  • 25

    访问数
关闭

站长推荐 上一条 /1 下一条


小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-8-2 18:48 , Processed in 0.015195 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部