几乎每一个设计都会经历修正保持时间违例的过程,尤其是对较快的工艺。大多数设计人员以紧约束进行综合设计以最大化建立时间,所得的结果是一快速逻辑,其数据相对于时钟较快地到达触发器的输入。这可导致保持时间违例,由于数据在被触发器锁存前改变了数值。通常,设计人员在设计的初次布局和布线之后修正保持时间违例,从而利用更准确的延迟值。
移除保持时间违例包括相对于时钟的延迟数据,以便数据在时钟沿到达之后指定的一段时间(保持时间)不改变。有几种设计人员用来插入适当延迟的方法,其概述如下:
——使用Synopsys方法
——手工插入延迟
——dc_shell 命令自动插入延迟
1 Synopsys方法
Synopsys提供如下dc_shell命令,它使能compile命令修正保持时间违例:
set_fix_hold <clock name>
dc_shell > set_fix_hold CLK
set_fix_hold命令指示DC在合适的位置插入缓冲器来修正保持时间违例。通过同时设置min/max库,并对set_input_delay命令指定min/max值,可以在初次编译期间使用上述命令。在同一时间设置min/max库的想法是,它消除大多数设计都需要的两通综合(初次综合为最大化建立时间,再次优化为修正保持时间违例)。下面的链接提供了综合实例,在synthesis.tcl中compile指令前添加set_fix_hold clk,可以在report中查看到不同的结果。
https://mp.weixin.qq.com/s?__biz=Mzg4OTIwNzE4Mg==&mid=2247483769&idx=2&sn=673515693fe18785bcae3ea9cc92a608&chksm=cfee2198f899a88e304232a10eff4c4668ab434b9cc1c2780914cb117cc95b92783dc7a34286&token=1532768446&lang=zh_CN#rd
作为选择,也可使用最差情况库编译设计以最大化建立时间,接着在布图后重新优化,通过将设计映射到最佳情况库以修正保持时间违例。
2 延迟的手动插入
如果时序分析显示非常少量的保持时间违例(少于10~20处),那么用set_fix_hold命令去修正这些违例是不值得的。这种情况下,延迟可以手动插入到网表中。设计者可串联一串缓冲器,以相对于时钟恰好足够地延迟数据,以使它通过保持时间检查。