罗风 · 2021年03月01日

不做只会push-button的人 | 最全的PV入门基础知识

WeChat Image_20210301100836.jpg

题记:之前讲了这么多PR方面的东西,所有的方面几乎都讲到了。作者讲的都很简单,入门的东西,并没有涉及到很深的。不代表作者水平就这样了,而是不好讲太细太深,一方面可能和design相关,作者不便透露,另一方面太细的东西很少人关心。之后的内容就随便碰到什么说什么。本文是号主收到的匿名投稿,PV(Physical Verification)方面的内容。

前言

你是一个只会push-button的人吗??什么是push-button,就是啥也不会,只会按照flow跑,出了问题也不会debug。很多大公司的流程做的很完善,做一个push-button的人没有什么过错,也能做的很好。但是有一些公司的流程那可是粗制滥造,如还是只会push-button,那结果不堪设想。作为一个有上进心的人,相比于流程完善的大公司,小编倒觉得第二种公司更适合提升个人能力,因为有更广阔的天地供你发挥。术业有专攻,不需要做到面面精通,当然这也不可能,只要把自己的那部分精通就好了,其他的了解了解就行了。

什么是GDS

我们设计出来的东西,要交给foundary,foundary只需要每一层的形状,按图索骥生产芯片。 这个描述形状的文件格式就是GDS。现在用的都是GDSII,不过都简称GDS。GDS是上世纪六七十年代提出的格式,已经用了很多年。现在design规模越来越大,一个GDS动辄几十上百G,所以产生了新的文件格式:OASIS。不过好像没什么人在用,都还在用GDS。

GDS是一个二进制文件,人工无法直接查看,那如何读取GDS的内容?

  • 第一种就是各大公司的软件,会把这个GDS解析出来。
  • 第二种就是采用模块:用perl的GDS2模块解析一下,就可以看到人能看懂的东西了。

mapfile文件

GDS的形状不是一层的,包含很多层,包括NW,PO,METAL等等。foundary或者各种软件用mapfile文件来区分这些层。

比如在GDS中,有一层编号是30.1,包含很多形状,有一层编号是30.2不是形状,反倒是一些文字。这里30代表的是layer。不同的工艺,不同的foundary对30的理解不一样,比如说一些foundary认为这是metal,有一些公司认为这是NW,所以不同的foundary和不同工艺需要不同的mapfile来解析这个GDS。 后面的1和2代表的是datatype,可以认为是同一层的不同用途。例如datatype=1表示这是真正的信号线,datatype=2表示这个形状的说明部分,datatype=3表示这是用于填充的dummy-metal。不同的foundary和工艺对datatype的理解也不一样。

这么详细的东西,如果落到别人手里那可不得了。所以在给foundary的时候,会做一次清理,将这些用于说明的部分清理掉,将信号线和dummy-metal合到一层,只给foundary一个按图索骥的形状。

用PV软件打开GDS,会看到不同层被标了不同的颜色。这是因为在GDS里面并没有各种颜色区分,PV软件里看到不同的颜色是因为有另一种mapfile存在,这个mapfile会指定某层用哪个图形和颜色。一般这种图形格式是xpm格式,自己可以做一个这样的文件,或者可以通过linux中的convert命令将一个jpg文件转换为xpm。

RULE文件

rule文件一般由foundary提供,有时候也不能这么说。每家design公司都会加一些自己的rule在里面,或者基于自己家芯片的实际情况做一些特定的调整。

不同的EDA公司支持的rule的格式不一样。所以foudary就需要提供不同的格式,但是现在的PV验证是一家独大的场面,所以foudary有时候就没那么一视同仁了,可能只提供一种或两种的格式:SVRF ( Standard Verification Rule Format ) 和TVF ( Tcl Verification Format ) 。最早的格式是SVRF,但是SVRF太不好懂,太难了,又发明的TVF。小编觉得是换汤不换药,绝大部分核心验证的代码还是SVRF格式的。

