☰
LEF/DEF与EDA布局布线数据模型:芯片流片关键语法解析
2026/10/31 12:16:29 网站建设 项目流程

简介:《LEF/DEF 5.8 Language Reference》面向集成电路物理设计、布局布线及EDA工具开发人员,是一份由Cadence发布的LEF/DEF 5.8语言参考手册,可用于理解工艺技术、单元库与设计实现信息如何在工具间交换。手册系统梳理LEF的层定义、单元模型、间距规则、填充与隔离区域、宏模型,以及DEF的模块布局、网络连接、约束设置、物理分区与物理属性等内容,并涉及5.8版在约束管理和先进工艺节点支持方面的说明,适合在物理综合、布局规划、设计规则检查、跨工具数据交换与流片前验证时查阅。包内共1个PDF文件,压缩包约2.48MB,内容按语言元素组织,便于按主题定位语法与语义。已有2177人学习,适合IC设计工程师、EDA工具开发者及相关专业学生作为案头参考资料。

1. LEF/DEF:一份纯文本为什么能决定芯片能不能流片

把一颗芯片的物理实现过程拆开看,真正在 EDA 工具链之间流转的,往往不是某个私有数据库,而是两份纯文本:LEF 和 DEF。5.8 版的语言参考厚得离谱,却几乎没有一句废话——它规定的核心问题,是「工具能看见什么」,而不是「文件该怎么写」。反直觉的地方在于:布局布线工具根本不理解电路,它只理解 LEF 描述的「这层金属能走多宽、间距多少」,和 DEF 描述的「某个单元已经被固定在哪个坐标上」。搞懂这两套语法,等于拿到了工具内部数据模型的说明书。

2. LEF 的三层抽象:工艺、站点、宏单元是怎么被拆开的

LEF 描述的是「这个世界允许你造什么」。它不关心具体设计,只描述制造能力和可用的积木。麻烦在于,「允许造什么」这件事同时包含三个尺度差别极大的东西:纳米级的金属层规则、微米级的单元外框、以及介于两者之间的放置网格。LEF 用三组完全不同的语句把它们分开,这个拆分方式决定了后续所有工具的行为。

2.1 为什么 LEF 一定要把工艺和单元模型分开

同一份工艺文件会被同一个工艺节点下的几十个库共享,而每个库的版本节奏完全独立。如果混在一个文件里,改一个单元的引脚形状就要重新发布整份工艺描述,版本校验会失控。所以实践中的 LEF 通常切成两半:technology LEF 只含LAYER、VIA、VIARULE、NONDEFAULTRULE、UNITS、MANUFACTURINGGRID;macro LEF 只含SITE和MACRO。

这种切分带来一个隐含约束:如果一个文件同时包含两部分,LAYER必须出现在MACRO之前,因为MACRO里的PORT要按名字引用层。这和后面要讲的 DEF 语句顺序是同一类问题——不是风格建议,是解析器的状态机要求。

5.8 在这一块加了两个值得注意的能力。一个是LIBRARY语句,允许单个文件里封装多个库,每个库带自己的UNITS、SITE和MACRO,多库合并交付时不用再拼文件。另一个是ALIAS,给长字符串起别名,本质是把「重复写一长串层名或规则名」的体力活压缩成一次定义。还有增量 LEF 的概念:只重新加载变更部分,代价是工具必须维护一份跨次读入的一致性状态。

2.2 LAYER 语句:ROUTING、CUT、MASTERSLICE 的语义差别

TYPE是LAYER里最关键的一个词,它决定了这层在工具眼里是什么角色。

ROUTING是可布线金属层,必须给出DIRECTION、PITCH、WIDTH、SPACING。布线器按PITCH在这层生成等距的 track 阵列,DIRECTION决定首选走向,相邻层一般正交,目的是让通孔落在两层 track 的交叉点上。如果PITCH小于WIDTH + SPACING,工具要么直接报错,要么强行压缩 track 数量,结果就是「规则明明满足却布不通」——这类问题查起来极其麻烦,因为 DRC 是干净的。

CUT是通孔层,只有WIDTH、SPACING、ENCLOSURE这类参数,它不参与路径搜索,只被VIA和VIARULE引用。MASTERSLICE是不可布线的栅极层,用来描述单元内部的多晶硅形状,工具拿它算寄生,但不会往上走线。IMPLANT更边缘,只在参数提取和部分规则检查里出现。

