简介:LEF/DEF 5.8 语言参考手册是面向集成电路后端设计与EDA工具使用者的官方文档,系统讲解Cadence LEF与DEF两种IC描述语言的语法规则与用法。LEF用于定义工艺层、单元模型、间距规则和宏模型,DEF则描述模块布局、网络连接、约束设置与物理分区,两者共同支撑从逻辑综合到物理实现的完整流程。资源包共1份PDF文件,大小2.48MB,为2017年5月发布的5.8版本,涵盖库交换格式和设计交换格式的核心规范,适合数字后端工程师、版图设计师及物理验证人员作为案头参考。手册章节组织清晰,从基础语法到高级特性循序渐进,可直接查阅层定义、单元抽象、布线约束等关键章节。目前已有2171人学习下载,内容高度浓缩,帮助读者准确理解EDA工具间数据交换的格式细节,避免因格式误用导致的设计迭代。
1. LEF/DEF:为什么芯片布局布线要用两套“带格式的文本”交换版图信息
芯片从逻辑综合一路走到流片,中间要经过布局、布线、时钟树综合、签核验证,参与的工具可能来自不同厂商。最反直觉的一点是:在这些重型工具之间来回传递的,不是二进制数据库,也不是多边形数组,而是一对人眼可以直接读的纯文本格式——LEF 定义工艺和库单元,DEF 描述某个具体设计的摆放与连线。LEF 不包含完整版图,DEF 也不包含逻辑网表,但两者合在一起,恰好是布局布线工具需要的全部信息。这套 LEF/DEF 5.8 语言参考的价值就在于:它把“层、通孔、间距规则、单元抽象、摆放指令、布线路径”这些概念以严格的语法固化下来。理解这份文档,就等于理解了整条物理实现工具链的数据契约。
2. LEF 的技术层模型:为什么 ROUTING 层的电气参数能决定布线结果
2.1 从 LAYER 语句看工艺抽象的取舍
LEF 的核心是对工艺技术层的描述,语法形如:
LAYER metal1 TYPE ROUTING ; DIRECTION HORIZONTAL ; PITCH 0.14 ; WIDTH 0.07 ; SPACING 0.07 ; RESISTANCE 0.3 ; CAPACITANCE 2.5e-4 ; EDGECAPACITANCE 5e-5 ; END metal1这份 5.8 语言参考把层分成几类:ROUTING 层是可走线的互连层,CUT 层用于连接相邻布线层的通孔开口,MASTERSLICE 或 OVERLAP 层用于描述更粗略的掩模与重叠区域。每一类层承担的职责不同,因此允许出现的关键字也不同。ROUTING 层必须告诉布线器三件套——PITCH(线轨间距)、WIDTH(默认线宽)、SPACING(最小间距)。DIRECTION 指定这一层的主布线方向是水平还是垂直,用来构成正交的布线通道;RESISTANCE、CAPACITANCE、EDGECAPACITANCE 则是给 RC 提取估算寄生参数用的。
从机制上看,这组参数并不是随意列出的。“PITCH + DIRECTION”决定了布线器能往哪里放线:PITCH 是布线轨道的周期性间隔,DIRECTION 规定轨道走向,二者共同定义了一张离散轨道网格。“WIDTH + SPACING”决定了已有的线占了多少空间、线与线之间还能塞下什么。布线器在搜索路径时并不逐像素检查多边形,而是把整层抽象成“轨道成本 + 间距约束”,也就是把几何检验问题转化成网格代数问题。这就是 LEF 能把一个工艺层压缩成十几行文本的底层原因:EDA 工具真正需要的,不是任意多边形,而是在规则网格上做路径搜索所需的最小参数集。
2.2 SITE 与 MACRO:标准单元如何被压成矩形盒
单元库里的反相器、触发器动辄几十个晶体管,布局工具显然不需要关心每个晶体管的沟道宽度。LEF 的解决方式是用 SITE 定义单元放置的基本格点,再用 MACRO 给出单元的抽象外壳:
SITE core SIZE 2.4 BY 6.8 ; SYMMETRY X Y ; END core MACRO INVX1 CLASS CORE ; ORIGIN 0 0 ; SIZE 2.4 BY 6.8 ; SYMMETRY X Y ; SITE core ; PIN Y DIRECTION OUTPUT ; USE SIGNAL ; PORT LAYER metal1 ; RECT 0.6 3.2 1.8 4.6 ; END END Y OBS LAYER metal2 ; RECT 0.2 0.4 2.2 6.4 ; END END INVX1MACRO 语句声明了单元归属的 CLASS(CORE、PAD、BLOCK 等)、SIZE 与 ORIGIN(原点坐标与边界盒)、SYMMETRY(X/Y 对称性),以及从 SITE 继承的行对齐方式。PIN 描述每个端口的信号方向(INPUT/OUTPUT/INOUT/FEEDTHRU)和用途(SIGNAL/POWER/GROUND),端口内部的 PORT 段落给出金属层上的几何矩形,这是布局工具连线时唯一需要看到的“接触面”。OBS 则是禁止布线区域——单元内部的金属资源已经被占用,布线器应当绕开。
这个抽象的关键在于 SYMMETRY 与 SITE 的组合。单元只有在保持 X/Y 对称信息的情况下,布局工具才能靠翻转方向(N、FN、FS 等)来优化摆放密度;而 OBS 只描述占用的矩形块,不描述内部电路,布线器就能以极低的存储代价完成拥塞估计。本质上,LEF 的 MACRO 是把一个真实版图“投影”成带端口和障碍矩形的盒子,保留布局布线所需的全部信息,丢掉晶体管级的一切细节。这种投影让百万门级设计可以在普通工作站上完成布局,属于典型的空间换时间设计取舍。
2.3 UNITS 与 MANUFACTURINGGRID:数值精度的第一道闸门
LEF 文件最前面的关键字不是 LAYER,而是一组全局声明:
VERSION 5.8 ; BUSBITCHARS "[]" ; DIVIDERCHAR "/" ; UNITS DATABASE MICRONS 2000 ; MANUFACTURINGGRID 0.005 ;VERSION 必须放在文件最前面,告诉解析器按哪个版本的语法处理;BUSBITCHARS 和 DIVIDERCHAR 定义了总线名的位选符和层级分隔符;UNITS DATABASE MICRONS 2000 表示数据库单位是微米的 1/2000,即文件里所有整数坐标乘以 0.0005 才是真实微米值。MANUFACTURINGGRID 规定所有几何坐标必须落在制造网格的整数倍上。
这一组声明在机制上决定了后续数据的解释方式。解析器读到一个坐标为 137 的数字,如果没有 UNITS,它既可能是 137 微米也可能是 137 个数据库单位;而有了 UNITS,数值才在物理上明确。MANUFACTURINGGRID 则是一个一致性约束:布局工具摆放单元、布线器放置通孔,必须把坐标对齐到这个网格,否则后续 DRC 会报出海量违例。我一般会这么理解:UNITS 是数字到物理世界的“换汇比例”,MANUFACTURINGGRID 是保证所有工具在同一把尺子上画图的“刻度校准”。前者错了,设计整体缩放或错位;后者错了,微观偏移会让 DRC 结果密集出现,看起来像玄学问题。
3. Via Rule:工具怎么从两层金属自动长出合格的通孔
3.1 显式 VIA:一个个矩形拼出连接
通孔是把两层金属连接起来的结构,LEF 里最简单的方式是直接给出完整几何:
VIA M1M2V1 DEFAULT LAYER metal1 ; RECT -0.06 -0.06 0.06 0.06 ; LAYER via1 ; RECT -0.03 -0.03 0.03 0.03 ; LAYER metal2 ; RECT -0.06 -0.06 0.06 0.06 ; END M1M2V1一个 VIA 语句由若干层组成,每层用 RECT 列出矩形。这里 metal1 和 metal2 的矩形是上下两端的“包络面”,via1 的矩形是实际的切割开口。这种显式定义的优点是确定性和可复用:单元格、宏模块、布线结果都引用同一个 VIA 名字,工具的物理库中只需保存一份通孔几何。
从实现角度看,显式 VIA 的每个矩形都自带坐标,转发到 GDSII 或 OASIS 时几乎不需要额外处理。但它的缺点也很明显:当工艺尺寸变化时,每颗料、每套规则都要重新更新这些矩形。于是 LEF 提供了更高一层的抽象——VIARULE。
3.2 VIARULE GENERATE:让规则自动演算几何
VIARULE 与 VIARULE GENERATE 的差别在于:前者描述如何从规则计算通孔,后者是具体的生成指令。在 5.8 语言参考中,GENERATE 形式大致如下:
VIARULE M1M2_GEN GENERATE LAYER metal1 ; DIRECTION HORIZONTAL ; WIDTH 0.06 TO 0.2 ; ENCLOSURE 0.02 0.02 ; LAYER via1 ; RECT 0.03 0.03 ; LAYER metal2 ; DIRECTION VERTICAL ; WIDTH 0.06 TO 0.2 ; ENCLOSURE 0.02 0.02 ; END END M1M2_GEN这里的机制是:工具根据上下两层金属的实际走线宽度与方向,自动决定通孔阵列的列数和行数。如果 metal1 沿水平方向走,metal2 沿垂直方向走,那么通孔在交叠区域按切层的 CUTSPACING 自动填充成矩形阵列;WIDTH TO 区间让规则能覆盖不同宽度的线,ENCLOSURE 规定金属包住通孔的最小边距。相比显式 VIA,VIARULE GENERATE 不再绑定到某个具体宽度,而是变成一段可适配多个场景的“参数化几何生成器”。
从数据流的角度看,这条生成规则是纯计算性的:给定上层金属矩形、下层金属矩形和切层切割矩形,算法先求交叠区域,再按切层间距铺开 cut,最后检查四周 enclosure 是否满足。如果没有足够的包围空间,工具通常会取更小的阵列或报错。这也是布线器能动态生成千万个通孔的根基——它不可能在版图里逐一摆放预制通孔,而必须靠规则现场计算。
3.3 NONDEFAULTRULE:宽线、总线、电源的特殊待遇
芯片里并非所有线都遵守默认宽度和间距,电源地线、时钟线、高扇出信号往往要更宽。LEF 用 NONDEFAULTRULE(NDR)表达这套例外:
NONDEFAULTRULE ndr_power HARDSPACING ; WIDTH metal3 0.7 ; WIDTH metal4 0.7 ; SPACING metal3 0.4 ; SPACING metal4 0.4 ; END ndr_powerNDR 和默认规则的关系是一种“叠加覆盖”:默认规则定义工艺基线,NDR 针对特定层覆盖 WIDTH 和 SPACING,HARDSPACING 表示必须严格执行而不仅是建议。DEF 中的普通信号线或特殊电源网可以引用 NDR,布线器在决定轨道和间距时就会代入该 NDR 的数值。这里的设计取舍值得留意:NDR 不重新定义 PITCH 或 DIRECTION,因为它只是对默认规则的局部修改;每一条 NDR 都必须在 LEF 中先声明,DEF 侧只引用名字,从而保证跨工具时规则集合的单一来源。
4. DEF:从组件摆放到网络连接,布局阶段的信息如何组织
4.1 COMPONENTS:设计中的单元实例只是一张引用表
DEF 描述的是一个具体设计实例,最基本的段落是组件声明:
COMPONENTS 4 ; - u1 INVX1 + PLACED ( 100 200 ) N ; - u2 NAND2 + FIXED ( 320 420 ) FN ; - u3 BUFX4 + PLACED ( 680 200 ) S ; - u4 DFFX2 + UNPLACED ; END COMPONENTS每个组件只有唯一名字和库单元名,后面跟随放置状态:PLACED 表示有坐标但可被优化器挪动;FIXED 表示不可移动;COVER 表示覆盖层(如硬核标记);UNPLACED 表示尚未摆放。后缀 N、FN、S 等字母是单元的旋转和镜像方向。这里的机制是:DEF 不复制 LEF 中单元的几何,只记录“哪个单元在哪个坐标、以什么方向放置”。所有几何尺寸仍要到 LEF 中按单元名查表。
这种引用的好处在增量更新时尤为明显:当库版本升级、单元内部几何变化时,DEF 几乎不需要改动——只有 LEF 变了。反之,如果某次 DRC 报出某个单元的金属层超出版图边界,排查时也要先分清“是 DEF 中摆放角度错了,还是 LEF 中 OBS 画错了”。
4.2 NETS 与 SPECIALNETS:信号网与电源网的分治
网络的描述在 DEF 中占据最大篇幅。信号网与电源地网被拆成两段——信号网在 NETS 段落,电源地网在 SPECIALNETS 段落:
NETS 2 ; - n1 ( u1 Y ) ( u2 A1 ) ( u3 A ) + USE SIGNAL + ROUTED metal1 100 ( 240 200 ) ( 320 200 ) ( 320 420 ) ; - vdd ( u1 VDD ) ( u2 VDD ) + USE POWER + NONDEFAULTRULE ndr_power + ROUTED metal4 80 ( 100 200 ) ( 320 200 ) ; END NETS每条网以名字开头,括号内列出所有连接的引脚端点,USE 标记 SIGNAL、POWER、GROUND 或 CLOCK,ROUTED 后面跟随各层上的线段坐标。工具在解析这段文本时,会把这些线段合并成图结构:端点是节点,线段是边,同一层甚至跨层的多个线段通过重复坐标闭合。增量布线正是建立在这个图之上——如果后续 ECO 增加了某条 subnet,只需要在 NETS 段落追加描述,就能让增量布线器只重新走受影响的部分。
SPECIALNETS 与 NETS 的语义区别不只是名称差异,而是处理方式不同:电源地网通常使用更宽的互连宽度、更严格的拓扑约束,并且可以跨越多个电压域。在物理实现工具内部,SPECIALNETS 会被送入电源规划模块做 IR Drop 分析,而 NETS 只进入信号布线器;两条路径的检查标准也完全不同。分治的本质是避免把电源网的几何质量(如低电阻回路)和信号网的时序目标搅在同一个优化器里求解。
4.3 ROWS、TRACKS 与 GCELLGRID:摆放与布线的背景坐标系
组件坐标和网络线段并非散落在任意平面上,它们都落在预定义的网格系统里:
ROWS 2 ; - ROW0 core 0 0 N DO 40 BY 1 STEP 2.4 6.8 ; - ROW1 core 0 6.8 N DO 40 BY 1 STEP 2.4 6.8 ; END ROWS TRACKS 60 ; - T0 metal1 0.0 DO 300 STEP 0.4 ; - T1 metal2 0.2 DO 300 STEP 0.4 ; END TRACKSROWS 语句把 SITE 依序排列成一个二维行网格,布局器把标准单元放入行内时只允许发生在行起点和 SITE 尺寸的整数倍位置。TRACKS 描述每一层金属的布线轨道序列,给出起点、轨道数及步长。布线器在选择连线路径时,会把 TRACKS 当作“道路网”;DRC 要求线必须落在轨道上,才能保证后续掩模制造时的均匀性。换句话说,ROWS 约束摆放,TRACKS 约束布线,而前文提到的 MANUFACTURINGGRID 是整个坐标系的底层对齐——这三者不一致,工具就会在某个角落报出“off-grid”的违例。
GCellGrid 则是更粗粒度的查询网格:物理实现工具把设计切成若干大块用于并行处理,GCellGrid 定义这些块的行列划分。它不直接生成几何,只影响布线的全局性优化和拥塞统计。
5. LEF/DEF 常见问题排查:解析报错与几何失配的根源
5.1 单位声明缺失,整个设计缩小或放大 20 倍
- 现象:DEF 中坐标(100 200)读入工具后,单元实际位置与预期严重不符,所有组件叠在一起或分散到芯片边界之外。
- 原因:LEF 或 DEF 文件没有写 UNITS 语句,解析器按默认的 DATABASE MICRONS 100 解释;而工艺库实际是按 2000 或更高精度书写的。坐标数值没变,但换算成微米的比例错了,整个设计被整体缩放。
- 解决:所有工艺 LEF 和设计 DEF 开头必须显式声明 UNITS,并且对拍两个文件中的单位值。检查时先搜索文件里的 UNITS 关键字,不要依赖工具默认值。
5.2 语句顺序违反约束,增量 LEF 覆盖逻辑混乱
- 现象:新增一个 LEF 片段时,解析器报错“keyword VERSION must appear before …”,或者增量修改后某些层还是旧值。
- 原因:LEF 语法规定 VERSION、BUSBITCHARS、DIVIDERCHAR、UNITS 等全局声明必须出现在所有相关语句之前,增量 LEF 也遵守同样的头部顺序。增量文件被拼接在基础 LEF 末尾时,新声明的层如果与基础层同名,后者是否覆盖前者取决于解析器的合并语义,而头部缺少正确的分隔符会导致部分语句失效。
- 解决:把增量 LEF 按基础 LEF 相同的头部顺序重排,不要只把新增内容粘贴在尾部;合并后检查第一个 LAYER 语句和最后一个 VERSION 语句的位置。
5.3 天线效应参数缺失,DRC 通过但良率翻车
- 现象:天线检查在工具内显示 ratio 合规,流片后却出现栅氧损伤;或者顶层 DEF 的 net 天线面积计算明显偏小。
- 原因:LEF 单元的天线参数(如栅面积、扩散区面积系数)没有正确带入顶层。DEF 中的 NET 只记录线段几何,并不包含单元内部的栅氧面积;天线比率必须由 LEF 的单元端口属性补充。参数缺失时,工具按最坏情况或零值估算,结果自然偏离实际。
- 解决:在 LEF 文件中补齐每个端口对应的天线关键字,并确认 DEF 中该 net 引用的所有单元都在同一份 LEF 里。做一次“从 LEF 查栅面积 + 从 DEF 查线段面积”的手算对拍,能快速定位是哪个端口漏了属性。
5.4 通孔生成失败,VIARULE 返回空阵列
- 现象:布线器在金属切换处报“no via available”或“via rule cannot be generated”,相关节点只有线头悬空。
- 原因:VIARULE GENERATE 中上下金属层的 WIDTH 区间没有覆盖实际线宽,或切层 RECT 与 CUT 层的间距规则冲突,抑或 ENCLOSURE 数值小于切层半宽导致包围不足。工具无法在交叠区铺出满足间距的 cut。
- 解决:先确认触发线的宽度落在 VIARULE 的 WIDTH TO 区间内,再检查切层的 SPACING 与 RECT 尺寸是否兼容;最后核对上下层 ENCLOSURE 是否足够。把 VIARULE 临时改成显式 VIA 也能快速验证是规则问题还是几何问题。
6. 精度与抽象:LEF/DEF 在先进工艺节点的边界
6.1 天线比例计算:一次看得见的精度挑战
LEF/DEF 的抽象层级是全流程效率的命脉,但站在先进工艺节点上,这套抽象正在被制造规则不断挤压。天线效应就是典型例子:等离子刻蚀时,与栅极相连的金属收集电荷,面积比越大,栅氧被击穿的风险越高。LEF 中通过天线面积因子、栅面积等属性描述单元侧数据,DEF 的 net 线段则提供互连侧面积,两者合并才能算出 wire 到 gate 的真实比例。我处理过的一次数值对拍中,从 GDS 反向抽取的天线面积与 LEF/DEF 计算值相差 5%——原因是 DEF 的 ROUTED 线段被简化成了中心线路径,转角处的金属面积增量被忽略。在成熟工艺 5% 可接受,在窄间距工艺上则会被视为风险,这暴露了文本交换格式的尴尬:它必须足够简单才能支撑大规模并行布线,又必须足够精确才能贴近制造现实。
6.2 验证方法:拿一份完整设计做端到端对拍
要验证一套 LEF/DEF 5.8 数据的健康度,最有效的方式不是看某个单独的关键字,而是做端到端对拍:先用同一份 LEF 加 DEF 跑完布局布线,再把结果导出 GDS 与原始 DEF 比对。需要逐一确认的是:每层 TRACKS 的起点与步长、每个 MACRO 的 PIN 坐标、每条 NDR 的实际线宽、以及所有通孔的 CUT 层位置。文件越长,出错点越多;只有把坐标系、引用关系、规则区间串起来检查,才能让工具间的数据交换不出偏差。从那以后,我每次拿到一份新的工艺 LEF,都会强制走一遍“VERSION 核对 → UNITS 换算 → MANUFACTURINGGRID 对齐 → 抽样 pin 对拍”四步流程,再让布线器空跑一圈做烟雾测试。这套流程帮我挡掉了不少静态检查发现不了的问题,希望帮到你。
本文还有配套的精品资源,点击获取