不管什么PV工具,不管GUI做的多花哨,PV完全是按照RULE文件的定义来进行验证的。GUI中的各种选项只是在修改这种RULE。作为一个不要push-button的人,要懂得完全脱离GUI界面进行DRC/LVS验证。PV工具只是用来看看结果看看版图的。既然都是基于一个RULE文件进行验证,那么其实用哪家的工具无所谓。

rule主要分两种DRC和LVS,两种rule不太一样,DRC-rule比较简单,只做简单的距离、面积等规则检查。LVS比较复杂,内容涉及的比较多。

注释

注释方式类似于C语言中的注释,共三种注释方式:

  • // 双斜线,放在一行,直到该行结束;
  • /**/  跨越几行;
  • @  用于显示rule。运行PV软件,都会吐出一个包含violation的文件给其他工具用,那么这个@后面的内容就会显示到其他工具中,用于解释这个violation大概什么是意思。

预处理

预处理命令通常比较重要。修改rule一般都是修改这个预处理命令。

预处理命令都以#号开头,这也是C语言预处理的方式,不要用惯了tcl就把C给忘了。。注意这里#号不是注释。大概有下面三种预处理方式,可以简单理解为变量定义。

#DEFINE NAME value
#UNDEFINE NAME
#IFDEF NAME value some\_rules ELSE other\_rules

变量

变量同预处理命令一样,也是经常需要修改的一个东西。就像tcl中的变量一样,只不过不是用set命令,而是用VARIABLE关键字。例如:VARIABLE pitch 100。

有时,这个VARIABLE并不是在这个rule文件中定义的,而是在linux环境中定义的,例如在linux中,先运行一下命令:setenv pitch 100;在rule中,就可以直接使用$pitch这个变量,注意在使用linux环境中定义的变量时要加$符号。

当然也可以在rule中再次使用VARIABLE定义pitch,其中的值从linux环境中来,例如(可能格式不对,说明一下道理):VARIABLE pitch $pitch。

比较常用的是来定义VDD和VSS:

  • VARIABLE PWR\_NAMES "avdd dvdd"
  • VARIABLE GND\_NAMES "AVSS DVSS"

当然变量只是变量,还需要真正的语句才起作用:

  • LVS POWER NAME  PWR\_NAMES
  • LVS GROUND NAME GROUND\_NAMES

layer的重新定义

PV的rule是针对形状和不同的层来做处理,除了原始GDS中存在的一些层,不可避免的由于种种几何的操作,中间会产生各种其他层。rule中一般不会直接采用GDS层的数字,它有自己的一套层编号,好像共有65536层吧。在rule中的层分下面几种:

  • original-layer:即GDS或map文件中所定义的层
  • derived polygon layer: 即根据各种几何操作形成的新的层
  • derived edge layer: 这个比较有意思,其实和polygon一样,区别是polygon是有面积的,edge-layer只有边,没有任何面积。
  • derived error layer: 我们看到的各种violation其实也是layer。

rule中定义layer的方式有很多种:

  • LAYER MAP  1 datatype 2 3  222:这里表示GDS中1.2 和1.3转化为222这一层。
  • layer mylayer\_alias 222:给222 这一层再起个别名,因为数字的话对人来说不好理解。
  • layer mylayer\_set 1 2 3:第二种定义方式只包含一层,定义的时候也可以定义多层。第三种定义方式,在使用mylayer\_set的时候,就相当于在同时使用3个层

晶体管的重新定义

rule中通过各种集合的晶体管操作,就能知道某几个层次是不是一个晶体管。做DRC检查的时候,一般用不着这种晶体管的定义,这个主要用在LVS上。LVS的检查表面上是netlist和GDS的比较,实际上还是netlist和netlist的比较。PV软件根据rule先把GDS转化成netlist,再和外来的netlist进行比较。所以这时候就需要rule能够对晶体管,电阻电容等进行描述。

GDS/SPICE文件来源

这是几个最基础的语句,指定了要比较的内容:

  • LAYOUT SYSTEM type:这个type 可以是GDSII、LEFDEF 等等。
  • LAYOUT PATH  filename:指定文件名
  • LAYOUT PRIMARY  cellname:指定哪个cell,一个GDS或者一个网表中包含很多个cell,需要手工指定要比较哪个。