VERSION 5.8 ; BUSBITCHARS "[]" ; DIVIDERCHAR "/" ; UNITS DATABASE MICRONS 1000 ; END UNITS MANUFACTURINGGRID 0.001 ; LAYER M1 TYPE ROUTING ; DIRECTION HORIZONTAL ; PITCH 0.14 ; # 布线器据此生成 track,必须 >= WIDTH + SPACING WIDTH 0.07 ; # 默认线宽 SPACING 0.07 ; # 默认同层间距 AREA 0.014 ; # 最小面积,防止短线在 CMP 后断开 THICKNESS 0.14 ; HEIGHT 0.35 ; # 用于寄生提取的层高 RESISTANCE RPERSQ 0.12 ; # 方块电阻,单位 ohm/sq CAPACITANCE CPERSQDIST 1.2e-4 ; END M1

AREA这一项容易被当成可选,实际上它是制造侧的硬要求:一条又短又细的金属在化学机械抛光后可能被磨断,所以规则要求最小面积。RESISTANCE RPERSQ和CAPACITANCE CPERSQDIST是时序提取的输入,量纲写错(比如把RPERSQ写成整层电阻)不会报错,只会让后续的 RC 估算整体偏移,属于典型的默默产生错误结果。

UNITS和MANUFACTURINGGRID是两份文件能不能对齐的前提。LEF 里所有坐标都是整数,单位是「数据库单位」,DATABASE MICRONS 1000表示 1 微米等于 1000 个 DBU。MANUFACTURINGGRID 0.001表示所有几何必须落在这个格点上。用整数不用浮点,是因为千万级坐标下浮点累加会产生漂移,最后表现为「坐标莫名其妙不在 track 上」这种无法解释的问题。

注意:MANUFACTURINGGRID与DATABASE MICRONS不整除时,工具取整方向不同会导致同一份数据在两个工具里差 1 个 DBU。

2.3 MACRO 与 PIN/PORT:端口形状如何决定布线接入点

MACRO是 LEF 里信息密度最高的段落。它只描述外框、引脚、阻挡,不描述内部晶体管——这是刻意的信息隐藏:库供应商不愿暴露版图细节,同时工具也扛不住百万实例的完整版图。布线器拿到的抽象就三样:SIZE决定占位,PORT决定能从哪里接入,OBS决定哪些区域不能碰。

SITE unit CLASS CORE ; SIZE 0.28 BY 1.4 ; END unit MACRO NAND2X1 CLASS CORE ; ORIGIN 0 0 ; SIZE 1.12 BY 1.4 ; SYMMETRY X Y ; SITE unit ; PIN A DIRECTION INPUT ; USE SIGNAL ; ANTENNAGATEAREA 0.0420 ; # 栅氧面积,天线比的分母 PORT LAYER M1 ; RECT 0.14 0.28 0.28 0.42 ; END END A OBS LAYER M1 ; RECT 0 0 1.12 0.14 ; END END NAND2X1

SITE是放置网格的定义,SIZE给出一个站点的宽高。MACRO的SIZE必须是SITE宽度的整数倍,否则布局时行内会出现重叠或缝隙。SYMMETRY X Y声明这个单元可以沿 X 或 Y 轴镜像翻转,布局器翻转它能省面积;但翻转后PORT坐标要跟着镜像,如果SYMMETRY漏声明而工具又强行翻转,pin 位置就会算错,布线阶段表现为「端口悬空」。

PORT里可以出现多个LAYER段,描述同一个引脚在不同工艺层上的形状;也可以是POLYGON或PATH,不限于矩形。形状越碎,布线器计算 pin access point 越费劲。实践中常见的翻车是:DRC 全过,但详细布线报 pin access 失败——原因往往是PORT太窄或者被OBS包围得太紧,工具找不到合法的接入点。

OBS只写「不能走线」,不写内部金属的用途。漏写一段OBS,布线器就会把信号线走在单元内部的电源轨上,问题要到 DRC 阶段才暴露出来,那时候已经很难定位到是 LEF 的问题。

3. DEF 的设计态语义:从 DIEAREA 到 SPECIALNETS 怎么还原一个设计

DEF 描述的是「这个设计现在是什么样」。和 LEF 不同,它描述的是某一时刻的快照,所以带状态、带坐标、带连接关系。它最反直觉的一点是:语句顺序是硬约束,写错顺序不是风格问题,是直接读不进去。

3.1 语句顺序为什么是硬约束

DEF 的解析器几乎都是单遍、无回溯的流式解析。这意味着读到NETS的时候,它必须已经知道所有实例名和引脚名,否则没法解析( u_core A )这种引用。所以顺序被固定成一张依赖表:

