不知道各位有没有想过,LVS 工具是怎么知道 M1 和 M2 有没有连上,又是怎么知道 MOS 的 source 端有没有接到 metal1 的?

GDS 里面其实没有”net”这个概念,只有一堆层次图形和文字。对于 LVS 文件来说,如果前面的 layer 定义是把原材料准备好,那连接关系就是告诉工具:哪些材料碰在一起才算电学连接

这一篇我们就来看 LVS 文件中最常见的几类连接写法:TEXT LAYERPORT LAYER TEXTATTACHCONNECTSCONNECTLVS SOFTCHK

一、文字和端口定义

layout 里面经常会在金属上打一些文字,比如 VDD、VSS、IN、OUT。很多初学者会觉得:我名字都写在版图上了,LVS 肯定能认识吧?

其实不一定。LVS 文件必须先告诉工具,哪些文字层可以作为 net name 或 port name 使用。

TEXT LAYER M1 M2 M3 M4 M5 M6 STM2 M1BA M2BA M1TXT M2TXT M3TXT M4TXT M5TXT M6TXT M2BATXT M1BATXT STM2TXT
PORT LAYER TEXT M1 M2 M3 M4 M5 M6 STM2 M1BA M2BA M1TXT M2TXT M3TXT M4TXT M5TXT M6TXT M2BATXT M1BATXT STM2TXT

#IFDEF WELL_TEXT TRUE
TEXT LAYER SUBTXT WELTXT
PORT LAYER TEXT SUBTXT WELTXT
ATTACH SUBTXT pwell
ATTACH WELTXT nwell
#ENDIF

TEXT LAYER 的作用是告诉 Calibre:这些层上的数据库文字可以拿来做连接提取。如果没有对应的 TEXT LAYER 设置,版图里对应层上的文字就不会被 connectivity extractor 用来命名 net。

PORT LAYER TEXT 则是告诉 LVS:这些文字可以当作顶层 port。也就是说,如果你希望提取出来的 layout netlist 顶层 pin 里面出现 VDD、VSS、IN、OUT 这些名字,就需要有对应的 port text 设置。

ATTACH 是干什么的呢?它是把标签或端口对象所在的原始层附着到真正的连接层上。如果第一层是 text object,SVRF 以文字 basepoint 是否落在目标连接层上判断附着。比如下面这段:

ATTACH M1 metal1
ATTACH M2 metal2
ATTACH M3 metal3
ATTACH M1TXT metal1
ATTACH M2TXT metal2
ATTACH M3TXT metal3

ATTACH M1 metal1 的意思是把 M1 层上的标签或端口对象附着到 metal1 这个连接层上;后面的 ATTACH M1TXT metal1 则处理专门的 M1 text 层。这里要注意,案例文件里面真正参与连接的不是原始层 M1,而是前面经过处理得到的派生层 metal1

所以如果你遇到 port mismatch,或者 layout 明明写了端口名但 LVS report 里面没有识别出来,第一反应可以先查这三样:TEXTTYPE 有没有映射、TEXT LAYER 有没有包含、ATTACH 有没有贴对层

二、普通连接关系 CONNECT

接下来就是 LVS 里面最核心的连接语句:CONNECT

常见写法有两种:

// 两个层相接或重叠就认为连接
CONNECT layer1 layer2

// 两个层需要通过 contact/via 层连接
CONNECT layer1 layer2 BY contact_layer

对于 layout 工程师来说,最常见的肯定是第二种。比如 M1 和 M2 之间要通过 via1 连接:

CONNECT metal1 metal2 by via1
CONNECT metal2 metal3 by via2b
CONNECT metal2 mimcap
CONNECT metal2 mimcap1d5
CONNECT MIM metal3 by via2a
CONNECT mimcap metal1 by via1
CONNECT mimcap1d5 metal1 by via1

第一条 CONNECT 的含义是:metal1metal2 只有在存在 via1 的地方才会被认为电学连接。不是说 M1 和 M2 在版图上重叠一下就自动导通,也不是说只要画了 via 图形就一定能导通,关键是 rule deck 里面的 via1 派生层要能正确识别到它。

这一点在 debug open 的时候非常重要。很多时候你在版图里面看着 via 已经放了,但 LVS 还是报 open,那就要回头看:这个 via 是否落在正确的层上?对应的 via 派生层有没有被算出来?当前 METAL_OPTION 下有没有这条 CONNECT

三、不同金属选项下的连接关系

Foundry 提供的 LVS 文件一般不会只支持一种金属堆叠。比如同一个工艺可能有 1P3M、1P4M、1P5M,MIM 电容也可能放在不同金属层之间。于是 deck 里面就会出现很多 METAL_OPTIONMIM_OPTION

#IFDEF METAL_OPTION 4
#IFDEF MIM_OPTION 1
CONNECT metal1 metal2 by via1
CONNECT metal2 metal3 by via2
CONNECT metal3 metal4 by via3b
CONNECT metal3 mimcap
CONNECT metal3 mimcap1d5
CONNECT MIM metal4 by via3a
CONNECT mimcap metal2 by via2
CONNECT mimcap1d5 metal2 by via2
#ENDIF
#ENDIF

这段代码和前面的 METAL_OPTION 1 就不一样了。这里有 metal4,也有 via3a/via3b,MIM 相关连接也变成了 metal3、metal4、metal2 之间的关系。

所以跑 LVS 的时候,option 不是随便填的。如果版图是 1P4M,你却用 1P3M 的连接分支去跑,那高层金属不通是很正常的。如果 MIM_OPTION 选错了,MIM 电容端子也很容易出问题。

一般来说,遇到下面几类问题,可以先怀疑 option:

现象 优先检查
高层金属全部 open METAL_OPTION 是否选错
某一级 via 不生效 当前 option 下使用的是 via2via2a 还是 via2b
MIM 电容端子异常 MIM_OPTION 是否和版图使用的 MIM 位置一致

四、没有 BY 的 CONNECT

大家在看 deck 的时候,还会看到一些没有 BY 的连接语句:

CONNECT psd ntd
CONNECT nsd ptd

这种写法不是作者少写了 via,而是 CONNECT 的另一种形式:两个层的图形只要相接或重叠,就认为它们之间有连接。

比如 CONNECT psd ntdCONNECT nsd ptd,它们和扩散区、tap 区、井区接触有关,也需要结合前面的派生层定义来看。

简单来说,看到没有 BYCONNECT,不要先怀疑语法写错了,而是先问一句:这两个层在工艺结构上是不是本来就应该通过相接或重叠导通?

五、器件端子怎么接到 metal1

金属和金属之间连好了还不够,器件端子也要接进网络。比如 MOS 管的 gate poly、source/drain diffusion、tap diffusion,最终都要通过 contact 接到 metal1。

CONNECT metal1 npoly   BY npolycont
CONNECT metal1 ppoly   BY ppolycont
CONNECT metal1 nsd     BY ndfcont
CONNECT metal1 ntd     BY ndfcont
CONNECT metal1 psd     BY pdfcont
CONNECT metal1 ptd     BY pdfcont
CONNECT metal1 nsd_sab BY ndfcont
CONNECT metal1 psd_sab BY pdfcont

上面第 1/2 行是 poly contact,第 3/5 行是 source/drain diffusion contact,第 4/6 行则和 tap diffusion 相关。这里的 npolycontppolycontndfcontpdfcont 都是前面定义好的 contact 派生层。

这也是很多 LVS open 的来源。版图上 metal1 盖到了 diffusion 附近,但如果 contact 没画,或者 contact 派生层没有识别出来,LVS 仍然认为器件端子没有接上。

六、SCONNECT 软连接

接下来是很多人容易混淆的 SCONNECT

SCONNECT 经常被叫做软连接,但更准确地说,它是把 upper_layer 的节点信息单向传递到 lower_layer。注意,是单向,不是普通 CONNECT 那种双向导通。

SCONNECT ntd nwell BY ntd_nwell_subcont
SCONNECT ptd pwell BY ptd_pwell_subcont

比如第一条 SCONNECT ntd nwell BY ntd_nwell_subcont,表示由 ntd 这个 upper layer 把节点信息传给 nwell 这个 lower layer;它是单向 stamping,不等价于普通 CONNECT 的双向短接。

为什么 well、substrate 这些地方要用 SCONNECT,而不是普通 CONNECT?主要原因是它们不是理想金属线。well 本身是一大片半导体区域,可能有多个 tap,可能有不同电位试图给同一片 well 打节点。如果直接当成普通金属短起来,很多软连接冲突就没有办法单独报出来。

七、LVS SOFTCHK

既然有软连接,那就需要有对应的检查输出。案例文件里面紧跟着写了这些:

LVS SOFTCHK nwell    CONTACT
LVS SOFTCHK pwell    CONTACT

这里要特别注意,LVS SOFTCHK 不是简单地检查 “nwell 有没有 contact”。按照 SVRF 的定义,它主要是把 SCONNECT 中发生冲突的相关图形输出出来。

比如有两个不同 net 的 tap,都试图把节点信息传给同一片 nwell polygon,那这就是一个 soft connection conflict。Calibre 通常会按节点规模选出一个节点作为 stamping 结果,而 LVS SOFTCHK 可以把冲突相关的图形输出到 softchk 结果文件中,方便我们 debug。

后面的 CONTACT 表示输出相关 contact_layer 图形。除了 CONTACT,语法里还可以选 LOWERUPPER,默认是 LOWER。这部分平时不一定每天都会改,但看报告时一定要知道它报的是什么。

至于 well floating、pwell 没接地、nwell 没接电源这些问题,更多会放到 ERC 或 PATHCHK 里面去讲。这个系列后面讲 ERC 时会再展开。

八、结尾

对于 LVS 来说,连接关系比 DRC 里面重要得多。DRC 里有些规则不需要 connectivity 也能跑,但 LVS 本质上就是在提取网络、比较网络,所以连接关系一旦错了,后面的器件识别和网表比较都会跟着错。

好了,简单来说,TEXT/PORT/ATTACH 负责把名字贴到网络上,CONNECT 负责定义强连接,SCONNECT 负责处理 well/substrate 这类软连接,LVS SOFTCHK 负责把软连接冲突报出来。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。