上面只是定义了GDS,如果做LVS还需要定义netlist的相关内容:

  • SOURCE PRIMARY  cellname
  • SOURCE SYSTEM SPICE
  • SOURCE PATH  filename

exclude/box/filter

这三种情况是比较容易混淆的,所以放在一起讲。

EXCLUDE

在验证的时候,直接在GDS中忽略这个cell(只是在GDS中忽略,netlist中如果存在还是存在的),一般不用,因为万一在GDS中这个cell和其他cell短路,也查不出来,因为已经忽略了,看不到了。

  • EXCLUDECELL "..."
BOX

这个就比较常用了,在项目前期,GDS或者netlist不全,就需要将某些cell在GDS和netlist中都作为一个黑盒子。

  • LVS BOX “cell\_name”

有的时候可能比较奇怪,GDS和netlist中的名字不一样就需要采用下面的方式进行详细的指定这个BOX:

  • LVS BOX a\_layout\_name a\_source\_name

或者

  • LVS  BOX LAYOUT a\_layout
  • LVS  BOX SOURCE a\_source
FILTER

这个也很常用,在做PR的时候会有很多的physical-onlycell, 例如boundary-cell, filler cell等。所谓的physical-only就是不包含任何晶体管,也不形成任何电阻电容。在PR中吐出网表用于LVS的时候就会面临问题:.v文件中包含这种cell,由GDS中抽取出来的网表不包含这种cell。所以这就会造成不匹配。这里有两种解决办法,一种是PR工具写出网表时不吐出这种cell,例如:saveNetlist -noPhysicalOnly。另一种是在rule中对这种cell进行filter:

  • LVS FILTER "FILL1 FILL2" OPEN

上面的例子中,将filler当做open来处理。如果在PR中用到了电阻电容,这种当然也要过滤掉。

只检查某一部分

如果只想检查OD、PO等基础层,不想检查METAL,只需要做个微小的改动就可以做到:

  • GROUP my\_OD\_PO\_CHECK “OD.? PO.?”

上面自定义了一个Group,名字叫做my\_OD\_PO\_CHECK,这里面包含DRC violation以OD和PO开头的各种violation。

  • DRC  SELECT CHECK my\_OD\_PO\_CHECK

上面定义Group只是一个定义,没有做任何的操作,这里DRC SELECT就会选择只检查这个group。

  • DRC UNSELECT CHECK my\_OD\_PO\_CHECK

正好相反,不检查某些DRC。

除了用GROUP,还可以只检查范围内的DRC,例如只检查这个范围内的,其他不检查:

  • LAYOUT WINDOW {10 10 100 100}

其他

LAYOUT CASE YES

指定是否大小写铭感。如果在GDS中用的是A,但是在网表中用的是a,这就有问题。

SCONNECT metal well by contact

LVS SOFTCHK well UPPER

softcheck也可以理解为ERC。什么是softcheck? metal的连接就是hard连接,因为金属的导电性很强。well井这种连接就是soft连接。well也能作为连接?印象中well只是作为衬底的。所以在rule中,定义为softconnect,当然soft连接一般不是想要的。

LVS REDUCE PARALLEL MOS NO

什么是reduce?在实现一些大的晶体管时,一般会使用叉指结构,在netlist中会写作一个晶体管,但是在GDS中,会把它认为是多个晶体管,这时就需要reduce,让rule认为在GDS中也只是一个晶体管。

LVS REDUCE PARALLEL RESISTORS NO

电阻也是同样道理,还是其他各种情况。

VIRTUAL CONNECT  COLON YES

在做block或者模拟电路的LVS时,如果两个port,他们在top上用metal直接连接,但是在block中看不到这种连接关系,一般将这两个port取相同的名字,且都加一个『:』后缀。这样rule就认为这两个port是直接连在一起的。

LAYOUT RENAME TEXT ""

在做模拟电路时,版图都是用<>来作为bus的名字,但是在netlist中,用的却是[],这时候就需要进行转换。

关于hcell

