同频异步双时钟STA:需添加哪些约束暴露CDC缺失的时序违例?
异步同频跨域时钟的时序约束建模方案
假设某设计包含2路输入时钟,二者标称频率相同,但来自不同源,因此彼此异步。时钟定义如下:
create_clock -name {clock_a} -period 10.000 -waveform { 0.000 5.000 } [get_ports {i_clock_a}] create_clock -name {clock_b} -period 10.000 -waveform { 0.000 5.000 } [get_ports {i_clock_b}]设计中,同步于clock_a的数据跨域至clock_b,但未实现CDC机制。已知STA工具会计算多周期最坏时序裕量以查找时序违例,但此场景下时钟看似同频同相。请问需添加哪些约束对时钟的频率和相位不确定性建模,以发现实际存在的时序违例?
核心约束添加方案
1. 显式声明时钟异步关系
首先必须明确告诉STA工具两个时钟无固定相位关联,避免工具误按同步时钟分析:
set_clock_groups -asynchronous -group [get_clocks clock_a] -group [get_clocks clock_b]
这条约束是基础,确保工具采用异步跨域的最坏时序分析逻辑,而非默认的同相假设。
2. 时钟不确定性约束
针对时钟自身的抖动、偏斜,以及跨域时钟的相位偏差建模:
- 单时钟内部的不确定性(比如时钟树偏斜、固有抖动):
set_clock_uncertainty -setup 0.5 [get_clocks clock_a] set_clock_uncertainty -setup 0.5 [get_clocks clock_b] - 跨时钟域的额外不确定性(两个异步时钟的相位偏移叠加):
数值需根据实际时钟源的规格(比如相位误差范围、抖动最大值)设定,目的是让STA计算时覆盖两个时钟沿的最大偏差情况。set_clock_uncertainty -setup 1.0 -from [get_clocks clock_a] -to [get_clocks clock_b]
3. 时钟抖动约束(可选,更精准建模)
如果需要单独区分时钟的固有抖动,可以添加:
set_clock_jitter 0.3 [get_clocks clock_a] set_clock_jitter 0.3 [get_clocks clock_b]
抖动会导致时钟沿偏离标称位置,加入后STA会把这部分偏差纳入时序裕量计算,进一步贴近真实场景。
约束作用说明
标称同频同相的异步时钟,实际必然存在微小频率偏差、随机抖动、固定相位偏移,这些因素会导致跨域路径出现建立/保持时间违例。通过上述约束,STA工具会跳出理想同相假设,按照异步时钟的最坏情况分析时序,从而发现隐藏的违例问题。
内容的提问来源于stack exchange,提问作者shaiko
相关产品推荐
相关产品推荐

