这两种方法从理论上来讲都是可行的,但应对的情况有所不同。
对于一个新的设计,综合的网表送给后端之后,layout需要做的一个重要步骤就是CTS(clock tree 生成),对于简单的时钟,工具能够很容易应对,但如果时钟关系比较多,比如中间有很多gate clock,那么CTS生成的tree质量就不是那么好了,这时候比较容易产生hold,所以CTS之后都要检查clock的skew,如果太大只能重建CTS。
回答你的一个问题,“难道library 里的Dff 都默认hold time < clk to Q delay ?”
这个答案一般是成立的,比如使用 standard cell搭建一个移位寄存器链,一般情况下,是不需要在两个DFF之间插入额外的cell来保证hold,只要CTS做的比较balance,就不会有问题。(有个别的厂家,e.g. UMC,提供的库是做不到这一点的,需要在DFF之间插入DEL cell将data推迟来保证hold,这样的并不多见)