上面提到的主要是如何从GDS中提取出来网表,LVS rule中大部分都是在描述如何提取出这个网表。下面的部分主要是提取出网表之后,如何辅助网表和网表之间的比较。网表的比较先会比较名字,模块名字对上之后再比较里面的东西是否能对上。

介绍hcell得从LVS的历史讲起。最早的比较方式就是一个inst一个inst的进行比较。但是随着design越来越大,这种方式耗时太多。在数字电路中,inst虽然多,但是cell(可以理解为PR中的reference name)却不多,所以先比较cell,如果inst调用了这个这个cell,那么就不必再比较这个cell的内部了。这样解释了大量的时间,加快了速度。

一般在LVS的时候都需要hcell文件,这里面一般包含下面几种:std-cell,macro-cell,有时候还要加上block的名字,当然这不是绝对的,有时候加上block的名字反倒会产生一些问题。

关于edtext

在做LVS的时候,一般还需要edtext文件。在验证block的LVS时,因为port都有terminal,所以在转成GDS的时候,这个terminal会转化成相应的metal.pin这一层。所以block不需要edtext。

而在TOP,PAD上是没有创建额外的terminal的,PR工具中创建的port其实在LVS比较的时候没有任何作用。为了辅助工具进行比较,就需要从外部对GDS进行标识,这就是EDTEXT

EDTEXT文件需要指定下面几个参数:

  • port的名字;
  • port的位置;
  • port所用的层;

上面只是说明了最常用的port,为了辅助工具进行比较,可以在任何地方加上要辅助的名称。例如对于VDD、VSS来说,还可以在RAIL上面打上edtext。如果在RAIL上面打VDD/VSS的标记,这里会产生另外一个问题:内部的PG名字一般叫做VDD/VSS,但是PAD的名字却不是,可能叫做PAD\_VDD/PAD\_VSS。如果给内部打上了这个标记,那么会产生lvs短路的问题,因为PAD\_VDD和VDD虽然是直接通过metal连在一起的,但是对于PV工具来说,既然打了两个text,会认为这是两个net,所以会产生LVS短路。这时候rule中另一个dummy电阻就起作用了。在GDS中出port的地方会画一层dummy层,这个只是给LVS用,表明这个电阻的两端是两个net,其实这个电阻并不真正存在。

额外CB2,PAD出pin都是RDL层,在做芯片的时候,RDL层并不是最终层,上面还有一层绝缘层。为了让RDL层不被绝缘层覆盖,就需要CB2这一层。CB2可以理解为开孔的意思。

关于网表

PR工具中吐出的网表是.v,但是在PV工具中用的是spice网表,具体到每个晶体管。所以需要将verilog转化成spice网表。一般转化后的网表是.cdl格式。通常memory等hard-macro的网表都是spice格式的。关于cdl和spice格式,大同小异,没什么区别,不过有时候我们自己写脚本处理的时候这种格式还是会有深深的影响。

在netlist的最后,一般都会加入下面内容:

  • .global
  • AVDD AVSS DVDD DVSS

这个主要是申明PG用的。如果查看netlist的网表,会发现,即使对于一个简单的BUFFER, 也有6个端口,除了VDD/VSS/INPUT/OUTPUT之外,还有两个:VDDB/VSSB,即衬底和井的电压。一般这两个pin需要采用上面的.global语句,即表明所有cell的VDDB/VSSB都连在一起。如果不指定,那么就需要一层层的穿进去,TOP上也需要指定这两个port,就像正常的端口一样,都要连起来。

史海钩沉

附录一篇历史,从eetop上看到的。

http://bbs.eetop.cn/thread-354933-1-1.html

作者:陌上风骑驴
来源:https://mp.weixin.qq.com/s/wVkl31ZEQOJGpgBuiLVfQg
作者微信公众号
Capture.PNG

相关文章推荐

从EDA使用,捋数字芯片设计实现流程 | 验证
人物访谈:因为热爱而努力拼搏的Jessica

更多IC设计技术干货请关注IC设计技术专栏。
推荐阅读
关注数
11636
内容数
1230
主要交流IC以及SoC设计流程相关的技术和知识
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息