DIVA中寄生元器件提取语句介绍
DIVA中关于寄生元件提取的语句很多,分别是measureParasitic、multiLevelParasitic、measureFringe、calculatParasitic、saveParasitic、attachParasitic。下面将就它们的用法作一些简单的介绍:
在介绍之前,我们有必要澄清几个概念:首先,我们为什么要对版图进行寄生元件提取?
很简单,我们都知道,在电路的版图当中,由于工艺上的或是其他的一些不可避免的因素的影响,会产生一些寄生的元件。比如说:寄生电容、寄生电阻等等。而这些寄生元件又往往会对我们的电路特性带来负面的影响,所以我们得尽量的减少其生成。但就如上面所说的一样,一些寄生元件的产生有其必然性,这就要求我们
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
的芯片能够在这些负面的影响下也能体现较好的特性。所以在一块芯片的版图完成之后,我们所要进行的很重要的一步工作就是提取版图中的寄生参数并将其代入电路中进行模拟。这就是我们所说的后模拟。只有经过后模拟的版图才是最接近实际情况的器件版图。
另外,我们知道,在版图验证中LVS 是非常重要的。在我们做完寄生参数的提取工作之后,下一步要进行的将是带寄生参数的SPICE模拟。也就是说我们所提取得那些寄生参数将被加入到SPICE的网
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
(netlist)中去。但是,在LVS 中我们却不能将这些寄生元件加入到其网表中,因为这些元件在原始版图中事实上是不存在的。所以,我们将会得到两个不同的视图(view):SPICE view和LVS view。
接下来,我们将进入正题。在具体到每一个语句之前,我先介绍一下后面会经常用到的一些测量语句。Area:面积 perimeter:周长 length:长度 bends:凹角(concave corner) corners:凸角(convex corner) angle:任意角(bends+corners)
calculatParastic语句介绍:
这个函数可以在前面measureParasitic语句所导出的值或是calculatParasitic语句所计算出的值的基础上进行进一步的计算。而且,这个语句能突破每个measureParasitic语句只能进行一次测量的局限性,它允许我们对更多的简单测量语句进行组合以形成复杂的寄生参数测量。其语法如下:
outValue=calculatParasitic(expression[limit])
outValue:是保存在指定文件中的数值
expression:是一些计算符,如:+、—、×、\、log()、sin()、cos()等等。要注意的是在符号和名称之间必须有空格。(这是为了避免混淆,因为我们有像+p这样的层次名称)另外,一条calculatParasitic命令中参量的数目应当限制在十条以内,这一点也要注意。还有就是在运算中不能出现不规则的情况,如下例:
x=area metal over poly
y=area metal over diff
caculate x/y
这时如果y为零,那么这条命令将会终止执行。
Limit:范围限制。它所要用到的操作符有:<、<=、> 、>=、 ==。关键字有:keep和ignore。
其范围限制格式有下列三种:
low_limit operator keyword high_limit
keyword operator low_limit
keyword operator high_limit
例子如下:
cap=calculateParasitic(c1 + c2+ c3 + c4 ignore<0.1)
cap=calculateParasitic((log(c1)*1.3e-6)+(c2*0.054)+1.4 ignore<0.1)
第一句表示将c1 c2 c3 c4的值加起来赋给cap,如果值小于0.1就忽略。
MeasureFringe语句介绍:
这个函数一般是在层的边缘按照相应的DRC语句来进行测量,他不能测量有覆盖关系的层次。一般用它来描述边缘寄生电容或是侧墙寄生电容。
该函数的语法如下:
outvalue=measureFringe(layer1[layer2]calculate[printls “filename”
][grouded][ML Flayer][limit] drc_command)
outvalue:数值形式,只能为参数(parameter)提取或是寄生参数(parasitic)提取语句来引用。如:calculateParasitic、calculateParameter等等。
Layer1:被测量的基本层,必须为connected layer
Layer2:DRC语句所需的第二层
Caculate:关键词calculate+(formula),在formula中长度用l,间距用s表示。其中formula中使用的运算公式同calculateParasitic中的expression相同。
例如:
calculate(l/s) calculate(l/log(s)+2.0)
printls:将测量出的length和spacing只输出至一个名为“filename”的textfile中。这个文件具有下例的形式:
;Node name to number mapping
vdd 1
gnd 9
q* 13
q 15
;length spacing net1 net2
5.5 1.0 1 13
2.5 0.5 1 13
2.5 0.5 1 15
9.5 1.0 9 15
这个文件包括两个部分,第一部分将名称和节点匹配。第二部分按length、spacing的顺序列出相应节点间的测量值。
下面介绍一下measureFringe函数的执行步骤:
1. 找到满足DRC规则描述的下一对边
2. 测量其l和s
3. 计算边之间的电容
4. 决定边的net number
5. 将两节点间新算出的电容加到总体上去
6. 有更多的边,转到第一步
7. 按limit筛选值
注意如果当前文件夹中已经存在有同名文件,将会被覆盖,所以在多次使用printls时,要注意使用不同的文件名。
Grounded:将测量出的寄生参量值转换成为两个分离的测量值(nets到地)。如果你没有定义groundnet,系统将会自动赋值为0!.
ML Flayer:定义的临时层次,为multiLevelParasitic函数传递消息。
Drc_command:与普通的DRC命令无异
Limit:同前所述
例子:fcap=measureFringe(metal calculate(l/s) sep<3 parallel opposite)
mp=measureFringe(metal poly calculate(sqrt(l+3)/log(s)) ignore<0.1 1
的图形)。
如下图例:
Layer1:表示的是要测量的层次, 一般要求是连接层(connected layer)。
Function:表示的是要测量的层次之间的关系。如butting、 coincident, over, not_over, outside、 inside、 enclosing等,其中除去over、not_over外的其余的functions所操作都是边界(edge)。
Layout2:表示的是要测量的第二个层次。
Coeff:系数,用于转换单位。如:将平方微米(电容)的单位转换成法。
Application:定义测量如何进行,有几种方法。填figure表示的是,根据图形提取数据,然后用attachParasitic命令把数据添加到原有的器件上。填two_net表示的是,根据定义的两个层次(layer1、layer2)产生一个二端口(两个节点)的寄生器件。在填two_net时有几点需要注意的地方:
1. 如果第一节点和第二节点相同,则不进行测量
2. 如果没有指定第二层或是所有的后续层次前面的fuction是not_over或是outside。则系统默认得第二节点将是groundNet或是0!(没有指定groundNet)。
3. 采用0!作标志的原因是:0作为net number在一般的extraction中不会出现,所以它不会同其它的net number冲突。而!则应用的是schematic editor中指定globel net的方法。
4. 有相同net number的nets的测量在同一个measureParasitic命令中将会被合并。
填one_net表示的是第一节点同groundNet(0!)间的测量。填three_net 将同two_net一样选择节点。它所要选择的第三个节点的号码源于前缀不是not_over或outside的第三层,但如果第三节点与第一节点相同的话,测量将被忽略。下面举个例子,如下图:
如果你所要提取得是A和B的公共面积到地所生成的寄生电容,你可以这样表示:A over background over B,然后使用two_net application。但是,如果出现这么一种情况,A和B属于同一个net,那么在使用two_net语句时,就会得到一个我们并不想得到的寄生电容。可是如果换作使用three_net语句,那么这个我们并不欢迎的电容将并不会被系统所考虑。
Grounded:表示产生的寄生器件分别是在layout1, layout2和地线之间。注意,由于one_net同grouded的意义相同,它们是不能同时使用的。
Polarized:表示的是有极性的寄生器件,从layout1到layout2, 和反过来是不一样的,如二极管。
Limit:同前。
例:cap=measureParasitic( area ( poly over mental ) 0.03 two_net )
表示得到poly和mental这两层之间重叠的面积,再乘一个系数。得到的是一个两端的器件。
diode=measureParasitic( area ( ndiff over pbase not_over ntub ) two_net polarized )表示是不在ntub上,在pbase上的面积。得到的是一个两端有极性的器件。
MultiLevelParasitic语句介绍:
这个函数通过测量组合层次图形的面积或边长来生成寄生电容。它可以控制层的优先级(与measureParasitic不同),其产生的电容的终端必须是连接层或是源自连接层。该函数的语法如下:outvalue=multiLevelParasitic(layers(layer1 layer2 …)cap(layerA layerB c1 c2 [c3[c4]] [shield(layers c5) [fringe(layerAB layerF [vertical(..s..)]) [grounded][limit]]
outvalue:同前。
Layers(layer1 layer2 .. layerN):一次最多16层,还包含fringe中指定的特殊层次,这些层次的列举顺序指明了优先级。列举的第一项被认为是版图中的lowest layer。在这个层次列表中至少得有两个层次。
系统在下述情况满足的条件下生成电容:
1. 两层有重叠
2. 两层不属于同一个electrical net
3. 两层间没有别的层次的图形存在
如下图:
layer1和layer4间的电容(A)是这两层相重叠的面积减去layer2、layer3插入其间的部分。相当于语句:
layer1 and layer4 andNot layer2 andNot layer3
cap:它有下面的形式:
cap(layerA layerB coeff1 coeff2 [coeff3[coeff4]][shield()][fringe()])
layerA和layerB在前面的层次列表中必须列出。Coeff任旧起到单位转换的作用。不需要的coeff可设为zero或是nil。
LayA和layB在cap语句中的顺序是无关紧要的,我们一般习惯于保持层次列表中的顺序。
Coeff1:layer1和layer2间的转换系数。无论所测面积是如何形成的。如下图:
coeff2和coeff3:前一系数用于layer1的边界与layer2形成的电容。后一系数用于layer2边界与layer1形成的电容,如图示:
如果coeff3缺省而又没有注明nil或是zero,系统赋予其coeff2的值。
Coeff4:layer1的边界和layer2的边界组成的电容。如图示:
shield:用于调整层间的电容(当两层间有其它层次时),如下图:
由于两层间有间隔层,所以c1的值比layer1和layer2间overlap所带来的电容值要小。这个效果可以通过给shield赋上一个负的系数值来达到。我们所提供的系数必须对各种寄生电容给予充分的考虑。如A图中c2+c4或c3+c5。其格式为:shield(layer coeff)。
如下图给出了各种系数的一个图示:
fringe:语法格式为:fringe(caplayer Mllayer vertical(..s..) lateral(..s..))
Caplayer:cap中定义的layer1或layer2。
Mllayer:由measureFringe命令产生的伪层次,用于在measureFringe和multiLevelParasitic这两个函数间传递消息。
vertical:通过修改这个系数来补偿周边寄生电容对垂直寄生电容产生的影响。
Lateral:通过修改这个系数来补偿垂直寄生电容对周边寄生电容产生的影响。
下面有几个图例:
其中c代表的就是垂直寄生电容、S代表的是周边寄生电容。
事实上vertical和lateral都是作为调整参数出现的,它们之间是互动的。
下面有些特殊情况,如图:
如果两图形周边间距为零,将不会有任何vertical或是lateral的调整。图A中在零间距地边缘电容(fringe capacitor)和垂直边界电容(vertical edge capacitor)
间没有任何调整关系。图B中,中间一层是作为shield layer出现的,所以也没有任何垂直边界电容或是0间距边缘电容需要调整。
下面是两个例子:
1. Cap(metal1 diffusion 0.74 0.12 0.23 0.14 shield(poly –0.05)fringe(metal1 Fmetal vertical (-0.15/s))
.coeff1=0.74
.coeff2=0.12
.coeff3=0.23
.coeff4=0.14
.poly层是metal1和diffusion间的shield层,具有电容调整系数-0.05
.Fmetal层在前面measureFringe语句中已经定义
.所有的metal1的边界电容系数将有一个-0.15/s的调整,其中s是measureFringe中定义的图形周边距离。
2. Cap=multiLevelParasitic(layers(diff poly metal) cap(diff poly 0.35 nil) cap(poly metal nil 0.13) ignore<0.1)
AttachParasitic语句介绍:
这个命令将measureParasitic命令中测量出的寄生参数值作为属性赋给器件。注意属性值只能从measureParasitic和caculateParasitic中得到,而不能从器件参数测量命令measureParameter中获取。
AttachParasitic(measurement propname device_layer [attach_layer][shared])
Measurement:measureParasitic或caculateParasitic函数中得出值所在地文件。
Propname:定义属性的名称,有三种方式:
1. 引号内。同一器件的所有测量都集中为一个属性。如“sdcap”。
2. 属性名列表。每个测量对应一个属性名,若测量数>属性名数,则剩余值将被加入到第一属性中,反之,则多余属性名不用。如:”source_cap” “drain_cap”
3. (“source_cap” “S”) (“drain_cap” “D”)
device_layer:在extactmos或是extractDevice中定义的device recognition layer。同样可以是使用像geomInside或是geomGetTexted这类命令从device recognition layer中选出的部分,但其属性值仍将赋给device recognition layer。
Attach_layer:括在括号中的层次列表。是与device_layer相关的层次。其关系可能是lapping、touching、nesting。
Shared:能让一个图形参数的测量值根据它所附属的device的数目来均分。没有这个参数,测量值将赋给每一个device。
例:
1. AttachParasitic(sdarea “sdcap” gate)
将s、d的面积作为单一电容附加到器件上
2.attachParasitic(sdarea “scap” “dcap” gate shared)
将s、d的面积分开作为电容附加到器件上
3.Attachparasitic(sdarea (“scap” “s”) (“dcap” “D”) gate shared)
带有终端的定义
4. AttachParasitic(coll_area “coll_cap” npn tub)
通过npn的集电极与tub的关系确定寄生参数。
SaveParasitic语句介绍:
将测量值作为寄生器件保存到extracted view中,在view中相应位置会产生相应器件,而这些测量值将作为属性保存。
saveParasitic( measurement terminal1 terminal2 propname model )
measurement: 可以是一个列表。如果有多个值的文件被定义,将会产生一个拥有多重属性的寄生元件。
Terminal1, terminal2:表示的是器件的端口,如果上面measureParasitic中选上了polarized,那么要注意端口的一一对应。
Propname:属性名称,用双引号引起来。如电容中的c表示的是容值。”c”。
Model:表示寄生器件参数的模型,也用双引号引起来。如”pcapacitor”
例:saveParasitic( cap "PLUS" "MINUS" "c" "pcapacitor" )
这一条语句表示把cap这个值存成pcapacitor模型,数据存在c参数中,表示寄生的电容值。
saveParasitic( area "ANODE" "CATHODE" "a" "pdiode" )
这一条语句表示把area这个值存成pdiode模型,数据存在a参数中,表示寄生二极管的结面积。