LEF/DEF 5.8 手册解读:芯片后端语法核心与避坑实战
简介:《LEF/DEF 5.8 语言参考手册》是Cadence于2017年发布的官方规范文档,聚焦数字IC后端设计、物理验证及EDA工具开发群体,系统讲解LEF(库交换格式)与DEF(设计交换格式)两种描述语言的设计目的、语法规则和实际应用场景,可帮助读者在一份文档中完整理解从工艺库到设计实现的数据接口规范。资源包仅包含1个PDF文件,压缩包大小约2.48MB,以文本格式为主,页面组织适合按章节快速定位,便于作为案头参考书随时查阅,整体轻量易用。手册详细阐述了LEF中的技术层定义、单元模型几何、间距规则、填充隔离区以及宏模型,具体涉及金属层、多晶硅层、接触层的电气特性描述,以及单元引脚定义、布线阻塞区域等重要内容;同时覆盖DEF中的模块布局、网络连接、物理分区、约束设置与物理属性,包含设计名称、分线网格、电源域定义、约束路径等实现信息,内容覆盖从工艺信息到设计实现的完整数据交换需求。阅读后读者能更准确地编写、解析和调试LEF/DEF文件,确保工具间数据传递的一致性与可制造性,对从事先进工艺节点设计规则分析、物理综合、布局布线以及签核验证的工程师均有直接参考价值。已有2174人学习下载,适合需要深度掌握Cadence数据格式的IC设计工程师。
1. 为什么后端工程师手里要常备一本 LEF/DEF 5.8 手册
做数字后端的人基本都经历过这种场面:从库里拿来一个 LEF 文件,或者从布局工具导出 DEF 准备交给下一棒,结果对端工具一读就报错,提示某个关键字不存在、某个层找不到、某个值超出范围。这类问题十有八九不是工具坏了,而是 LEF/DEF 文件本身的语法或者语义没有对上版本规范。LEF/DEF 5.8 语言参考手册就是这套格式的“最终解释权”,它把 Library Exchange Format 和 Design Exchange Format 的每一个语句、每一个参数、每一条顺序约束都写清楚了。对芯片后端工程师、物理验证工程师和 EDA 脚本开发者来说,这本手册既是排查语法报错的字典,也是写 LEF/DEF 解析与生成代码时的依据,值得放在手边随时翻。
2. LEF 语法核心:技术层、间距规则与 Macro 定义怎么读
LEF 这一半描述的是“工艺和库长什么样”。它不关心你的芯片具体放了多少个实例,只关心工艺里有哪几层金属、每层多宽、间距多少,以及标准单元库里的每个 cell 长什么样、引脚在哪。读懂 LEF 是后续理解 DEF 的前提,因为 DEF 里所有与物理规则相关的引用,最终都要回到 LEF 的定义上。
2.1 LEF 文件骨架:从 VERSION 到 END LIBRARY 的顺序约束
LEF 文件不是随便把语句堆在一起就能解析的。手册第 1 章明确规定了语句的排列顺序,这算是新手最容易忽略、也最容易翻车的地方。一个标准 LEF 文件的基本顺序是 VERSION、BUSBITCHARS、DIVIDERCHAR、UNITS,然后才是层定义、Via 定义、Site 定义、Macro 定义,最后以 END LIBRARY 收尾。顺序错了,轻则解析告警,重则某些工具直接拒绝读入。
VERSION 5.8 ; BUSBITCHARS "[]" ; DIVIDERCHAR "/" ; UNITS { DATABASE MICRONS 1000 ; } LAYER M1 { TYPE ROUTING ; DIRECTION HORIZONTAL ; WIDTH 0.09 ; SPACING 0.10 ; PITCH 0.20 ; } END M1 END LIBRARY这段代码里,VERSION 声明了文件遵循的 LEF 版本,5.8 这个版本号决定了解析器启用哪些新关键字。BUSBITCHARS 和 DIVIDERCHAR 分别定义了总线位选择符和层级分隔符,[]和/是绝大多数工艺库的默认写法。UNITS 段里的 DATABASE MICRONS 1000 表示数据精度,1000 意味着 1 微米被分成 1000 个数据库单位,也就是单位精度为 0.001 微米。后面的 LAYER M1 是金属 1 层的定义,TYPE ROUTING 表明它是布线层,DIRECTION 指定主布线方向,WIDTH 是默认线宽,SPACING 是同层最小间距,PITCH 是布线轨道间距。注意这里所有长度单位都是数据库单位,也就是 0.09 实际代表 0.09 微米。
关于顺序,我一般会这样检查:拿到一个陌生 LEF 文件后,先不看内容,直接搜一下 END LIBRARY 前面有没有 VERSION 和 UNITS,再用脚本把 LAYER、VIA、SITE、MACRO 这四类关键字的出现顺序打印出来。如果发现 SITE 出现在 MACRO 之后,那基本可以断定这个文件是手工拼出来的,解析器大概率会报错。常见的做法是让工具自己重新导出一次 LEF,格式会规范很多。
2.2 ROUTING 层与 CUT 层:主布线参数和通孔规则的差异
工艺库的 LEF 里,层定义类型不止一种。ROUTING 层用于走线,CUT 层用于定义通孔切割,两者在关键字上是完全不同的两套。如果把 CUT 层当成 ROUTING 层来读,或者反过来,解析器给出的错误信息往往让人摸不着头脑,因为提示的关键字和参数完全对不上。
LAYER VIA1 { TYPE CUT ; SPACING 0.10 ; WIDTH 0.04 ; } LAYER M2 { TYPE ROUTING ; DIRECTION VERTICAL ; WIDTH 0.09 ; SPACING 0.10 ; PITCH 0.20 ; }CUT 层的定义比 ROUTING 层简单很多,核心是 SPACING 和 WIDTH。SPACING 是通孔之间的最小间距,WIDTH 是通孔切割的最小尺寸。这里有个容易误解的点:CUT 层没有 DIRECTION,因为它是二维的切割形状,没有主布线方向的概念。ROUTING 层的 DIRECTION 只有 HORIZONTAL 和 VERTICAL 两种值,它决定布线器在该层上优先走横向还是纵向。
对于 5.8 版本,ROUTING 层还支持一些进阶关键字,比如 ACCORDION、FIXEDMASK、OFFSET 等。FIXEDMASK 是 5.8 引入的,用于标记某些金属层在制造时使用固定掩模,不能在布线阶段自由使用。实际项目中,如果某层被标记了 FIXEDMASK,布线器不会自动避开,需要在约束文件里额外处理,这一点在 28nm 以下的工艺里特别重要,因为 double patterning 的掩模限制会直接影响可布线性。
2.3 SITE 与 MACRO:单元模型的几何边界怎么定义
SITE 定义了单元摆放的行距和高度基础,MACRO 定义的是具体单元的边界和引脚。MACRO 里引用的 SITE 必须是 LEF 文件里已经定义过的,否则解析器会报“site not found”。这个引用关系是 LEF 里最常见的耦合点之一。
SITE CORE { CLASS CORE ; SIZE 0.56 BY 4.32 ; SYMMETRY X Y ; } MACRO INV_X1 { CLASS CORE ; ORIGIN 0 0 ; SIZE 0.56 BY 4.32 ; SITE CORE ; PIN A { DIRECTION INPUT ; LAYER M1 ; RECT 0.10 2.00 0.22 2.20 ; } PIN Y { DIRECTION OUTPUT ; LAYER M1 ; RECT 0.34 2.00 0.46 2.20 ; } OBS { LAYER M2 ; RECT 0.00 0.00 0.56 4.32 ; } } END INV_X1这段代码先定义了一个名为 CORE 的 SITE,SIZE 0.56 BY 4.32 表示 site 宽度 0.56 微米、高度 4.32 微米。SYMMETRY X Y 表示该 site 在水平和垂直方向都可以镜像翻转,这对布局器优化单元朝向很重要。MACRO INV_X1 定义了一个反相器单元,CLASS CORE 说明它是核心逻辑单元。PIN 段里,DIRECTION 表示信号方向,LAYER 指明引脚在哪一层,RECT 给出引脚矩形在单元坐标系下的位置。OBS 段是单元的阻挡区,告诉布线器这个区域内部不能走线。
这里有一个容易忽略的细节:MACRO 的 SIZE 必须与 SITE 的 SIZE 匹配,或者说 MACRO 的宽度必须是 SITE 宽度的整数倍。如果 MACRO 尺寸与 SITE 不匹配,布局器在摆放单元时会出现网格对不齐的问题,报错信息通常会指向 PLACEMENT 阶段。我遇到过不少次这种情况,原因是 library 生成工具更新后,SITE 尺寸变了,但 MACRO 里的 SIZE 没同步更新。
2.4 非默认规则与 Via 定义:什么时候用到 NONDEFAULTRULES
除了默认规则,LEF 里还有一种 NONDEFAULTRULES,用于定义特殊的线宽、间距组合。比如时钟网络需要更宽的线和更大的间距以减少 RC 延迟和串扰,就可以通过 NONDEFAULTRULES 实现。5.8 手册里对 NONDEFAULTRULE 的语法约束是:它只能在 LAYER 定义之后出现,且一个 NONDEFAULTRULE 里可以覆盖多个层的参数。
NONDEFAULTRULE WIDE_CLK { LAYER M3 { WIDTH 0.18 ; SPACING 0.20 ; } LAYER M4 { WIDTH 0.18 ; SPACING 0.20 ; } VIARULE VIA1_4 ; }这段定义里,WIDE_CLK 规则把 M3 和 M4 的线宽从默认的 0.09 加宽到 0.18,间距从 0.10 加大到 0.20。VIARULE VIA1_4 指定了这条非默认规则下使用的通孔规则名称。这里要注意,VIARULE 引用的名字必须在 LEF 文件里有对应的定义,可以是显式的 VIA 定义,也可以是 VIARULE GENERATE 自动生成的定义。如果名字对不上,布线器在换层时会突然放弃这条规则而退回默认规则,导致时钟树的线和普通信号线一样宽,这是非常隐蔽的性能杀手。
3. DEF 语法核心:从组件到网络的物理描述顺序
DEF 描述的是“设计长什么样”。它记录的是当前芯片里有哪些实例、放在什么位置、引脚怎么连、有哪些布线阻挡和区域约束。DEF 本身不带工艺规则,所有与工艺相关的参数都要从 LEF 里查询。这也是 LEF 和 DEF 必须配合使用的原因:单独看 DEF 只能看到坐标和连接关系,但看不到这些坐标对应的物理规则。
3.1 DEF 的声明段:DESIGN、UNITS 与 DIEAREA 的配合
DEF 文件的开头是 DESIGN 声明,后面紧跟 UNITS 和 DIEAREA。UNITS 的语法与 LEF 略有不同,DEF 用的是 DISTANCE MICRONS 而不是 DATABASE MICRONS。这里的差异在日常使用中很容易被忽略,但后果非常严重:如果写错关键字,解析器默认使用 100 而不是 1000,整个设计的坐标会被缩放 10 倍。
DESIGN chip_top ; UNITS DISTANCE MICRONS 1000 ; DIEAREA ( 0 0 ) ( 2000 2000 ) ; COMPONENTS 12 ; - inst1 INV_X1 + PLACED ( 100 100 ) N ; - inst2 INV_X1 + PLACED ( 300 100 ) FN ; END COMPONENTS END DESIGN这段 DEF 声明了一个名为 chip_top 的设计,坐标系原点在 (0,0),芯片尺寸为 2000×2000 数据库单位,也就是 2 微米乘 2 微米(在 1000 精度下)。COMPONENTS 12 声明后面有 12 个实例,这里只列出了两个。每个实例行的格式是:实例名 + 单元名 + PLACED 关键字 + 坐标 + 朝向。N 表示正向放置,FN 表示垂直翻转。坐标都是相对于 DIEAREA 原点计算的。
DIEAREA 的坐标单位由 UNITS 决定,这一点在写 DEF 解析脚本时要特别注意。我一般会在解析脚本里先读 UNITS,再读 DIEAREA,最后才读 COMPONENTS,顺序不能乱,因为后面的所有坐标都要依赖前两段来换算。
3.2 COMPONENTS 与 PINS:实例与端口的语法细节
COMPONENTS 段是 DEF 里最长的一段之一,每个实例占一行。除了 PLACED 之外,还有 FIXED 和 COVER 两种放置状态。FIXED 表示实例位置已经锁定,布局器不能移动;COVER 通常用于 decap 单元或 filler 单元。三者的语法差别只在关键字上,但含义完全不同。
COMPONENTS 5 ; - u1 NAND2_X1 + PLACED ( 500 300 ) N ; - u2 NAND2_X1 + FIXED ( 900 300 ) N ; - u3 BUF_X2 + PLACED ( 1500 300 ) F S ; END COMPONENTSFIXED 实例在后续布局优化中不会被移动,这在处理时钟树上的 buffer 时很常见。最后一个实例 u3 的朝向是 FS,表示先水平翻转再垂直翻转。有些解析工具对朝向字符串的大小写敏感,fs和FS可能被当成不同值,所以最好统一用大写。
PINS 段定义的是芯片级端口,也就是顶层设计的输入输出引脚。它与 MACRO 里的 PIN 不是一个概念:MACRO 的 PIN 是单元内部引脚,DEF 的 PINS 是芯片边界上的端口。PINS 的语法包括 DIRECTION、LAYER、PORT 和 PLACED 信息,PORT 里给出引脚几何形状的具体坐标。
3.3 NETS 与 SPECIALNETS:信号网络与电源网络的描述差异
NETS 段描述信号网络,SPECIALNETS 段描述电源和地网络。两者的语法结构相似,但 SPECIALNETS 里多了对线宽和通孔的特殊要求。为什么要把电源网络单独分出来?因为电源网络通常要承载大电流,线宽远大于信号线,而且往往需要手工指定布线路径。
NETS 3 ; - n1 ( u1 A ) ( u2 A ) ( u3 A ) + ROUTED M1 0.09 ( 600 300 ) ( 1500 300 ) ; - n2 ( u1 Y ) ( u2 Y ) + ROUTED M1 0.09 ( 600 500 ) ( 900 500 ) ; SPECIALNETS 2 ; - VDD ! ( u1 VDD ) ( u2 VDD ) + ROUTED M3 0.18 ( 500 100 ) ( 1500 100 ) ; - VSS ! ( u1 VSS ) ( u2 VSS ) + ROUTED M3 0.18 ( 500 200 ) ( 1500 200 ) ; END SPECIALNETSNETS 里每个网络行以-开头,网络名后跟引脚连接列表,每个引脚连接用 ( 实例名 引脚名 ) 表示。ROUTED 关键字后面的 M1 是布线层,0.09 是线宽,后面的坐标对就是布线的路径。注意 SPECIALNETS 里网络名后跟了!符号,这个感叹号表示该网络是电源网络,工具会按照电源网络的特殊规则处理,比如不检查信号完整性规则。
在 5.8 手册里,SPECIALNETS 还支持 USE POWER 和 USE GROUND 关键字来显式指定网络类型。如果网络名是一般的名字而不是 VDD/VSS,解析器无法自动判断它是电源还是地时,USE 关键字就是唯一的判断依据。
3.4 BLOCKAGES、REGIONS 与 TRACKS:物理约束的三个维度
BLOCKAGES 定义布线阻挡区域,REGIONS 定义分组区域,TRACKS 定义布线轨道。三者分别从“不能去哪”“必须去哪”“默认往哪走”三个维度约束了布局布线的自由度。
BLOCKAGES 2 ; - PLACEMENT ( 300 300 ) ( 800 800 ) ; - ROUTING M2 ( 100 100 ) ( 200 900 ) ; REGIONS 1 ; - region1 ( 500 500 ) ( 1500 1500 ) ; TRACKS M1 0.20 DO 100 STEP 0.20 ;PLACEMENT BLOCKAGES 表示这个矩形区域内不能摆放单元,ROUTING BLOCKAGES 表示该矩形区域内 M2 层不能走线。REGIONS 定义了一个名为 region1 的区域,之后可以在组件行里用 + REGION region1 把实例约束到这个区域内。TRACKS 这一行定义 M1 层的布线轨道:起点在 0.20,共 100 条轨道,步长 0.20。布线器在 M1 上走线时,中心线必须落在这些轨道上。
这里有个实际坑:BLOCKAGES 的坐标用的是绝对坐标,而 MACRO OBS 用的是单元内部相对坐标。在写脚本检查两者是否重叠时,必须先把 OBS 坐标加上实例坐标换算成绝对坐标,再与 BLOCKAGES 做交集运算。很多 DRC 违例就是从这里漏出来的。
4. LEF 与 DEF 联调:增量修改、错误检查与跨工具交换
LEF 和 DEF 在实际项目中是成对出现的。LEF 描述工艺库信息,DEF 描述设计实例信息,两者靠层名称、单元名称、引脚名称建立关联。这一章从联调角度讲清楚增量 LEF 的用法、错误检查机制和版本兼容的边界。
4.1 增量 LEF:分层设计时的合并策略
在大型芯片设计里,LEF 文件往往不止一个:基础工艺 LEF、单元库 LEF、IP 宏 LEF 分开提供,最后在工具里按顺序读入。5.8 手册里对增量 LEF 的描述是:后读入的 LEF 可以覆盖先读入的某些定义,但不能新增已经被定义为固定值的关键字。这就是 Incremental LEF 的核心机制。
常见的做法是,基础工艺 LEF 定义所有层的 WIDTH、SPACING、PITCH,IP 供应商的 LEF 只包含 IP 相关的 MACRO 定义和一个 LAYER OVERLAP 层用于布线阻挡。读入顺序错了,比如先把 IP LEF 读进来再读基础工艺 LEF,工具会因为 IP LEF 里的层定义不完整而报错,或者更隐蔽的情况是:基础工艺 LEF 里的层定义被 IP LEF 里的同名层定义覆盖了,导致层参数错误。
我一般会写一个脚本检查读入顺序,先读工艺层完整的文件,再读单元库,最后读 IP 宏。判断标准很简单:每个文件里出现的 LAYER 关键字,后读的文件不应修改已经存在的层的 ROUTING 属性。如果确实需要覆盖,就明确放在一个补丁文件里,并注释标明原因。
4.2 错误检查机制:解析器报错码的含义
LEF/DEF 解析器自带错误检查机制,5.8 手册的第 3 章专门讲了 Message Facility 和 Error-Checking Facility。解析错误通常会以 LEFDEF-xxx 格式的代码输出。理解这些错误码的分类方式,比记住每个具体错误码更有用。
错误大致分三类:语法错误、语义错误、警告。语法错误指关键字拼写或语法结构不对;语义错误指关键字合法但值不合理,比如 SPACING 为负数,或者 MACRO 里引用了不存在的 SITE;警告指文件合法但可能不符合预期,比如某个层定义了但没有被任何 Via 使用。
遇到 LEFDEF 报错时,我最常用的排查方法是:先看错误码后面的行号,再往前找上下文。如果错误信息里带着 token 信息,比如 unexpected token 'M2',那多半是上一个语句没有正确闭合,也就是缺了分号或 END。LEF/DEF 的语句闭合是非常严格的,少一个分号可能会导致后面几十行全部被解析成同一个语句,错误信息反而指向一个完全无辜的位置。
4.3 版本兼容:5.8 与旧版本工具混用的边界
5.8 版本发布后,新工具读旧文件通常没有问题,但旧工具读 5.8 文件时会遇到不认的关键字。手册里明确说,5.8 新增的关键字如果没有在 VERSION 5.8 声明之后使用,旧工具会忽略它们;但一旦声明了 VERSION 5.8,旧工具就会按 5.8 规范解析,遇到不认识的关键字直接报错。
这意味着在实际流程里,如果团队里还有没升级到 5.8 兼容版本的工具,LEF 文件宁可保守一点:版本号写成 5.7 或更早,不要为了用 FIXEDMASK 等新功能而声明 5.8。新旧工具混在一个流程里时,按最旧的工具支持的版本来写 VERSION 是最稳妥的做法。这个经验我在多个项目里反复验证过,血泪教训不少。
5. 避坑实战:LEF/DEF 解析失败的五个高频问题
这一章直接列出我在实际项目中反复踩过的五个高频问题,每个都按“现象 → 原因 → 解决”的方式写清楚。如果你正被某个 LEF/DEF 报错折磨,可以先到这里对号入座。
5.1 坐标整体放大十倍或缩小十倍
现象:DEF 读入工具后,所有实例坐标和芯片尺寸整体变成了预期值的十倍或十分之一。芯片面积看起来完全不对。
原因:DEF 的 UNITS 段写的是 DISTANCE MICRONS,而 LEF 里是 DATABASE MICRONS。如果 DEF 文件里漏写了 UNITS 段,解析器会按默认精度 100 处理,也就是 1 微米等于 100 个数据库单位。而大部分 5.8 工艺库的 DEF 都是用 1000 生成的。坐标系换算基数一变,所有坐标都跟着错。
解决:先检查 DEF 文件头部有没有 UNITS DISTANCE MICRONS 1000。如果是生成脚本输出的文件,检查脚本里单位常量是否写成 1000。我习惯在解析脚本里加一个断言:读取 UNITS 后立即检查值是否在预期范围内(常见值是 100、1000、2000),不在范围内就终止解析并打印警告。
提示:LEF 和 DEF 的 UNITS 关键字不同,一个是 DATABASE,一个是 DISTANCE,混用后解析器不一定报错但结果必然错误。
5.2 层名称大小写不一致导致引用丢失
现象:单元库 LEF 里定义的引脚层是 M1,但 DEF 的 SPECIALNETS 里写的是 m1。工具读入时报错或警告,接着电源网络全部丢失,ECO 布线时电源引脚悬空。
原因:LEF/DEF 的层名称是大小写敏感的。M1 和 m1 是两个完全不同的层名。实际项目中,DEF 文件可能是由脚本生成的,脚本里对层名字符串做了大小写转换,就会导致这种问题。
解决:写脚本时强制统一层名字符串,不要依赖人工输入。我通常在生成 DEF 的脚本里维护一个层名映射表,输入层名先查表再输出,查不到就直接报错终止。这样可以把错误拦截在源头。
5.3 EXTENSIONS 语法段被工具静默忽略
现象:LEF 文件里写了 EXTENSIONS 段,工具读入时不报错,但后续逻辑好像完全没有生效,比如某些自定义属性查不到。
原因:EXTENSIONS 段是给未来扩展用的,5.8 手册明确说明解析器遇到 EXTENSIONS 时会跳过内容并继续解析。如果工具不识别 EXTENSIONS 里的自定义关键字,它不会有任何提示,但也不会把内容加载到内存里。
解决:不要依赖 EXTENSIONS 段传递关键信息。如果确实需要自定义属性,用 PROPERTYDEFINITIONS 定义属性,然后在具体对象上赋值。这样属性会进入工具的数据库,可以被查询和使用。EXTENSIONS 只适合放注释性质的说明文字。
5.4 DEF 中 NET 引脚顺序写反导致连接错误
现象:布线完成后做 LVS,发现某个标准单元的引脚连接关系与网表不一致,但 DEF 文件里网络名和引脚名在文本上看都是对的。
原因:DEF 的 NETS 段里,引脚连接列表的顺序在某些工具里会被解释为连接顺序,尤其在有多个相同类型引脚(比如多个 IN 引脚)时更容易出错。如果生成脚本把引脚的顺序打乱了,工具按顺序匹配引脚名时就会连错。
解决:检查生成脚本,确保引脚连接列表的顺序与单元库网表定义的引脚顺序一致。最稳妥的验证方法是在布线后用工具导出一份标准 DEF,与脚本生成的 DEF 做 diff,重点比较组件行的顺序和每个 NET 行的引脚顺序。
5.5 VIARULE GENERATE 生成的过孔尺寸不满足 DRC
现象:使用 VIARULE GENERATE 自动生成过孔后,DRC 报出通孔间距违例,但 LEF 文件里定义的 SPACING 看起来是满足规则的。
原因:VIARULE GENERATE 的语法里,通孔的尺寸和间距是分上下两层分别指定的。如果只设置了上下两层的间距而没有设置 CUT 层的间距,生成的过孔阵列中通孔之间的距离可能不符合工艺要求。
解决:在 VIARULE GENERATE 定义里显式指定 CUT 层的 SPACING 和 WIDTH。不要依赖工具的默认值。我一般会在生成完后,把 Via 阵列拆成矩形坐标,跑一遍简单的间距检查,确认最小间距大于 CUT 层规则值。
6. 进阶自查:把 LEF 技术文件优化和天线比率验证变成习惯
前面五章讲的都是怎么读、怎么用、怎么排错。最后一章聊一个更进阶的主题:拿到一份 LEF 技术文件后,除了确认它能被工具正常解析之外,还应做哪些主动优化和验证。这部分内容来自手册附录 B 和附录 C 的实践总结,我直接说结论。
手册附录 B 的主题是“Optimizing LEF Technology for Place and Route”,里面给出了若干条关于布线 Pitch、宽金属间距、过孔延伸和默认过孔的指导原则。其中我体会最深的是布线 Pitch 的设定:Pitch 太大,可布线资源不足,拥塞度升高;Pitch 太小,信号串扰和 DRC 违例概率上升。常见做法是把 Pitch 设为该层最小布线间距加最小线宽的值,也就是 Pitch = Width + Spacing。如果工艺允许,Pitch 设为这个值的偶数倍可以更方便地布线。
附录 C 的主题是“Calculating and Fixing Process Antenna Violations”,讲的是天线效应的计算与修复。天线比率是栅极面积与周边导体面积的比值,这个比值超过工艺上限时,等离子体刻蚀过程中积累的电荷可能击穿栅氧化层。LEF 文件里与天线相关的关键字集中在 LAYER 段,包括 ANTENNAAREARATIO、ANTENNADIFFAREA、ANTENNAGATEAREA 等。
我每次拿到新工艺的 LEF 技术文件后,都会强制走一遍这几步:第一步,检查所有 ROUTING 层的 Pitch 是否等于 Width 加 Spacing;第二步,检查是否存在 WIREEXTENSION 设置,特别是 Via 附近没有线延伸的话,天线效应风险会显著升高;第三步,把天线比率相关的关键字值列成一张表,对照工艺文档里的上限值逐一核对。这三步走完之后,我才会把这版 LEF 放进正式的流程里用。
从那以后,我每次换工艺节点或者更新 PDK 版本,都会把这一套 LEF 自查流程走一遍,大概花一个多小时,但省下的排错时间远远超过这个数。这份 LEF/DEF 5.8 手册里值得深挖的细节还有很多,希望这份手册资源能帮你在后端流程里少踩几个坑。
本文还有配套的精品资源,点击获取