• 注册
  • 查看作者
  • Innovus中via应该怎么打?DFM double via

    Innovus中via应该怎么打?DFM double via

     

           本文主要讲讲关于打via的时候碰到的一些问题及相应的解决办法。本文所提的只是小小的一部分,还有更多的方面还需要大家去多做才能发现。

    DFM-via

            

            首先来看看signal上面的VIA。为了提高最后的yield,需要提高DFM-via的比例。首先得定义什么是DFM-via。

            如下图所示,右边的VIA是最常见的单孔VIA,一定是正方形,左边的VIA也是比较常见的VIA,是长方形,其大小是一定的,不能随意改变,这种VIA也叫做double-via (double-cut一个意思)。

       

          我们可以从LEF文件中得到这两个孔的定义:

           一个长方形叫double-via,两个正方形孔合起来也叫double-via,或者换个名词,叫做multi-via。但multi-via不等同于DFM-via。部分single-via也属于DFM-via。

            如下图所示,右边两个via,其bottom和top-layer都比一般的via要宽或长一点。所以最右边两个属于DFM-via。

         总之就是multi-via一定是DFM-via,而single-via一部分属于DFM-via。了解了这个概念,我们就来看看如何提高DFM-via的ratio。

           首先就要设置VIA的weight。默认的所有的weight是0。这样的话只有multi-via被认为是DFM-via,所有single-via都不是DFM-via。只要定义weight大于1,那么就被认为是DFM-via。下面就是设置的方法:

         除了via的weight之外,还需要设置其他的一些选项:

         一般情况下这就够了,在绕线的时候就可以很好的得到较高的DFM-via ratio。或者我们可以额外的再优化一次:

            routeDesign -viaOpt

    viapillar

            有的时候,仅仅是double-via是不够的,需要用到stack-via。这种VIA直接从M1打到M4或者其他高层金属,而不是M1到M2。这种VIA也叫做viapillar。这不仅仅是为了DFM角度的考虑,也是为了timing方面的考虑。不过一般的工艺下不需要,这里也就不讲了,等以后开专题再讲。

    PG-via

            由于我们摆放的macro遮挡等的原因,在打powerplan的时候,在cell-row的末端,经常会发生一些DRC的问题,下面举一个例子:

            如图蓝色代表M1-rail,红色代表M5-strap。中间只交叉了一半。

          这种交叉会造成几个问题:

            1, 打VIA的时候,不会打上任何的VIA,

            2, 打的VIA有DRC问题

            3, 由于stack-via-rule的原因(此stack-via非viapillar),M5-M6再不能打上VIA了,

          先看看tech-lef中关于stack-via的rule:

          关于这个Stack-via的rule,可以去看看LEF的文档,里面有更详细更全面的rule。总之就是从低层到高层金属的single-via堆叠不能超过一定数目,一定要是double-via。为了解决这个问题,我们可以写个很简答的脚本,去拉长M1,拉到和M5完全覆盖为止。这个脚本很简单,本文这里可以写一个简单的示范:

        通过M5的box,得到与之交叉的所有M1,然后对M1进行过滤,对不符合的M1进行相应的拉长。

     

       

    自定义VIA

          在后面place或者做优化的时候,有时候会碰到std-cell和PG 的问题。 如下图所示,蓝色的表示M1rail。黑框表示std-cell,上面的红框表示floorplan打的VIA1,下面的红框表示Std-cell自带的VIA1。这种情况下,上排的VIA会和下排的VIA产生DRC。

          解决办法很简单,我们可以在这个std-cell上面设置一个pg-keepout,防止放在PG附近。

     

            但是如果在后面signoff阶段才发现,为了防止移动std-cell产生各种问题,我们可以改变PG的via,当然这种方法只是没办法中的办法。

     

    替换VIA

            在替换VIA前,我们先创建想要的VIA。有两种方式,一是通过LEF,另一是通过自带的命令,这里就讲讲如何通过自带的命令定义VIA。通过LEF的方式也类似,就不再讲了。

            我们先看看原来的VIA的定义,假设原来的VIA的名字叫做VIA12。我们先运行一下下面的命令:

            然后我们就可以得到topRects, botRects, cutRects这些属性。再仔细观察这些属性,可以发现这些VIA都是以中心点为坐标原点进行描述。我们照猫画虎,就可以定义自定的VIA了。例如:

            定义好之后,我们就可以换了:

            editChangeVia -from VIA12 -to VIA12_user_gen

    举一反三

            我们还可以更近一步,再扩展一下。假如在signoff阶段,假如仍然像上面的例子,只是需要替换的VIA不同,例如下图所示,最左边的PG VIA会和std-cell的VIA产生DRC。只是需要替换的目标VIA不同。我们可以写个简单的脚本,根据已有的DRC-violation,自动生成并替换成相应的VIA。

            作者这里也提供一个简单的实现方式:

           

     

  • 0
  • 1
  • 0
  • 372
  • 0
    哇塞,居然是沙发?留个名
  • 单栏布局 侧栏位置: