讨论一个实战的面试问题
一个scan chain有两个时钟域的DFF,一个时钟域的DFF有1000个,另一个时钟域的DFF只有两个。这个chain里有hold violation,应该如何解决。回答:
1. 加lockup latch. 对,如果加了还没有解决,应该怎么办
2. scan chain reorder
第一个回答是对的,
第二个回答自己也没有把握,面试的人也没说对错 (估计错了?)
我的理解是:
这里一个时钟域里的DFF有比较大的clock tree latency,另一个的比较小。这样造成了比较大的clock skew 和 hold violation。
如果lockup latch 都不能解决问题的话,就是很大的 violation, 不可能用加delay buffer 或 set_fix_hold 这样的方法解决问题了。用scan chain reorder。 重新调整可能更有效
请大家讨论一下,看看最佳的解决方案应该是什么。
希望以后大家面试的时候遇到类似的问题也可以有一个比较清晰的思路
在latency小的那支在不影响function的前提下在scan与function的切换点之前加clkbuf,把skew调好,或者干脆让那两个时钟在CTS时balance
小编回答的内容都没错。
但是说到2个时钟域,并且还强调了数量上的差别是500倍,出题人的意图就很明显了。
用useful skew来调肯定是出题人想要的一个答案。
这个我没用过。学习了。
另外,userful skew 是 ICC 的命令。DC 和 PT 里是没有的,对吗
lockup 是dft必用的方法啊,就是fix 2 个clock domain的test hold 问题的,
是一个latch cell
是的, lockup latch 是标准做法。这里的重点是如果lockup latch 不能解决问题时怎么办
调tree,或者硬修啊,hold
插latch肯定是标准做法。如果修不下来,看如下情况。
1,如果这1002dff 都放在附近,那么scan reoder 解决的代价低,只需要将这两个寄存器根据时钟树相对长短,调整到链首或者链尾,不需要太多额外的buf 去解因为调整链而带来的drc。因为他们都在附近。
2.如果这1000dff和另外2个dff不放在附近,或者在不同模块,用scan reorder 解决就比较麻烦了,那这时候只有在FUNC DFT 的时钟mux 的DFT输入端插delay来解决了,不能在公共路径加,而且一般dft时钟周期都在几十ns 插一个latch 借了一半的时钟周期,两个时钟树差几十ns,这个一般设计还是比较少见,就算是有hold,latch 借了10几个ns过来,应该剩下不多了。也很好修。
这个处理合理,全面。 谢谢分享你的经验。