sta工具是怎么进行setup/hold检查的
1.sta工具launch和capture沿配对1.1配对规则sta工具默认会做最严检查就是保证launch clk的每个cycle都在launch不同的数据capture能正确采样sta工具在setup/hold检查时要建立capture clk和launch clk的配对在配对的过程中是不考虑clk skew和jitter的【skew和jitter是在计算setup/hold slack时考虑】配对的原则如下Setup检查的目的是确保当前Launch沿发起沿发出的数据能够“提前就位”并稳定足够长的时间以便下一个Capture沿捕获沿能够正确无误地“读取”它。那么工具在一个公共周期内枚举每一个launch边沿和其后最近的capture边沿并选择时间差最小的一对边沿做setup的配对换句话说就是找所有launch clk之后最近的一个capture clk做检查----每个launch clk之后都可以找到一个最近的capture 沿----但是真正做配对的是 这些里面最小的那一组Hold检查的目的确保当前launch沿发出的数据不会过快的到达以至于干扰了前一个capture沿正在捕获的数据【落到了前一个capture沿的hold时间之内】对于hold工具在公共周期内枚举所有可能的launch边沿和capture边沿并选择时间小于等于launch clk边沿且最接近launch clk边沿的capture边沿的那一组做配对----和setup沿配对一样也是找间隔最小的那一组做配对----为什么选择时间小于等于launch clk而不能大于launch clk--------因为不考虑skew和jitter的ideal clkcapture clk大于launch clk的都用于寻找setup 配对沿--------非ideal clk的情况下实际hold check的capture 沿是可以比launch 沿晚的工具会算上skew和jitter上面两个规则对于同步时序检查都是ok的无论是同频同向同频不同向(常见是同频反向)快时钟到慢时钟还是慢时钟到快时钟。在PT默认情况下完成了launch clk边沿和capture clk边沿的配对之后如果使用set_multicycle_path -setup -start 改变launch沿对应的hold检查的配对沿中launch沿也会相应的移动使用 -setup -end改变capture 沿对应的hold检查的配对沿中capture沿也会相应的移动但是无论set_multicycle_path -hold -start还是 -end 只会影响改变hold自己的沿配对不会影响到setup的沿配对工具内部hold检查的边沿默认是基于setup检查的边沿派生出来的所以改变setup的某一端必然会导致hold的对应端也随之改变1.2 几种常见的配对举例1.2.1 同频反向的setup和hold这种情况setup被称作半周期检查hold是比较放松的clk path给了0.5T的时间【不考虑skew和jitter】这种ideal clkhold检查是0.5TTcoTdelayT(hold)1.2.2 慢时钟到快时钟1.2.3 快时钟到慢时钟2.setup检查的公式描述setup检查的定义是capture到来之前数据要稳定的最小时间Setup检查的目的是确保当前Launch沿发起沿发出的数据能够“提前就位”并稳定足够长的时间以便下一个Capture沿捕获沿能够正确无误地“读取”它。T(launch)T(cocomp)T(setup) T(capture)T(setup) T(capture)-T(launch)-T(cocomp)sta工具pt会做最严的检查就是要T(capture)-T(launch)最小但是又不能为0【为0是物理不可实现的】那么PT工具就会和T(launch)之后最近的一个T(capture)clk做setup检查3.hold检查的公式描述hold检查的定义是capture沿到来之后数据要保持的最短时间它的目的是确保当前launch沿发出的数据不会过快的到达以至于干扰了前一个capture沿正在捕获的数据【落到了前一个capture沿的hold时间之内】----当前launch沿发出的数据期望的capture沿是launch沿之后最近的那个capture沿对应公式就是T(cocomp)) T(launch_check_edge)-T(capture_ckeck_edge)T(hold)最严检查就是要T(launch_check_edge)-T(capture_ckeck_edge)最小也就是选择时间小于等于launch clk边沿且最接近launch clk边沿的capture边沿这里的T(launch_check_edge)和T(capture_ckeck_edge)是已经配对的hold check检查沿4.问题讨论4.1 为什么不从一次完整的launch到capture过程来看并用setup的配对沿来计算 hold check呢此时使用公式T(launch)T(cocomp)T(launch_clk_period) T(capture)T(hold)T(hold)T(launch)T(launch_clk_period)-T(capture)T(cocomp)上面的公式在同频的同步电路或者快到慢时钟同步电路是没有问题的结果和第3章的效果是一样的但是在慢到快的hold检查就有问题根源在于一条路径的数据流是L → C_setup → 等待下一个 L 周期再考虑 hold 风险。 相当于认为 只需要保证本次 L 发出的数据至少维持有效直到本次 C_setup 沿。完全忽略中间存在其他 capture 采样沿的风险如上图所示从setup的当前launch 沿向后推迟一个launch clk然后和当前setup的capture clk沿做hold检查这样就跳过了很多capture沿导致找到的并不是符合hold check配对沿要求的沿。4.2 hold检查的capture一定是setup的capture向前推一个时钟周期需要注意有些人会认为hold检查的capture一定是setup的capture向前推一个时钟周期这种说法在同频的同步电路中是成立的在launch和capture频率是倍数关系时不成立如下图T0→T1是实际的setup检查配对沿T1→T1是实际的hold检查配对沿T1→T2不是setup的检查配对沿只是普通的一对launch和capture沿工具不会做T1-T2时刻的setup检查那么T1→T1的hold检查配对沿的capture clk可以说是T2 captureclk前推一个周期但不能说是setup的capture向前推一个时钟周期但是对上图使用set_multicycle_path -setup改变setup的某一端必然会导致hold的对应端也随之改变这个规则是适用的