语句依赖的前置语句原因
UNITS无后续所有坐标的换算基准
DIEAREAUNITS坐标需要单位解释
ROWUNITS、SITE(来自 LEF)行宽必须对齐站点
COMPONENTSROW可省略但通常在前实例位置依赖行定义
PINSCOMPONENTS可省略引脚引用网络名
SPECIALNETSPINS电源引脚要先声明
NETSCOMPONENTS、PINS引用实例与引脚

这套顺序带来的直接后果是:手工拼接两个 DEF,或者用脚本按字母序重排段落,几乎必然失败。合并 DEF 的正确做法是按参考文档的顺序表重建,而不是简单拼接。

3.2 COMPONENTS 的放置状态位:PLACED、FIXED、COVER、UNPLACED

COMPONENTS段每个实例后面跟一个状态词,这个状态词的本质不是「位置」,而是「权限」——声明谁有权改这个坐标。

状态语义谁可以移动典型用途
PLACED已放置,位置可优化布局、优化工具普通标准单元
FIXED位置固定,不可移动无人(布线可绕)宏单元、IP、预布局模块
COVER物理单元,占面积不参与逻辑可被覆盖填充、去耦、天线二极管
UNPLACED只有实例,没有坐标布局工具布局前的初始网表

为什么用状态位而不是配置文件?因为一份 DEF 会被布局、时钟树、布线、时序、DRC 五六个工具依次读入,每个工具都想「我最懂这个坐标该在哪」。用状态位划权,比给每个工具配一套忽略列表更不容易丢。COVER的存在尤其说明问题:物理单元占面积但没有逻辑功能,工具必须知道「它可以被别的单元压过去」,否则面积永远收不回来。

DEF 5.8 还引入了COMPONENTMASKSHIFT,允许对单个实例按层指定掩模偏移。这是多重曝光工艺下的现实需求:同一个单元放在不同位置,可能需要用不同的掩模组合,光靠单元级定义表达不了。

3.3 NETS 与 SPECIALNETS:信号网和电源网为什么必须分开

这两段在语法上就有明显差异。SPECIALNETS支持+ USE POWER/GROUND、+ SHAPE STRIPE/RING/FOLLOWPIN、+ WIDTH,走的是宽线或条带,通常由电源规划阶段生成,之后基本固定。NETS走信号,用+ ROUTED或+ FIXED加层与坐标描述。

分开的理由有四条。第一,算法不同:电源网是网格规划问题,信号网是详细布线问题,工具内部的数据结构都不一样。第二,时序工具不需要电源网,混在一起只会增加无关数据。第三,增量流程里改电源规划只需重读SPECIALNETS,不用动信号网。第四,语法能力不同,SPECIALNETS有SHAPE和PATTERN,NETS没有对应表达。

VERSION 5.8 ; DIVIDERCHAR "/" ; BUSBITCHARS "[]" ; DESIGN top_core ; UNITS DISTANCE MICRONS 1000 ; DIEAREA ( 0 0 ) ( 240000 180000 ) ; ROW ROW_1 unit 0 0 N DO 857 BY 1 STEP 280 0 ; COMPONENTS 2 ; - u_core NAND2X1 + PLACED ( 14000 1400 ) N ; - u_keep NAND2X1 + FIXED ( 28000 1400 ) N ; END COMPONENTS PINS 1 ; - clk + NET clk + DIRECTION INPUT + USE CLOCK + PORT + LAYER M2 ( -70 -70 ) ( 70 70 ) + PLACED ( 0 7000 ) N ; END PINS NETS 1 ; - clk ( u_core A ) ( PIN clk ) ; END NETS END DESIGN

这段里每个数字都是整数 DBU。ROW的DO 857 BY 1 STEP 280 0表示 857 个站点、步长 280 DBU,必须和SITE的 0.28 微米对上。PINS里的+ LAYER M2 ( -70 -70 ) ( 70 70 )是相对坐标,描述引脚的矩形范围。这些括号里的负数坐标常常让新手困惑——它们是相对于PLACED那个点的偏移,不是绝对坐标。

注意:PINS里USE POWER/GROUND的引脚必须能在SPECIALNETS中找到对应连接,否则会出现「电源引脚未连接」。

3.4 UNITS 与坐标换算:1000 还是 2000 会连锁出什么

UNITS DISTANCE MICRONS 1000定义 DEF 的数据库单位。LEF 里也有自己的DATABASE MICRONS,两份不一致时,工具通常以 DEF 为准,把 LEF 的尺寸乘上换算系数。问题在于换算结果往往不是整数,取整之后WIDTH少 1 个 DBU、SPACING多 1 个 DBU,整套几何规则整体偏移。

这种偏移不会报错,只会在 DRC 阶段表现为「一堆 1 DBU 级别的间距违例,几何看起来完全正确」。查起来非常费时间,因为目视检查根本看不出差别。所以读入之后立刻打印DIEAREA和第一个ROW的STEP,和预期值对一遍,是最省事的验证手段。

4. 几何规则怎么被工具执行:SPACING、VIA 与天线效应的机制

LEF 里大部分语句是描述性的,但有一小部分是可执行的——工具会按这些规则实时计算几何。这部分才是 LEF 真正「活」的地方,也是工艺文件写得好不好、直接决定布通率的地方。

4.1 SPACINGTABLE:为什么宽金属的间距不是一个常数

如果间距真是常数,写个SPACING 0.2就够了。实际上宽金属的间距取决于两件事:线的宽度,以及两条线平行重叠的长度。原因是制造侧的两个效应——化学机械抛光的蝶形起伏,和光刻的邻近效应——都随金属面积和耦合面积增长,宽而长的平行走线必须拉开更大距离。

LEF 用二维查表表达这件事:

LAYER M4 TYPE ROUTING ; DIRECTION VERTICAL ; WIDTH 0.20 ; SPACING 0.20 ; SPACINGTABLE PARALLELRUNLENGTH 0.00 0.40 1.20 WIDTH 0.00 0.20 0.20 0.20 WIDTH 0.40 0.20 0.30 0.40 WIDTH 1.20 0.20 0.40 0.80 ; END M4

PARALLELRUNLENGTH给出平行长度的分桶边界,三个值把长度分成三段;每一行WIDTH给一个宽度桶,后面跟三个SPACING,对应三段长度。布线器查表的方式是:取两条线中较宽的那条定行,取平行重叠长度定列,查出间距后再取两者的较大值。第一行WIDTH 0.00是基准行,表示「窄线在任意长度下都用基准间距」。

写这张表最容易犯的错是SPACING的个数和PARALLELRUNLENGTH的个数不一致。多数解析器会报语法错,但也有实现会默默按行截断,结果就是某些宽度桶的间距根本没生效——表现出来的现象是「宽线间距规则在某个宽度区间突然失效」,非常隐蔽。

4.2 VIA 与 VIARULE:通孔是查出来的还是算出来的

通孔有两种来源。固定VIA是版图上画好的,带完整的层、矩形和电阻,库供应商认证过,可靠性有保证。VIARULE GENERATE则是给工具的参数化配方:给定切割尺寸、上下层、切割间距、行列数,工具自己生成阵列通孔。

VIARULE V1_DEFAULT DEFAULT LAYER M1 ; ENCLOSURE 0.04 0.02 ; # 下层包围,横向/纵向 LAYER V1 ; RECT -0.05 -0.05 0.05 0.05 ; SPACING 0.10 BY 0.10 ; LAYER M2 ; ENCLOSURE 0.02 0.04 ; END V1_DEFAULT VIARULE V1_GEN GENERATE LAYER M1 ; ENCLOSURE 0.05 0.01 ; LAYER M2 ; ENCLOSURE 0.01 0.05 ; LAYER V1 ; CUTSIZE 0.10 0.10 ; LAYERS M1 M2 ; CUTSPACING 0.10 0.10 ; ROWCOL 1 1 ; END V1_GEN

两种都要的原因很实际:固定通孔覆盖标准线宽,可靠且可重复;但一条 2 微米宽的电源线需要阵列通孔,固定通孔覆盖不了所有宽度组合,只能靠GENERATE现算。DEFAULT关键字标记默认规则,布线器在没指定规则时用它。ENCLOSURE是上下层金属对通孔的包围量,写小了会在通孔处出现包围不足的违例;写大了会挤占布线资源,反而降低布通率。

4.3 天线效应:面积比是怎么被计算的

等离子刻蚀过程中,长金属像天线一样收集电荷,电荷沿通孔往下传导,最终堆到栅极上。栅氧极薄,电压一高就击穿,这个现象叫工艺天线效应。判断标准很直接,就是一个比值:累积金属面积除以栅氧面积。

两侧的分工是这样的。LEF 提供分母和修正因子:MACRO的PIN里用ANTENNAGATEAREA给出栅面积,ANTENNADIFFAREA给扩散区面积;LAYER里用ANTENNAMODEL区分不同氧化

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询