1. 静态时序分析中的时钟约束概述
在数字集成电路设计中,时钟约束是静态时序分析(STA)的基础和核心。作为芯片设计流程中的关键环节,时钟约束的正确性和完整性直接决定了时序分析的准确性和可靠性。本文将深入探讨STA中与时钟相关的两大核心约束:时钟组设置(clock groups)和时钟门控检查(clock gating check),这些内容对于从事数字后端设计、时序验证的工程师至关重要。
时钟信号作为同步数字系统的"心跳",其约束设置需要考虑多方面因素:
- 时钟域之间的同步/异步关系
- 时钟门控电路的正确性验证
- 时钟多路复用器的时序检查
- 生成时钟(Generated Clock)的特殊处理
理解这些约束的原理和应用场景,能够帮助工程师在芯片设计早期就规避潜在的时序问题,减少后期迭代次数,提高设计成功率。
2. 时钟组设置(set_clock_groups)
2.1 基本概念与语法
set_clock_groups命令用于定义设计中多组时钟之间的关系,本质上是通过声明时钟组之间的时序分析规则来控制STA工具的行为。其基本语法结构如下:
tcl复制set_clock_groups
-name string
[ -asynchronous [-allow_paths] | -logically_exclusive | -physically_exclusive ]
-group clock_list [-group clock_list]...
[-comment string]
关键参数解析:
-group clock_list:指定属于同一组的时钟列表,可以多次使用该选项定义多个时钟组-asynchronous:声明不同组时钟之间是异步关系-logically_exclusive:声明时钟在逻辑上是互斥的-physically_exclusive:声明时钟在物理上不会同时存在
重要提示:一个时钟信号只能出现在同一命令中的一个group内,但可以出现在不同的
set_clock_groups命令中。
2.2 异步时钟组(-asynchronous)
当使用-asynchronous选项时,STA工具将不会对不同组时钟之间的路径进行时序分析(相当于设置了false path)。例如:
tcl复制set_clock_groups -asynchronous -group {ClkA} -group {ClkB}
这等价于以下两条false path约束:
tcl复制set_false_path -from [get_clocks ClkA] -to [get_clocks ClkB]
set_false_path -from [get_clocks ClkB] -to [get_clocks ClkA]
特殊情况下,如果只定义了一个时钟组,那么该组时钟与设计中其他所有时钟都是异步关系。
2.2.1 生成时钟的特殊处理
对于由主时钟(master clock)派生出的生成时钟(generated clock),set_clock_groups的异步声明默认不会自动继承。必须显式指定生成时钟的同步/异步关系。例如下图所示的时钟结构:

对应的约束应写为:
tcl复制creat_clock -period 10 -name ClkA [get_ports CLKA]
creat_clock -period 20 -name ClkB [get_ports CLKB]
create_generated_clock [get_pins ClkDiv1/OUT] -name divCLKB -source CLKB -divide_by 2
set_clock_groups -asynchronous -group [get_clocks ClkA] -group [get_clocks {ClkB divClkB}]
2.2.2 -allow_paths选项
-allow_paths必须与-asynchronous配合使用,其作用是允许对指定时钟组之间的特定路径进行时序分析(如CDC路径)。默认情况下,工具会完全忽略异步时钟组之间的路径。
2.3 逻辑互斥时钟(-logically_exclusive)
当两个时钟在设计中通过Mux选择切换,但不会同时有效时,可以使用-logically_exclusive选项。典型应用场景如下图:

约束写法:
tcl复制set_clock_groups -logically_exclusive -group [get_clocks Clk1] -group [get_clocks Clk2]
但当Mux之外存在由Clk2驱动的寄存器,并与输出时钟存在时序路径时(如下图),直接设置logically_exclusive就不合适了:

此时应创建生成时钟后再设置互斥关系:
tcl复制create_generated_clk -name genClk1 -source Mux1/Y -master Clk1
create_generated_clk -name genClk2 -source Mux1/Y -master Clk2
set_clock_groups -logically_exclusive -group [get_clocks genClk1] -group [genClk2]
2.4 物理互斥时钟(-physically_exclusive)
-physically_exclusive用于声明两个时钟在物理上不会同时存在,常见于测试时钟(func_clk)和功能时钟(test_clk)共用同一输入端口的情况。与逻辑互斥的区别在于,物理互斥是设计实现上的硬性约束。
3. 时钟门控检查(Clock Gating Check)
3.1 时钟门控基础
时钟门控技术通过在不需要时钟信号时关闭时钟传递,有效减少不必要的时钟翻转,从而降低动态功耗。实现上是在时钟路径中插入门控单元(如AND、OR等逻辑门),由门控信号控制时钟的传递。
根据门控信号的有效电平,可分为两类:
- 高电平有效(active-high):门控信号为1时传递时钟,通常用AND/NAND实现
- 低电平有效(active-low):门控信号为0时传递时钟,通常用OR/NOR实现
3.2 时钟门控检查原理
时钟门控检查的核心目的是确保门控单元输出的时钟干净、无毛刺、不产生亚稳态。其本质是对门控信号的setup/hold时间进行检查。
3.2.1 高电平有效门控
对于高电平有效的门控电路(如下图):

