多周期路径约束
内容部分由AI生成
核心思想:重新定义检查边沿
要理解多周期路径,首先要明白默认的时序检查行为。默认情况下,STA工具认为:
- 建立时间检查:数据必须在启动沿 之后的下一个捕获沿 之前稳定下来。即启动沿和捕获沿总是相差1个周期。
- 保持时间检查:为确保数据不被新数据覆盖,检查会在启动沿 之后的第一个捕获沿 进行。这通常意味着保持时间检查与建立时间检查的捕获沿是同一个沿。
set_multicycle_path
的作用就是告诉STA工具:“这条路径的数据传递需要N个时钟周期才能完成,请相应地调整你的建立时间和保持时间检查边沿。”
命令语法(以Synopsys Design Constraint为例)
set_multicycle_path -setup <N> -from <start_point> -to <end_point>
set_multicycle_path -hold <N-1> -from <start_point> -to <end_point>
-setup N
: 将建立时间检查的捕获沿设置为启动沿之后的第N个时钟沿。-hold <N-1>
: 将保持时间检查的参考沿设置为建立时间捕获沿之前的一个沿。这通常是与-setup N
配对的设置,目的是保持正确的数据窗口。
关键:-hold
的设置通常由 -setup
的设置决定,其值为 N-1
,目的是确保保持时间检查的参考沿与新的多周期建立时间检查窗口对齐。
在工程中的常见使用场景及作用
下面通过几个典型例子来说明其作用。
场景一:慢速接口或分步计算(最常见)
这是最经典的多周期路径应用。
-
情况描述:一个计算单元(如复杂的乘法器、除法器)需要3个时钟周期才能产生有效结果。寄存器A在时钟Cycle 1启动数据,计算单元在Cycle 4才输出稳定结果,此时寄存器B才可以捕获。
-
问题:如果不加约束,STA工具会默认要求数据在Cycle 2就稳定,这会导致不必要的建立时间违例,迫使工具进行过度优化,浪费面积和功耗。
-
约束方法:
# 告诉工具,建立时间检查应该看3个周期后的时钟沿 set_multicycle_path -setup 3 -from [get_cells regA] -to [get_cells regB]# 相应地调整保持时间检查。保持时间检查的参考沿是建立时间捕获沿(第3个沿)的前一个沿(第2个沿) set_multicycle_path -hold 2 -from [get_cells regA] -to [get_cells regB]
-
作用:
- 放松建立时间要求:将建立时间的检查标准从1个周期放宽到3个周期,避免了虚假的时序违例,使时序报告更真实。
- 收紧保持时间要求:由于数据可以被后续逻辑使用长达3个周期,必须确保在整整3个周期内,数据不会被新数据冲掉。
-hold 2
使得保持时间检查更严格,确保数据在寄存器B捕获之前保持稳定。
时序图解释:
假设时钟周期为10ns。
- 默认情况:建立时间检查在10ns处,保持时间检查在0ns处(相对于启动沿)。
- 设置
-setup 3 -hold 2
后:- 建立时间检查被移动到 30ns 处。
- 保持时间检查被移动到 20ns 处(建立时间捕获沿30ns的前一个沿)。
- 这意味着数据在20ns到30ns之间必须保持稳定,这是一个合理的窗口。
场景二:跨时钟域(CDC)之前的路径
- 情况描述:数据从一个快时钟域(CLK1,周期5ns)传递到慢时钟域(CLK2,周期15ns)的同步器。即使是最理想的情况,数据也需要至少一个慢时钟周期才能被捕获。
- 问题:默认的setup检查是基于启动时钟和捕获时钟的波形关系,可能仍然过于严格。工程师通常会让数据在快时钟域停留多个周期,确保慢时钟能稳定地捕捉到。
- 约束方法:
# 假设我们希望数据在快时钟域保持2个慢时钟周期(即 2 * 15ns = 30ns)的稳定窗口 set_multicycle_path -setup 2 -from [get_clocks CLK1] -to [get_clocks CLK2] set_multicycle_path -hold 1 -from [get_clocks CLK1] -to [get_clocks CLK2]
- 作用:
- 放松从CLK1到CLK2的路径的建立时间要求,使其符合实际的CDC行为。
- 配合
-hold 1
,确保数据在CLK2捕获沿之前有足够长的稳定时间,防止亚稳态。
场景三:具有使能信号的寄存器
-
情况描述:一个寄存器每隔4个时钟周期才被使能一次(例如,使能信号
valid
每4个周期拉高一次)。 -
问题:默认的时序分析会检查每一个可能的启动和捕获对,包括那些使能信号无效的周期,这会产生大量无关紧要的时序路径。
-
约束方法:
# 结合 set_false_path 和 set_multicycle_path # 首先,将大部分无效路径设为false path set_false_path -from [get_cells regA] -to [get_cells regB] -through [get_pins valid_reg/C] -when "!valid_signal"# 然后,对有效的使能周期设置多周期路径 set_multicycle_path -setup 4 -from [get_cells regA] -to [get_cells regB] -through [get_pins valid_reg/C] -when "valid_signal" set_multicycle_path -hold 3 -from [get_cells regA] -to [get_cells regB] -through [get_pins valid_reg/C] -when "valid_signal"
-
作用:
- 精确地描述设计意图,只对有效的时序路径进行宽松的时序检查,避免STA工具浪费精力在无效路径上,并使时序报告更清晰。
总结:set_multicycle_path
的主要作用
- 提高时序收敛效率:避免工具对本来就不需要在一个周期内完成的路径进行过度优化,节省编译时间、面积和功耗。
- 确保时序报告准确:反映设计的真实时序行为,防止报告大量虚假的时序违例,帮助设计师快速定位真正的关键路径。
- 精确描述设计意图:与
set_false_path
和set_case_analysis
等命令结合,可以非常精确地告诉STA工具电路是如何工作的。 - 保证功能正确性:通过正确设置保持时间约束,确保在多周期操作期间数据不会被意外覆盖。
重要注意事项:
- 谨慎使用:错误的多周期路径约束会掩盖真实的时序问题,导致芯片功能失败。必须对设计的功能有清晰的理解。
- 保持时间配对:设置
-setup
后,千万不要忘记设置配对的-hold
约束,否则保持时间检查可能不正确。 - 验证:约束完成后,一定要仔细查看STA工具的时序报告,确认建立时间和保持时间的检查边沿是否符合预期。