• 注册
  • 查看作者
  • 数字IC设计修复setup violation的方法总结

     

    数字IC设计中Setup的分析与优化贯穿前后端设计中,最好在开始后端设计之前就获得一个没有Setup违反的网表,下面按照从前到后的流程逐一讲解每个阶段如果出现Setup违反该如何解决。下面用到的命令,主要针对的是Synopsys公司的综合工具DC以及布局布线工具ICC。

    还有需要注意的是,Setup的修复和之后要讲解的Hold的修复有很大的不同,Setup的违反随着布局到布线阶段的推进,它是越来越恶化的,不像Hold,线延迟会有益于Hold的修复的,因此存在少量的违反是没有问题的。因此,在开始下一阶段的Setup修复之前,最好将本阶段的Setup违反都清掉。如果是需要用CCD来修复的Setup违反,那么在CTS之前,这些违反可以不用考虑。

     

    1、逻辑综合阶段就有Setup违反:

    1.1 在DC中用Retime或者Pipeline修复;

     

    1.2 在DC中通过group ungroup的方法来对critical的模块进行优化;将那些critical的模块group到一起,然后ungroup,让DC对其进行充分的优化,不会因为在不同的group内而优化受到限制。

     

    1.3看违反是否很少,并向前向后查看路径的时序,判断在后端中用CCD是否有可能修复;如果该路径的前后时序非常宽裕,那么在后端中用CCD来修复也是可以的。

     

    1.4 用DCT进行增量编译

    由于DC进行综合时一般用Wire Load Model分析时序,所以不是很准确,并且分析时也没有标准单元或者Macro的具体物理位置,所以分析优化过程不是很贴近物理实际。为了解决这个问题,可以用DCT来解决。具体步骤为:ICC导出Floorplan的DEF给DCT,然后用Compile_ultra进行再次综合。

     

    1.5 修改电路结构/算法

    如果上述方法都不行,那么需要查找设计中的Setup违反是什么样的情况,是很多路径都有一些小的违反还是说这些违反都集中在一个模块上,且违反很大。如果是前者则可以通过DCT再次编译来解决,如果是后者,需要分析在后端中用CCD是否有可能解决,如果不行的话,便只能通过修改电路结构或者更改电路的算法来进行修复了,在系统级或者算法级来解决这种问题也是最有效、程度最好的方法了,不过可能会比较耗时。我曾遇到过这种情况,某个DSP模块的时序非常差,基本上通过软件修复是不可能的,后来换了种算法,在精度、面积、时序上都有了很大的提升,设计的Setup违反也不存在了。

     

    2、布局之后CTS之前有Setup违反:

    2.1 用DCT进行增量编译

    首先用零互连延迟模式报告一下,看设计中是否有setup的违反,如果没有的话,那么应该是线延迟太大使得严重偏离了之前的理想情况,这个可以用DCT来进行再次综合。在DCT中将所有的scenario都读入进去,并读入ICC导出的DEF文件,然后进行增量编译;

     

    2.2 在ICC中将timing critical的单元靠近放置

    如果是规模太大使得线延迟太大导致的,在后端设计中也可以将一些critical的单元靠近放置,如果在同一个模块内部,可以创建plan_group;

    此外还可以对某些具体的net设置net weight来使得这些critical path上的单元靠近放置。

     

    3、CTS之后有违反:

    重新进行CTS,在CTS过程中采用CCD用useful skew来向前向后借timing,命令为:

    >clock_opt -concurrent_clock_and_data

     

    4、布线完成后有少量违反:

    可以用ICC中的CCD来修复,

    >set_concurrent_clock_and_data_strategy

    >route_opt -concurrent_clock_and_data

     

    5、chipfinish阶段有少量违反:

    可以用ICC中的CCD来修,

    >focal_opt -concurrent_clock_and_data-setup_endpoints all

     

    6、布局布线中的任何一个阶段

    其实在ICC中布局布线的任何一个阶段都是可以用PT进行ECO来修复Setup违反。

  • 0
  • 2
  • 0
  • 662
  • 请登录之后再进行评论

    登录
  • 0
    1、在DC中通过group ungroup的方法来对critical的模块进行优化;将那些critical的模块group到一起,然后ungroup。请问把critical path 放到一个组中,进行compile_ultra,然后怎么又进行了ungroup,这是如何操作的?能详细地说明一下吗? 2、DCT为什么要把所有的scenario都读进去,不是只分析setup,用最差的corner就行了吗? 3、在ICC中对critical path 设置net weight来使得这些critical path上的单元靠近放置,这是执行什么命令?还望指导一下
  • 0
    厉害
  • 单栏布局 侧栏位置: