简介:面向集成电路后端与物理设计从业者的 LEF/DEF 5.8 官方语言参考手册,聚焦 Cadence Library Exchange Format 与 Design Exchange Format 两套 IC 描述语言的语法要素与用法规范,适合已具备一定版图、布局布线基础,需要查阅格式细节或搭建 EDA 流程的工程师与研究者。压缩包共 1 个 PDF 文件,约 2.48MB,单册完整收录手册正文,便于本地检索与离线查阅。该资源已有 2177 人学习。内容层面,LEF 部分覆盖工艺层定义、单元模型几何与尺寸、层间间距规则、填充与隔离区域以及复杂 IP 的宏抽象视图;DEF 部分则围绕模块布局与方向、信号与电源网络连接、DRC/LVS/ERC 约束设置、物理分区与电源地平面等属性展开,并说明两套格式在工具间交换设计信息时如何保证一致性。手册还交代了 5.8 版本在约束管理、物理描述精度与先进工艺节点支持上的变化,可当作查错对照与流程对接时的案头参考。
1. 一句话说清 LEF 和 DEF:芯片设计里的两份说明书
装修一套房子,你会拿到两类图纸。一类是建材和家具的规格书:这块板材多厚、这个插座开孔多大、这排柜子占地几乘几——它不关心你家房子怎么布局,只描述「能用的东西长什么样」。另一类是施工图:沙发摆在哪、水管从哪走、哪面墙不能动。
芯片设计里的 LEF 和 DEF 就是这两类图纸。LEF 描述「工艺和单元库的客观规格」——金属层多宽、间距多少、一个反相器占多大地方、引脚在哪;DEF 描述「某一版设计的具体现场」——这个反相器摆在哪、线怎么连、哪块区域不能碰。
两者都是纯文本,都能被不同工具读写,是物理设计环节里事实上的交接语言。搞不清它们的边界,看工具报错就只能靠猜,而这类报错往往一句话带过,信息量约等于零。
2. LEF 到底定义了什么:工艺规则和单元模型的共同语言
2.1 为什么需要 LEF:让工具在不懂工艺细节时也能干活
完整的工艺细节是晶圆厂的核心资产,一套原始文件动辄几个 G,还带保密条款。布局布线工具不可能每次都去读它,也不被允许读。所以就出现了 LEF 这层抽象:只把「排布需要的部分」抽出来,做成一份轻量、可传播的文本。
打个比方,你请师傅来装柜子,不需要给他整本木材学教材,只要一张板材规格表加几个五金件的孔位图就够了。LEF 就是那张规格表:它不解释电子迁移为什么发生,只告诉你「这条线最窄只能 0.07 微米,两条线边到边至少留 0.07 微米」。
这个抽象带来一个副作用,也是它最大的价值:同一份 LEF 可以服务很多个设计。一个工艺节点下所有项目共用一套 LEF,工具之间、项目之间、甚至同一批流片的不同版本之间,只要 LEF 一致,摆放和布线的几何前提就一致。
血泪经验:很多人以为 LEF 是「某个项目的文件」,其实它更像「某个工艺加某个库的公共契约」。项目可以换,LEF 通常不动,一改动就会波及所有下游环节。
2.2 工艺层的信息:Routing、Cut、Implant、Masterslice
LEF 里最占篇幅的部分是 Layer。按用途分成四种:
- Layer (Routing):布线层,也就是金属层。它决定信号线能走多宽、默认往哪个方向走、相邻线要隔多远。
- Layer (Cut):切割层,也就是通孔层。它描述上下两层金属之间怎么打通。
- Layer (Implant):注入层,用于器件注入区,一般和标准单元的电气特性相关。
- Layer (Masterslice or Overlap):主切片层或重叠层,常见于一些特殊工艺。
每个 routing 层有一组必填属性:TYPE 说明这是布线层,DIRECTION 说明默认走线方向是水平还是垂直,PITCH 是走线轨道的重复间距,WIDTH 是默认线宽,SPACING 是最小边到边间距。
这三个数值有个隐含关系:PITCH 至少要大于等于 WIDTH + SPACING,否则轨道本身就违反了间距规则。这是个很典型的翻车点——工艺文件里 PITCH 写小了,工具在布线阶段会不断报 spacing violation,但你怎么查 SPACING 都没错,问题出在 PITCH 和 WIDTH 的组合上。
层的电气属性也会写进去:RESISTANCE、CAPACITANCE、THICKNESS、AREA。这些主要用于工具内部做粗略的延时估算,不做精确签核。所以别指望拿 LEF 里的电阻值去对齐最终时序报告,那是两个精度层级的东西。
还有一类容易忽略的语句:Nondefault Rule。默认规则管「普通线」,非默认规则管「宽线、特殊线、双倍间距线」。比如一条两倍宽度的电源走线,它的间距要求不是简单的线性放大,而是单独写一张 SPACINGTABLE,线宽超过某个阈值,间距直接跳到下一档。
注意:Nondefault Rule 的名字会和 DEF 里的 NONDEFAULTRULE 语句对应,两边写不一致,工具会忽略或者报错,而且提示往往只指向行号,不指向文件名。
2.3 单元与宏模型:SITE、MACRO、PIN、OBS
工艺层之上是「东西」。LEF 里描述单元用的是一组嵌套语句。
SITE 是行的模板。想象一个停车场,地上画好了一排车位,每个位子宽 0.4 微米、高 2.4 微米,这就是 SITE 的 SIZE。CLASS CORE 表示这是标准单元用的位子,其他还有 CLASS PAD 之类的类型。
MACRO 是停在车位上的车。它用 ORIGIN 和 SIZE 给出自己的外廓,再加上 SITE 说明自己占几个位子。CLASS 属性区分它是什么类型:CORE 是标准单元,BLOCK 是宏块(存储器、IP 核这类),PAD 是焊盘,SPACER 是填充单元,ENDCAP 是边界单元,RING 是环状结构。
PIN 是车门。它告诉你「从这个位置可以接入信号」,用 PORT 加 LAYER 加 RECT 给出可连接的金属形状。引脚方向(INPUT / OUTPUT / INOUT)也会写上,有些还会带上 USE 属性说明是信号还是电源。
OBS 是不能碰的地方。有些宏块内部有大片不能布线的区域,用 OBS 声明出来,工具自动绕开,不用人再手动画禁区。
打个比方:SITE 是车位线,MACRO 是车身轮廓,PIN 是车门把手,OBS 是「此处禁止停车」的黄色网格。四者合起来,工具不需要知道车里装了什么发动机,也能把它停进正确的位置。
这里体现的正是 LEF 的核心思想:只描述外形和接口,不描述内部结构。一个 32 位乘法器在 LEF 里可能就是一个 20×40 微米的方块加几十个引脚,至于里面有几万门、怎么连的,工具不关心,因为那是网表该回答的问题。
2.4 一份 LEF 长什么样:关键语句拆开看
看一段最小化的 LEF 片段:
# 一个最小 LEF 骨架:版本、单位、层、站点、宏 VERSION 5.8 ; # 数据库单位:1 个数据库单位 = 1/1000 微米 UNITS DATABASE MICRONS 1000 ; END UNITS # 第一层金属:水平方向,轨道间距 0.14 微米,线宽与间距都是 0.07 LAYER M1 TYPE ROUTING ; DIRECTION HORIZONTAL ; PITCH 0.14 ; WIDTH 0.07 ; SPACING 0.07 ; END M1 # 标准单元行的模板:宽 0.4 微米,高 2.4 微米 SITE core_site CLASS CORE ; SIZE 0.4 BY 2.4 ; END core_site # 一个反相器单元:外廓 1.2×2.4,占三个站点宽 MACRO INV_X1 CLASS CORE ; ORIGIN 0 0 ; SIZE 1.2 BY 2.4 ; SITE core_site ; PIN A DIRECTION INPUT ; PORT LAYER M1 ; RECT 0.1 0.6 0.3 0.9 ; END END A END INV_X1 END LIBRARY逐段说明。
VERSION 5.8 是语言版本号,工具会拿它判断按哪套规则解析。写错版本,后面的语句可能直接被当成非法,报出的错误却指向看似无关的行。
UNITS DATABASE MICRONS 1000 最容易翻车。它定义「1 个数据库单位 = 1/1000 微米」,所以文件里所有坐标理论上都是整数。上面示例里写的 WIDTH 0.07 是小数形式,按整数单位写就是 70。有些工具接受小数,有些只认整数,混用会出现「整体尺寸差 1000 倍」的经典事故,而且往往要到布局阶段才暴露。
LAYER 里的 PITCH 0.14 意味着相邻两条线的中心距离是 0.14,而 WIDTH 0.07、SPACING 0.07 正好凑成 0.14,说明这是理想情况下的最密排布。三个数任何两个改动,第三个都得跟着改,否则规则自相矛盾。
SITE 的 SIZE 0.4 BY 2.4 是行高的来源。DEF 里的 ROW 语句会引用这个 SITE 名字,两边名字对不上,布局工具就找不到行,报出来的错是「no site defined」,但实际原因在 LEF 里名字拼错了。
MACRO 的 SIZE 1.2 BY 2.4 说明这个单元宽是站点的三倍。工具摆放时按站点网格对齐,不会出现停在半个车位上的情况。ORIGIN 0 0 定义了它自己的坐标原点,所有内部几何都相对这个点计算。
PIN A 下的 RECT 是矩形坐标,格式是左下 x、左下 y、右上 x、右上 y。这个矩形必须落在 MACRO 的边界内,超出边界工具会认为引脚不可达,布线阶段直接连不上。
END LIBRARY 是整份文件的结束标记。语法上允许一个文件里放多个库,但实际操作里通常一个文件一个库,省得工具搞混。
提示:LEF 的注释用 # 开头,语句之间用分号结束,续行不需要特殊符号。少一个分号,后面整段都可能解析失败,而报错行号有时会指到很远的地方。
3. DEF 到底描述了什么:一版设计的物理现场记录
3.1 为什么需要 DEF:设计要在工具之间接力
LEF 是静态的,一份用很多年。DEF 是动态的,一版设计一个文件,改一次布局就可能生成一个新 DEF。
为什么需要它?因为物理设计是一条接力链:综合工具吐出网表,布局工具把它变成有坐标的摆放,布线工具接上连线,签核工具再拿去核对。每一棒交接,都需要一份「对方能读懂的现场记录」。
打个比方:LEF 是积木的零件规格表,告诉你每块砖多宽多高、凸点在哪;DEF 是已经拼到一半的说明书,告诉你第 37 步那块红砖已经放在坐标 (12, 8),朝北。前者描述可能性,后者描述现状。
黑匣子问题就出在这:如果 DEF 里少了某个属性,下一个工具不会提醒「你少写了东西」,而是默默按默认值处理,最后结果对不上,你回头查每一个工具都说自己没错。这种问题没有后悔药,只能靠事前的格式检查。
3.2 DEF 的骨干语句:DIEAREA、ROW、COMPONENTS、NETS
DEF 有一套强制的语句顺序。大致是:版本和字符约定 → 设计名 → 单位 → 芯片边界 → 行和轨道 → 元件 → 引脚 → 网络 → 结束。
DIEAREA 给出芯片的物理边界,格式是左下坐标和右上坐标两个点对。所有元件都必须落在这个矩形里,超出去工具会直接拒绝。
ROW 定义标准单元行。它引用 LEF 里的 SITE 名字,给出起始坐标、朝向、重复次数和步进。一行行画好,标准单元才有地方站。
TRACKS 定义走线轨道。它告诉布线器「线只能在这些网格线上走」,是布线网格化的基础。轨道间距和 LEF 里的 PITCH 不一定要相等,DEF 里可以定义得比 LEF 更宽松或更密。
COMPONENTS 是元件清单。每个条目形如「实例名 单元名 + 状态 坐标 朝向」。状态可以是 PLACED(已摆放)、FIXED(固定不可动)、UNPLACED(未摆放)、COVER(覆盖)。FIXED 和 PLACED 的区别很关键:FIXED 的元件工具绝对不会动,PLACED 的还能被优化器挪走。
NETS 是信号网络。每个网络列出它连接的所有引脚,格式是「( 实例名 引脚名 )」。括号顺序有讲究,先写实例和引脚,后写端口,端口要加 PIN 前缀。
SPECIALNETS 是特殊网络,主要给电源和地。它和 NETS 语法类似,但会带上更宽的线宽、更多的过孔定义,还可以有 SHIELD 之类的高级属性。
PINS 是芯片对外的接口。它和 LEF 里的 PIN 不是一回事:LEF 的 PIN 是单元自己的引脚,DEF 的 PINS 是整个芯片的输入输出端口,是顶层封装要对接的部分。
3.3 约束与结构信息:BLOCKAGES、REGIONS、GROUPS、GCellGrid
除了「东西在哪」,DEF 还承载了大量约束。
BLOCKAGES 声明禁止区域。它可以是禁止布线、禁止摆放,或者两者都禁。做模拟 IP 隔离、电源环保护时会用到,写法和图形描述类似。
REGIONS 把一组实例圈进某个矩形范围,常用于约束某个模块只能摆在芯片的某个角落,方便后续的电源规划。
GROUPS 是逻辑分组,方便工具按组处理,比如让某个子模块整体移动。
GCellGrid 是全局布线的单元格网格,定义了全局布线阶段的基本粒度。调这个值会影响全局布线的运行时间和结果质量。
SCANCHAINS 描述扫描链的串联顺序。测试相关的信息也放在 DEF 里,这点很多人不知道,所以看到扫描链相关的异常会先去查测试文件,其实答案在 DEF。
SLOTS 和 FILLS 描述填充。填充单元、填充金属都归这里管。
STYLES 定义布线风格,比如某条网络允许走几层、优先级多高。做高速信号或者敏感模拟线时,会靠它约束走线行为。
打个比方,DEF 不只是一张「已摆放清单」,它更像一份施工交底记录:东西在哪、哪些地方不能动、哪些线要走特殊通道、测试链怎么串。
3.4 一个 DEF 片段怎么读
# 最小 DEF 骨架:版本与分隔符、设计名、单位、边界、行、轨道、元件、网络 VERSION 5.8 ; DIVIDERCHAR "/" ; BUSBITCHARS "[]" ; DESIGN top_demo ; # 距离单位:1 个数据库单位 = 1/1000 微米 UNITS DISTANCE MICRONS 1000 ; # 芯片边界:左下 (0,0),右上 (24000,24000),即 24×24 微米 DIEAREA ( 0 0 ) ( 24000 24000 ) ; # 一行标准单元位:起点 (0,0),朝北,共 60 个站点,步进 400 ROW ROW_0 core_site 0 0 N DO 60 BY 1 STEP 400 0 ; # 走线轨道:X 方向 120 条,步进 200,位于 M1 层 TRACKS X 0 DO 120 STEP 200 LAYER M1 ; TRACKS Y 0 DO 120 STEP 200 LAYER M1 ; # 元件清单:声明 1 个,实际必须写满 1 个 COMPONENTS 1 ; - U1 INV_X1 + PLACED ( 4000 4000 ) N ; END COMPONENTS # 信号网络:net_a 连接 U1 的 A 引脚和芯片端口 clk NETS 1 ; - net_a ( U1 A ) ( PIN clk ) ; END NETS END DESIGN逐行说明。
VERSION 5.8 和 LEF 一样,是语言版本。工具靠它决定解析规则。
DIVIDERCHAR 和 BUSBITCHARS 定义名字里的层级分隔符和总线括号。这两个字符一旦和网表里的写法不一致,网络名就会对不上,连出来的结果全是断线,而且工具通常不会报「名字不匹配」,只会报「网络未连接」。
DESIGN top_demo 是设计名。它应该和网表里的顶层模块名一致,否则工具可能认不出这是同一个设计,后面做对比时会莫名其妙多出一个设计。
UNITS DISTANCE MICRONS 1000 是 DEF 的距离单位。和 LEF 的 DATABASE MICRONS 必须一致,不然同一个坐标在两份文件里代表不同尺寸。这是最隐蔽的翻车点之一,因为两份文件各自都能正常解析,合在一起才发现尺寸错位。
DIEAREA 的两个坐标对,第一个是左下,第二个是右上。所有 ROW 和元件都得待在里头。
ROW 语句里的 DO 60 BY 1 STEP 400 0 意思是「重复 60 次,行方向重复 1 次,每次步进 x+400、y+0」。400 正好等于 SITE 宽度 0.4 微米乘 1000,和单位对得上,说明这份 DEF 是按 LEF 的站点尺寸算出来的。
TRACKS 里的 DO 120 STEP 200 是轨道数量和间距,200 对应 0.2 微米,比 LEF 里的 PITCH 0.14 大,说明这份 DEF 用的是更宽松的布线网格。
COMPONENTS 后面那个数字是元件数量,必须和实际条目数严格一致。多一个少一个,解析器直接报错。这是初学者最常踩的坑:手工删了一行忘了改数字。
NETS 里的括号顺序有讲究,先写实例和引脚,
本文还有配套的精品资源,点击获取