|
发表于 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。
|
|