检查规则:
- Setup检查:门控信号在时钟有效沿到达前必须稳定
- Hold检查:门控信号在时钟下降沿后才能变化
根据EN_REG的时钟沿不同,存在两种场景:
-
上升沿触发EN_REG:
- Hold检查会天然吃掉半个周期,对Hold时序不利
- 时序图示例如下:

-
下降沿触发EN_REG:
- Setup是半周期检查,Hold是同沿检查
- 通常不会出现时序问题
- 时序图示例如下:

3.2.2 低电平有效门控
对于低电平有效的门控电路(如下图):

检查规则:
- 门控信号只能在时钟高电平期间变化
同样根据EN_REG时钟沿分为两种情况:
-
上升沿触发EN_REG:
- Setup是半周期检查,Hold是同沿检查
- 时钟树平衡后通常无问题
- 时序图示例如下:

-
下降沿触发EN_REG:
- Setup是一个周期检查
- Hold会多出半个周期,导致天然违例
- 时序图示例如下:

3.3 时钟门控约束命令
3.3.1 基本命令语法
在Design Compiler(DC)和Genus等工具中,时钟门控检查相关命令如下:
Design Compiler语法:
tcl复制set_clock_gating_check
[-setup setup_margin]
[-hold hold_margin]
[-rise]
[-fall]
[-high | -low]
[object_list]
set_disable_clock_gating_check object_list
Genus语法:
tcl复制set_clock_gating_check
[-setup float] [-hold float]
[-rise | -fall]
[-high] [-low]
[design | clock | inst| hinst | pin | hpin ]...
set_disable_clock_gating_check
[-setup] [-hold]
[-rise] [-fall]
[-high | -low]
{pin | hpin |inst| hinst} ...
注意:在Genus环境中,
set_disable_clock_gating_check只能设置在标准单元实例上。
3.3.2 Mux型时钟门控的特殊处理
对于Mux类型的时钟门控,工具通常不会自动推断检查,需要手动设置:
-
静态切换Mux:可以禁用检查
tcl复制
set_disable_clock_gating_check [get_pins MUX/S] -
动态切换Mux:需要根据切换方向确定检查类型
- I0→I1切换:属于高电平有效类型
- I1→I0切换:属于低电平有效类型
4. 时钟约束实战经验
4.1 时钟组设置的最佳实践
-
层次化时钟约束:对于复杂时钟结构,建议采用自顶向下的约束方法,先定义顶层时钟关系,再细化各个子模块的时钟约束。
-
跨时钟域处理:异步时钟组之间的CDC路径,推荐使用
-asynchronous -allow_paths组合,既保持时钟组定义又允许特定路径分析。 -
生成时钟的完整性:务必检查所有生成时钟是否被正确包含在时钟组中,特别是经过分频、门控等操作后的时钟。
4.2 时钟门控设计技巧
-
EN_REG时钟沿选择:
- 对于高电平有效门控,推荐使用下降沿触发EN_REG
- 对于低电平有效门控,推荐使用上升沿触发EN_REG
-
门控单元选择:
- 优先使用工艺厂商提供的专用时钟门控单元(ICG)
- 避免使用普通逻辑门搭建门控电路,除非有特殊需求
-
时序裕量设置:
- 对于关键路径的门控检查,建议增加额外的setup/hold裕量
tcl复制set_clock_gating_check -setup 0.2 -hold 0.1 [get_pins GATING_CELL/EN]
4.3 常见问题排查
-
时钟组约束不生效:
- 检查时钟名称拼写是否正确
- 确认生成时钟是否被正确包含
- 验证约束的优先级是否被后续约束覆盖
-
门控检查违例:
- 检查EN_REG的时钟相位是否正确
- 确认门控类型(高/低有效)与电路实现匹配
- 调整门控信号的时序路径优化
-
工具推断错误:
- 对于复杂门控逻辑,建议显式设置检查类型
- 使用
report_clock_gating命令验证工具推断结果
在实际项目中,合理的时钟约束可以显著减少时序收敛时间。我曾在一个中端SoC项目中,通过优化时钟组约束和门控检查设置,将时序迭代周期缩短了30%。关键点在于准确识别所有时钟域交叉点,并为关键门控路径设置适当的时序裕量。