新春佳节,对读者送出大礼:vgds的3大特色功能免费用
2. 避免传统lvs流程错误的提取晶体管级寄生电容的方法
版图显示工具使用中,工程师经常希望看一下线网的寄生参数与其图形的对应关系,通过估算来分析实际提取的电容值是否与其一致。该如何实现其功能呢?
通过寄生参数提取后,发现该电路的耦合电容中,有一个与其它不同,其它的耦合电容数量级都是1e-15,而该电容的数量级是1e-14,如下:
C143_101 142 143 1.15638e-14
由于担心该耦合电容计算不准,需要查看142号节点,143号节点的具体图形,该如何查看呢?
Vgds提供了自动显示不同节点图形的功能,工具首先自动生成一个node.gds的文件,记录了所有图形的节点信息。然后通过vgds打开node.gds,如下:
可以看到,左侧把节点号或者节点名显示出来,用户可以点击NET_142,看到图形如下:
由于142与143的耦合电容较大,需要把2个节点同时显示,如下:
可以看到,蓝色A2 layer的2条线网平行走线很长,它们之间的耦合电容构成了其主要的电容值。
用尺子测量,发现142,143的平行走线长度为:126um,线宽为0.38um,线间距为0.3微米。
通过与vgds相结合的tuta工具,可以得到该工艺的单位线长的耦合电容如下:
从上表可以看到,当W=0.38, S=0.3时,其单位长度的耦合电容Ccl = 0.1081ff, 在本例中,该平行走线的长度为126um, 因此,通过手工估算其耦合电容应该是: 0.1081ff x 126 = 13.62ff = 1.362 e-14,与寄生参数提取出来的电容值1.156比较接近,如下:
C143_101 142 143 1.15638e-14
总结:针对寄生参数提取工具提出的网表,如果怀疑其某些电容值计算不准确,需要有2个工具辅助分析。第一个工具是自动显示节点或者线网图形的版图显示工具vgds,第2个工具是自动对寄生参数工艺进行单位线长计算的tuta工具。采用上述2个工具即可对任意线网的提取精度进行分析和估算,从而判断其电容是否准确。
功能2:避免传统lvs流程错误的提取晶体管级寄生电容的方法
做寄生参数提取的工程师经常问:采用寄生参数提取出的电容值是否与wafer上实际测试得到的值一致?这就涉及到2个问题:第一个问题是寄生参数提取的精度是否准确?第二个问题是描述寄生参数提取layer的图形是否与wafer上的实际图形是一致的?
其中第二个问题经常容易被工程师忽略,导致寄生参数提取的结果与wafer上的结果预期不一致。
工业界常用的寄生参数提取流程都是基于LVS Runset的节点提取和layer提取,它根据LVS生成的layer进行后续的寄生参数提取。如果LVS运算过程中对layer的处理没有考虑到寄生参数提取精度的问题,则就会造成寄生参数提取精度不准确。
在LVS Runset开发中,许多工程师认为只要LVS Runset开发正确就行了,不需要考虑寄生参数提取中对LVS Runset的一些约束。结果经常导致寄生参数提取的结果不准确。
特别是,许多公司的LVS Runset开发工程师和RCX Runset开发工程师不是一个项目组的,彼此之间交流并不是很多,就更容易犯上述错误。
如何才能检查出LVS Runset中对寄生参数提取结果影响的问题呢?
DEVICE MN(N) gate poly(G) ndiff(S) ndiff(D) pusb(B)
上述语句的含义是:N型mos管的识别层是 gate图形,4个pin中用poly图形作为G的端口。
上述写法针对LVS提取完全正确。但是,在寄生参数提取中,由于mos管的G到D, G到S的寄生电容已经在spice model中考虑了,不能在寄生参数提取中重复考虑。因此,需要告诉寄生参数提取工具不要再提取这些寄生电容。
可惜的是,上述LVS Runset由于G的端口用的是 poly层,而不是gate层,寄生参数工具在忽略寄生参数时,会把poly-D, poly-S的寄生参数忽略,而不是精确地忽略G-D, G-S的电容,导致有误差。
DEVICE MN(N) gate gate(G) ndiff(S) ndiff(D) pusb(B)
注意上述写法中,mos管的G用了gate这个layer,可以精确地表示mos的端口图形,从而不会屏蔽掉多余的寄生电容。
以上方法是针对一个简单的mos器件,还容易发现存在的问题。如果器件比较复杂,lvs runset中可能有上百个器件,连接关系语句很多,可能就不太容易人工发现上述写法的问题了。
为了解决该问题,本文提出了一套不依赖于LVS流程进行寄生参数提取的策略,其关键思路是:
针对典型的单个器件,采用书写脚本script的方法来定义器件的terminal和用于寄生参数提取的layer,不通过lvs运行的方法来生成寄生参数提取的layer,保证了所有的layer都是按照用户意愿独立生成的图形。
其中它有D G S B的4个端口,通过script脚本定义其提取的layer图形方法是:首先找到每个节点的图形,并找到4个端口的图形。
gdsRect $PW $x00,$y00$x18,$y13 -term B
gdsRect $diffusion $x04,$y04 $x09,$y09 -term S
gdsRect $diffusion $x10,$y04$x15,$y09 -term D
gdsRect $GATE_conn $x09,$y02 $x10,$y04 -term G
gdsRect $GATE_device $x09,$y04$x10,$y09 -term G
gdsRect $GATE_conn $x09,$y09 $x10,$y11 -term G
gdsRect $M1 $x05,$y05$x08,$y08 -term S
gdsRect $M1 $x11,$y05$x14,$y08 -term D
注意该script语句中的Gate_conn, Gate_device的定义,它人工把poly图形分解为连接图形和device图形。针对device图形,可以通过mappingfile 的定义来忽略其与source / drAIn的器件电容。
注意该script语句中的diffusion定义,它人工把AA图形减掉了gate图形,得到左右2个不同节点的图形,从而可以用来测试lvs语句是否也做了对应的减法操作。
script语句生成的用于寄生参数提取的图形如上图所示,其中GATE_device与Gate_conn是2个不同的layer,Diffusion的左右2个图形是分开的。
再对比一下经典的LVS流程提取寄生参数的layer的图形如下:
Lvs流程生成的用于寄生参数提取的图形如上图所示,注意它的layer名称都是lvs文件中的名称,与手工定义的layer名称是不一样的。
二者结果接近,说明nmos的lvs语句针对寄生参数提取正确。
通过nmos的例子,可以得出如下结论:采用script模式描述寄生参数term的方法绕开了lvs可能存在的问题,更直接地定义寄生参数提取的图形,从而有可能发现lvs定义中不太准确的layer。
工具包的vgds/demo/目录下还有pmos, MIM, MOM, hv_npn等器件,运行可以分析其它器件的提取结果。
其中hv_npn的例子发现lvs的衬底定义与手工定义结果不一致,导致提取的寄生参数结果误差较大,证明了该方法可以发现lvs书写不准确之处。
两种方法不一致的原因是,针对衬底图形的寄生参数提取,2种方法的layer定义不同。
Lvs流程的衬底layer有:BW, TW,PW, NW, NSD_BUTTED的5个layer,如下:
Script流程的衬底layer有: PW, NW总计2种layer,3个图形,如下:
根据一般工艺的理解,p型tap对应的衬底是PW,N型tap对应的衬底是NW,上图中最外圈红色是p tap,次外圈绿色是ntap。因此人工书写script时,按照上述原理设置衬底,可能更符合实际。
原始的lvs文件中mapping file书写如下
PSD SUBSTRATE precedence=2
NSD SUBSTRATE precedence=2
PSD_BUTTED SUBSTRATE precedence=2
NSD_BUTTED SUBSTRATE precedence=2
PW SUBSTRATE precedence=2
NW SUBSTRATE precedence=3
TW SUBSTRATE precedence=1
红色字体部分是衬底导致寄生参数提取结果不一致的内容,这些NSD,PSD的layer应该对应到OD的工艺层,而不是对应到衬底层。
修改上述mappingfile的定义后,再次运行2个流程的寄生参数提取,结果如下:
可以看到,二者结果一致,说明采用script流程的方法确实发现了采用lvs流程存在的可能隐含的不准确。
总结:为了验证经典的基于lvs流程的寄生参数提取结果是否合理,本文采用了书写脚本的方式定义单个器件的节点名和图形,从另一个角度验证其准确性。工具包的例子中,包含了NMOS, PMOS, MIM, MOM, NPN等典型器件,分别采用2种不同方法验证寄生参数结果是否准确。
工具包中的各器件模板可以用于各种不同工艺,用户只需要修改一下模板中的layer层号,就可以用于其它不同工艺,减少了用户自己书写模板的工作。
上述功能目前可免费给fabless公司的工程师使用。
|