简介《LEF/DEF 5.8 Language Reference》是 Cadence 官方发布的 LEF/DEF 语言参考手册2017 年 5.8 版面向集成电路物理设计、布局布线、EDA 工具开发与版图验证工程师也适合刚接触 LEF/DEF 格式、需要读懂工艺库与设计交换文件的研究者和学生。正文按语法条目组织LEF 部分讲工艺层与电气特性、标准单元与宏模型的几何抽象、间距规则以及填充与隔离区域建模DEF 部分讲模块布局与方向、网络与通孔连接、DRC/LVS/ERC 约束、物理分区及电源地属性。5.8 版相对早期版本增强了约束管理、细化了物理描述并加强对先进工艺节点的支持可用于物理综合、布局规划与验证环节查规则、对语法、定位工具报错。资源包共 1 个 PDF 文件约 2.48MB单文件含完整目录与章节索引检索方便。目前已有 2177 人学习下载适合作为案头工具书长期查阅也便于团队内部做格式规范参考。1. LEF/DEF 5.8 语言参考一份该放在手边的物理设计契约文本做数字后端的人迟早会撞上一个时刻布局布线工具报出一条 LEF 语法错误或者导出的 DEF 被另一个工具拒收日志里只丢下一个行号和一个 token。论坛上搜不到因为 LEF 和 DEF 是 EDA 工具之间交换工艺与版图信息的底层契约语法细节只写在这类几百页的语言参考里。5.8 版手册就是干这个用的——它不是教程而是一本在报错时按关键字反查的字典覆盖 LEF 的层、宏、通孔定义DEF 的组件、网络、布线描述以及增量读入、错误检查、天线效应这些容易被忽略的角落。适合正在搭库、换工艺、接第三方 IP 的后端工程师也适合要写解析脚本的 CAD 人员。下面按「先看懂结构、再动手校验、最后避开坑」的顺序拆。2. LEF 语法从 VERSION 到 MACRO一份库文件是怎么被读进来的2.1 四段式结构与不可打乱的语句顺序LEF 的顶层结构是固定的VERSION 打头END LIBRARY 收尾中间按「单位与全局规则、层、通孔与通孔规则、站点、宏、属性定义」的顺序排列。手册里专门有一节 Order of LEF Statements明确说解析器不保证对乱序语句做容错。一个最小的骨架长这样VERSION 5.8 ; BUSBITCHARS [] ; DIVIDERCHAR / ; UNITS DATABASE MICRONS 1000 ; END UNITS MANUFACTURINGGRID 0.005 ; LAYER M1 TYPE ROUTING ; ... END M1 SITE core CLASS CORE ; SIZE 0.46 BY 2.72 ; END core MACRO INVX1 CLASS CORE ; ... END INVX1 END LIBRARY参数说明DATABASE MICRONS 1000表示数据库单位是 1/1000 微米后面所有坐标和尺寸都按这个整数单位书写MANUFACTURINGGRID是所有几何必须落到的制造网格SITE是标准单元的行高与宽度基准MACRO 里的SITE core必须引用已经定义过的名字。顺序一旦颠倒轻则警告重则整段 MACRO 被跳过——这是我见过最常见的「工具说库是空的」原因。提示LEF 和 DEF 的单位声明要成对检查单看一份文件永远看不出问题。2.2 Layer 定义CUT、ROUTING、IMPLANT 三类的写法差异LEF 里的 LAYER 按 TYPE 分家各自支持的属性完全不同混写会直接报语法错。TYPE典型用途关键属性ROUTING金属走线层DIRECTION、PITCH、WIDTH、SPACING、OFFSET、AREA、THICKNESS、HEIGHT、RESISTANCE、CAPACITANCE、SPACINGTABLE、ENCLOSURECUT通孔层WIDTH、SPACING、ENCLOSURE、AREA、RESISTANCEIMPLANT注入层WIDTH、SPACING 及对应的工艺规则MASTERSLICE / OVERLAP阱、覆盖层一般只写 TYPE 和少量几何约束ROUTING 层里最容易被写错的是DIRECTION与PITCH的配合。PITCH 是相邻两条走线中心线的距离工具拿它生成 Track如果 PITCH 小于 WIDTH SPACING布线器要么报「无合法轨道」要么悄悄把线宽降下去到 DRC 阶段才炸。LAYER M2 TYPE ROUTING ; DIRECTION VERTICAL ; PITCH 0.14 ; WIDTH 0.07 ; SPACING 0.07 ; OFFSET 0.035 ; HEIGHT 0.8 ; THICKNESS 0.14 ; RESISTANCE RPERSQ 0.12 ; CAPACITANCE CPERSQDIST 0.0001 ; EDGECAPACITANCE 0.00005 ; END M2这里的OFFSET是第一条轨道相对原点的偏移它决定了 Track 网格的相位。工艺厂给的数字经常是 PITCH 0.14、WIDTH 0.07、SPACING 0.07三者刚好凑成 pitch width spacing这是最理想的情况一旦厂里给的是 PITCH 0.15就必须靠OFFSET或者非默认规则去补那 0.01 的余量否则一半的轨道放不下最小线宽。CUT 层则要重点看ENCLOSURE它描述上下层金属对通孔的包裹量。很多 DRC 报 via enclosure根因不在布线器而在 LEF 里 ENCLOSURE 写的是ABOVE还是BELOW、数值按单边还是双边算。2.3 MACRO 与 PIN单元抽象视图的边界MACRO 是标准单元、IP 核在 LEF 里的替身工具只认这个替身不认版图文件。一个 MACRO 至少要有 CLASS、SIZE、SITE、PIN 和 OBS。MACRO INVX1 CLASS CORE ; ORIGIN 0 0 ; SIZE 0.46 BY 2.72 ; SYMMETRY X Y ; SITE core ; PIN A DIRECTION INPUT ; USE SIGNAL ; PORT LAYER M1 ; RECT -0.1 0.2 0.1 0.4 ; END END A PIN Y DIRECTION OUTPUT ; USE SIGNAL ; PORT LAYER M1 ; RECT 0.2 0.2 0.4 0.4 ; END END Y OBS LAYER M1 ; RECT 0 0 0.46 0.2 ; END END INVX1CLASS CORE告诉工具这是标准单元可以进 ROWCLASS BLOCK是硬宏会被当成障碍物整体摆放CLASS PAD是 IO。SYMMETRY X Y决定单元能不能镜像翻转如果漏写优化阶段工具就少了一半摆放自由度代价直接体现在时序上。OBS段是布线禁区写少了会短路写多了会浪费可布资源这一段的取舍通常要拿版图和 DRC 结果反推。PIN 里的PORT可以有多段LAYER后面跟RECT、POLYGON或VIA。如果 PIN 的几何跨了多层要按层分别写 PORT不能把不同层的 RECT 塞进同一个 PORT。2.4 用脚本给 LEF 做第一轮体检拿到一份新 LEF我一般不会先往工具里灌而是先跑一遍结构体检语句顺序、单位、层数、宏数、每个 MACRO 是否缺 OBS 或 PIN。import re def lef_health(path): text open(path, encodingutf-8, errorsignore).read() # 去掉两类注释避免注释里的关键字被误统计 text re.sub(r/\*.*?\*/, , text, flagsre.S) text re.sub(r//[^\n]*, , text) stats {} stats[version] re.findall(rVERSION\s([\d.])\s*;, text) stats[db_microns] re.findall(rDATABASE\sMICRONS\s(\d)\s*;, text) stats[layers] re.findall(r^\s*LAYER\s(\S), text, flagsre.M) stats[macros] re.findall(r^\s*MACRO\s(\S), text, flagsre.M) stats[vias] re.findall(r^\s*VIA\s(\S), text, flagsre.M) stats[sites] re.findall(r^\s*SITE\s(\S), text, flagsre.M) # 按 MACRO 切块逐块检查关键段是否齐全 missing [] for block in re.split(r^\s*MACRO\s, text, flagsre.M)[1:]: name block.split()[0] has_pin PIN in block has_obs OBS in block if not (has_pin and has_obs): missing.append((name, has_pin, has_obs)) return stats, missing if __name__ __main__: s, m lef_health(library.lef) print(VERSION:, s[version]) print(DB unit:, s[db_microns]) print(layers:, len(s[layers]), macros:, len(s[macros])) print(缺 PIN/OBS 的宏:, m[:10])逻辑说明先用正则剥掉两类注释避免注释里的关键字被误统计然后分别抓 VERSION、单位、层、宏、通孔、站点最后按MACRO切块逐块检查 PIN 与 OBS 是否存在。参数方面DATABASE MICRONS抓不到就说明单位段缺失或者写成了别的形式这时不要继续往下走因为后面所有坐标的解读都会错位。这个脚本只能挡住结构性问题几何合法性仍然要靠工具自带的 LEF 检查器两者是互补关系。3. DEF 语法组件、网络与布线的书写顺序决定工具能不能吃进去3.1 强制顺序与 VERSION 声明DEF 的语句顺序比 LEF 更严格手册的 Order of DEF Statements 一节给出了完整序列VERSION、DIVIDERCHAR、BUSBITCHARS、DESIGN、TECHNOLOGY、UNITS、HISTORY、PROPERTYDEFINITIONS、DIEAREA、ROW、TRACKS、GCellGRID、VIAS、NONDEFAULTRULES、REGIONS、COMPONENTS、PINS、PINPROPERTIES、BLOCKAGES、SLOTS、FILLS、SPECIALNETS、NETS、SCANCHAINS、GROUPS、STYLES最后 END DESIGN。一个刚够工具读进去的骨架VERSION 5.8 ; DIVIDERCHAR / ; BUSBITCHARS [] ; DESIGN top ; UNITS DISTANCE MICRONS 1000 ; DIEAREA ( 0 0 ) ( 200000 200000 ) ; ROW ROW_0 core 0 0 N DO 400 BY 1 STEP 460 0 ; COMPONENTS 2 ; - u1 INVX1 PLACED ( 1000 2000 ) N ; - u2 INVX1 PLACED ( 3000 2000 ) FS ; END COMPONENTS NETS 1 ; - n1 ( u1 Y ) ( u2 A ) ROUTED M1 ( 1200 2100 ) ( 2800 2100 ) ; END NETS END DESIGNUNITS DISTANCE MICRONS 1000必须和 LEF 的DATABASE MICRONS对齐一边 1000 一边 2000工具不会报错但所有坐标会整体缩一半这种错最难查。ROW里的DO 400 BY 1 STEP 460 0表示沿 X 方向重复 400 次、每次步进 460 个数据库单位也就是标准单元的宽度。3.2 COMPONENTS 与 PINS坐标、朝向与放置状态COMPONENTS 段描述每个实例的模型名、位置、朝向和放置状态。放置状态有 PLACED、FIXED、COVER、UNPLACED 四种差别直接决定优化阶段能不能动它。状态含义典型场景PLACED已放置优化可移动常规标准单元FIXED固定不可移动硬宏、IO、手工约束的单元COVER覆盖可移动但优先保持特殊布局UNPLACED未放置网表刚导入朝向用 N、S、E、W、FN、FS、FE、FW 表示本质是「是否镜像加旋转」。如果 LEF 的 MACRO 没写SYMMETRYDEF 里却给了 FS工具可能直接报非法朝向——这也是库和设计对不上的典型症状。PINS 段描述顶层端口PINS 1 ; - clk NET clk DIRECTION INPUT USE SIGNAL LAYER M3 ( -100 -100 ) ( 100 100 ) PLACED ( 50000 0 ) N ; END PINSDIRECTION决定端口方向USE可以是 SIGNAL、POWER、GROUND、CLOCK、ANALOGLAYER后面跟矩形坐标PLACED给位置。PINS 必须出现在 COMPONENTS 之后、NETS 之前本文还有配套的精品资源点击获取