|  | 
 
 发表于 2021-7-13 11:28:35
|
显示全部楼层 
| 本帖最后由 jake 于 2021-7-13 00:04 编辑 
 出现hold violation是因为路径上的delay小于capture flop的hold time requirement。 同时,路径上的delay小,通常也意味着setup margin远大于capture flop的setup time requirement。 插入buffer,牺牲掉一些setup margin,只要不引起setup violation,就不是问题。
 
 以两个flop的模型为例子,reg1 --> reg2,中间没有其他门,这个场景是最有可能造成hold violation的。
 为了简洁,忽略routing/net delay,忽略reg1, reg2 CLK skew。
 路径上的delay = reg1 Tclk-to-q
 如果 (reg1 Tclk-to-q) <  (reg2 hold requirement), 出现 hold violation。
 同时,这个路径的 setup time = Period - (reg1 Tclk-to-q),一般是远大于 (reg2 setup requirement) 的,不会出现 setup violation。
 
 插入buffer, 模型变成了 reg1 --> B --> reg2
 路径上的delay = (reg1 Tclk-to-q) + (B Tcell_delay)
 如果  (reg1 Tclk-to-q) + (B Tcell_delay) > (reg2 hold requirement),hold violation就消失了。
 同时,这个路径的 setup time = Period - (reg1 Tclk-to-q) - (B Tcell_delay),通常仍大于 (reg2 setup requirement),也就不会出现 setup violation。
 
 
 
 | 
 |