应@Fly 天 同学的要求,码一遍set_data_check, 关于SDC 有好几个兄弟号都写了很多,可以到『IC 技术圈』中找对应文章去看。
set_data_check 是个啥?
set_data_check 是一条SDC 的命令,用于约束『数据-对-数据』的『建立保持』时间检查,通常被称为非时序约束 ( non-sequential constraints ), 理论上set_data_check 可以设在任意的两个data pin 上,其中一个pin 称为 constrained pin 类似于寄存器的data pin, 另一个pin 称为related pin 类似于寄存器的clock pin.
用set_data_check 约束时,-from 指定的pin 为related pin, -to 指定的pin 为constrained pin.
用set_data_check 约束的『建立保持』时间检查跟普通寄存器的『建立保持』时间检查最大的区别是:set_data_check 约束的『建立保持』时间是zero-cycle check, 即constrained signal 跟related signal 两个数据信号在同一个时钟沿被采样释放,如下图右侧所示;而传统的DFF setup check 默认是跨一个时钟周期的。
set_data_check 也分setup 跟hold:
set_data_check hold check 时,capture clock 同样会往前推一个cycle, 所以如果设了hold data check通常需要设一个multi_cycle 将其拉回来。
除了用set_data_check 约束『数据-对-数据』的检查之外,有的lib 里也会定义『数据-对-数据』的检查,lib 中的关键词是:
用set_data_check 约束的『数据-对-数据』检查跟lib 里定义的『数据-对-数据』有以下区别:
set_data_check 用在哪?
set_data_check 通常用于信号间的skew 约束,比如一些高速接口相关信号间的约束。摘一段:
Data checks are normally applied where there is a specific requirement of skew (either minimum of maximum) or race condition (where the order of arrival of two signals can affect output and the intention is to get one of the probable outputs by constraining one signal to come before the other) between two or more signals. These may be required where:
set_data_check 在EDA 中的使用
在Innovus 或Tempus 中『数据-对-数据』检查默认是开启的,可以用如下变量控制。
如果在Innovus 或Tempus 中设了如下约束,在report_timing 的时候需要加-check_type data_setup/ data_hold 来report 相应的data check:
set_data_check -from u0/D1 -to u0/D2 0.5
不像set_max_delay 会将原始的timing path 打断,set_data_check 是不会将原始timing path 打断的。
如上示例,即使在pin u0/D1 到u0/D2 上设了set_data_check 的约束,但是在timing 分析时u0/D1 不会被当做一个endpoint, 对于如上的path, timing 分析会同时做:
在Innovus 或Tempus 中默认其他的false path 之类的timing exception 不影响data check, 可以用如下变量控制:
timing_apply_exceptions_to_data_check_related_pin
report_analysis_coverage 会将data-to-data check 归类于:DataCheckSetup 和DataCheckHold.