【Backend Flow工程实践 08】LEF / Liberty / Verilog / DEF:Backend Flow 为什么依赖多格式协同?
作者:Darren H. Chen
方向:EDA 工具工程 / 后端实现 / Backend Flow / 后端实现流程 / 工程自动化 / 验证基础设施
demo:LAY-BE-08_standard_formats
标签:Backend FlowEDAAPRLEFLibertyVerilogDEFSDC标准格式设计数据库后端实现
Backend Flow 并不是由单一设计文件构成的。
门级 Verilog 网表描述的是设计的逻辑连接关系。Liberty 文件描述的是 timing、power 以及 cell 级逻辑行为。LEF 文件描述的是 technology layer、standard cell abstract、macro abstract、site、pin、obstruction 以及 routing 相关的物理信息。DEF 文件描述的是某个具体设计实例的物理实现状态,包括 die area、row、track、component、pin、blockage、special net 和 route。
这些格式中,没有任何一个文件可以单独完整描述后端实现所需要的全部信息。
一个后端 EDA tool 必须读取它们、对齐它们、交叉检查它们,并把它们转换成一个统一、连贯的内部设计数据库。只有在这个基础上,工具才能继续进行 floorplan、placement、clock tree construction、routing、timing analysis、power analysis、physical check、ECO 和最终 export。
本文讨论 Backend Flow 中标准格式协同背后的架构与方法论:
Verilog -> 逻辑连接关系
Liberty -> timing / power / cell behavior
LEF -> technology 与 physical abstract
DEF -> 物理实现状态
↓
统一的后端设计数据库
↓
实现、分析、报告和交付
本文重点不讨论某个具体厂商命令,而是讨论标准格式背后的工程模型,以及为什么成熟 Backend Flow 必须把这些格式看成一套协同工作的语义系统,而不是一组彼此独立的输入文件。
1. Backend Flow 从同一个设计的多个视图开始
一个芯片设计有很多视图。
它有逻辑视图,因为设计包含 module、port、instance、net 和 pin connection。它有物理视图,因为 instance 必须占据 die 上的位置,并且必须满足 row、site、boundary、layer 和 routing 约束。它有 timing 视图,因为每条 path 都有 delay、transition、capacitance、setup check、hold check、clock behavior 和 timing exception。它有 power 视图,因为每个 cell 和 net 都会贡献 dynamic power、leakage power 以及 power network load。它还有制造视图,因为最终图形必须满足 technology 和 foundry rule。
没有任何单一文件格式可以完整覆盖这些信息。
| 设计视图 | 主要问题 | 典型格式来源 |
|---|---|---|
| 逻辑连接关系 | 存在哪些 instance 和 net? | Verilog netlist |
| Cell 行为 | 一个 cell 在逻辑上做什么? | Liberty function、Verilog model |
| Timing 行为 | timing arc、delay 和 constraint 是什么? | Liberty、SDC、SDF、parasitics |
| 物理抽象 | cell 多大、pin 在哪里? | LEF |
| 物理实现状态 | instance、pin、row 和 route 在哪里? | DEF |
| 工艺上下文 | 有哪些 layer、site、track、via 和 grid? | LEF technology section、technology file |
| Signoff layout | 最终制造图形是什么? | GDS/OASIS 和 layer map |
后端实现的过程,本质上就是把这些视图组合起来,并在设计不断演进的过程中保持它们之间的一致性。
这就是为什么后端 EDA tool 不是简单地“读一个网表”。它实际是在构建一个多视图设计数据库。
2. 为什么单一格式无法描述完整的后端设计
考虑下面这个很小的门级网表:
module demo_top (
input clk,
input a,
input b,
output q
);
wire n1;
wire n2;
AND2X1 U1 (.A(a), .B(b), .Y(n1));
INVX1 U2 (.A(n1), .Y(n2));
DFFQX1 U3 (.D(n2), .CK(clk), .Q(q));
endmodule
这个网表很有用,但它只描述了一个逻辑图。
它告诉工具:
U1 是 AND2X1 的 instance。
U2 是 INVX1 的 instance。
U3 是 DFFQX1 的 instance。
这些 instance 通过 net n1 和 n2 连接。
clk 驱动 U3 的 clock pin。
但是,它无法回答后端实现所需的物理和 timing 问题:
AND2X1 有多宽?
INVX1 有多高?
DFFQX1 是否匹配当前 row site?
DFFQX1 中 pin CK 的位置在哪里?
pin Q 使用哪一层 metal?
AND2X1 从 A 到 Y 的 delay 是多少?
DFFQX1 的 clock-to-Q delay 是多少?
DFFQX1 的 setup time 是多少?
U1、U2、U3 应该放在哪里?
net n1 是否已经完成 routing?
clk 是否使用 clock routing rule?
这些答案来自其他格式。
因此,后端工具在构建有意义的实现数据库之前,需要多个输入:
Verilog 提供逻辑 instance graph。
Liberty 提供 timing、power 和 cell behavior。
LEF 提供 physical abstract 和 technology context。
DEF 提供 physical implementation state。
只有当这些格式彼此一致时,数据库才是有意义的。
3. Verilog:逻辑连接关系与层次结构
Verilog netlist 通常是后端实现中最直观的设计输入。
在后端阶段,Verilog 通常是综合后的门级网表,尽管它可能仍然包含 hierarchy、macro instance、black-box reference 和一些特殊 wrapper logic。它定义:
top module
submodule
port
wire
standard-cell instance
macro instance
pin connection
logical hierarchy
constant connection
clock-gating logic
scan cell
spare cell
后端工具读取 Verilog,用它构建设计的第一个逻辑图。
简化模型如下:
Module
├─ Port
├─ Net
└─ Instance
├─ Master cell name
├─ Instance name
└─ Pin-to-net connection
从数据库角度看,Verilog 创建的是引用关系,而不是完整对象。
例如:
Instance U1 references master cell AND2X1.
在这个阶段,AND2X1 还只是一个名字。工具仍然需要在 project library 中找到这个名字。如果这个 master cell 在 Liberty 中存在但在 LEF 中不存在,timing 可能可以做,但物理 placement 会失败。如果它在 LEF 中存在但在 Liberty 中不存在,placement 可能可以做,但 timing-driven optimization 会不完整。如果两者都不存在,link 就会失败。
这就是为什么必须把 Verilog import 和 library linking 理解为两个不同操作:
Verilog import 建立逻辑引用。
Library linking 将这些引用解析到可用的 cell model。
关键工程检查点不仅是 Verilog 能否被解析,而是每个被引用的 cell 是否都能解析到正确的物理视图和 timing 视图。
4. Liberty:Timing、Power 与 Cell 级行为
Liberty 文件经常被称为 timing library,但在后端实现中,它的作用远不只是提供 delay 数值。
一个 Liberty model 可能描述:
cell name
cell area
pin name
pin direction
pin capacitance
timing arc
setup 和 hold constraint
clock pin
sequential behavior
combinational function
cell leakage power
internal power
output transition behavior
operating condition
PVT corner information
cell usage attribute
对于组合逻辑 cell,Liberty 告诉工具存在哪些 input-to-output arc,以及 delay 如何随着 input transition 和 output load 变化。
对于 sequential cell,Liberty 告诉工具哪个 pin 是 clock pin,哪个 pin 是 data pin,哪个 pin 是 output pin,存在哪些 setup / hold check,以及 clock-to-Q delay 应该如何建模。
从 Backend Flow 角度看,Liberty 会影响很多阶段:
| 后端阶段 | Liberty 的贡献 |
|---|---|
| Link | 解析 cell 名称和 pin 语义 |
| Timing analysis | 提供 timing arc、查找表、constraint |
| Placement optimization | 支持 timing-driven placement 和 buffering 决策 |
| Clock tree construction | 识别 clock pin、sequential cell、clock buffer、inverter |
| Hold fixing | 提供 delay model 和可用 cell |
| Power analysis | 提供 leakage 和 internal power 数据 |
| ECO | 支持 replacement、sizing、buffering 和 timing repair |
一个常见误区是认为 Liberty 只在 placement 之后才重要。事实上,Liberty 在 design linking 阶段就已经非常重要。
如果 Liberty 文件中的 pin name 不一致、timing arc 缺失、operating condition 错误,或者 sequential attribute 不完整,设计数据库就可能被错误地构建。后续报告仍然可能生成,但结果可能并不代表预期的硅片行为。
5. LEF:Technology Context 与 Physical Abstract
LEF 提供的是物理抽象。
它是抽象逻辑和物理实现之间的桥梁。LEF 通常包含两大类信息:
Technology LEF information
Cell / macro abstract information
Technology-level LEF information 可能包括:
unit
manufacturing grid
routing layer
cut layer
preferred direction
minimum width
spacing-related information
via definition
site definition
track-related information
Cell 和 macro 的 LEF information 可能包括:
macro name
class
origin
size
symmetry
site compatibility
pin name
pin direction
pin shape
pin layer
obstruction
cell boundary
macro blockage
对于 standard-cell placement,LEF 回答这些问题:
standard-cell site 是什么?
cell 有多高?
cell 有多宽?
这个 cell 能否放入生成的 row?
这个 cell 是否支持合法 orientation?
对于 routing,LEF 回答这些问题:
pin 在哪里?
哪些 layer 可以接到 pin?
routing obstruction 在哪里?
有哪些 routing layer?
有哪些 via definition?
对于 macro,LEF 更加关键,因为 top-level implementation 往往只能通过 abstract view 看到 macro。Router 无法使用它不知道的 shape。Placer 如果不知道 macro keepout 或 boundary behavior,也无法正确尊重这些约束。
实际后果很简单:
错误或不完整的 LEF 数据会制造物理实现失败。
这些失败可能表现为 placement overlap、row incompatibility、pin access error、routing blockage issue 或 export mismatch。但根因可能在 physical abstract layer。
6. DEF:某个具体设计的物理实现状态
DEF 经常和 LEF 一起出现,但二者作用不同。
一个有用的区分是:
LEF 描述可复用的 physical abstract。
DEF 描述某个具体设计的 physical state。
LEF 表达:
INVX1 有这样的尺寸和 pin。
DEF 表达:
INVX1 的 instance U123 放在坐标 (x, y)。
port clk 位于这个 boundary location。
core area 中存在这些 row。
存在这些 routing track。
这个 special net 在这些 layer 上完成 routing。
这个 regular net 有这些 route segment。
DEF 可能包含:
version 和 unit
die area
row
track
component
component placement status
pin
pin placement
blockage
region
group
special net
regular net
via
routing segment
因此,DEF 文件是一个设计状态快照。
它可以表示 floorplan DEF、placed DEF、routed DEF 或 final handoff DEF。同一个格式可以出现在不同 flow stage,但语义内容不同。
| DEF 阶段 | 典型内容 |
|---|---|
| Floorplan DEF | die area、row、track、pin、blockage、macro placement |
| Placed DEF | component placement、placement status,可能还有 scan order 相关状态 |
| CTS / post-CTS DEF | clock routing、clock 相关特殊数据、更新后的 placement |
| Routed DEF | regular net、special net、via、route shape |
| Handoff DEF | 给下游工具使用的最终 physical implementation state |
由于 DEF 会引用 component、layer、pin、row 和 track,因此它强烈依赖 LEF 和 technology context。如果工具在理解相应 LEF 定义之前就读取 DEF,它可能不知道如何解释 component master、layer、site 或 routing shape。
7. 四种格式的语义模型
LEF、Liberty、Verilog 和 DEF 可以看成同一个设计世界的四个投影。
这张图是理解标准格式协同的关键。
EDA tool 不是简单地把每个文件分别存起来,而是要建立跨文件链接:
Verilog instance -> library master
Library master -> Liberty cell
Library master -> LEF macro
DEF component -> Verilog instance
DEF component master -> LEF macro
LEF pin -> Liberty pin
Verilog port -> DEF pin
DEF layer -> LEF technology layer
如果这些链接不完整或不一致,数据库可能被部分构建,但并不可靠。
因此,稳健的 Backend Flow 必须把 import 看成语义集成,而不是文件读取。
8. 跨格式绑定:工具在背后完成的隐藏工作
最重要的工作往往发生在文件解析之后、阶段执行之前。
文件被读取之后,工具必须把名称、对象、layer、pin 和 view 绑定在一起。
一个简化的绑定表如下:
| 绑定目标 | 来源 A | 来源 B | 为什么重要 |
|---|---|---|---|
| Cell master | Verilog instance master name | LEF macro / Liberty cell | 支持 link、placement、timing |
| Pin name | Verilog pin connection | LEF pin / Liberty pin | 支持 routing 和 timing 语义 |
| Port name | Verilog top port | DEF pin / SDC object | 支持 constraint 和 physical I/O placement |
| Layer name | DEF route layer | LEF technology layer | 支持 route interpretation |
| Site name | DEF row site | LEF site | 支持 row legality |
| Component name | DEF component | Verilog instance | 支持 physical state attachment |
| Timing cell | Verilog master | Liberty cell | 支持 timing graph construction |
| Physical cell | Verilog master | LEF macro | 支持 placement 和 routing |
这就是为什么许多后端错误并不是简单 parser error。
一个文件可能在语法上是合法的,但在语义上与数据库中的其他部分不兼容。
例如:
Verilog 解析成功,但因为 cell master 缺失导致 link 失败。
LEF 导入成功,但因为 pin access 不完整导致 routing 失败。
Liberty 导入成功,但因为 pin name 不匹配导致 timing graph 不完整。
DEF 导入成功,但因为 master name 不一致导致 component 无法挂接。
SDC 读取成功,但因为 port 或 clock name 不一致导致 constraint 没有生效。
工程目标是在早期捕获这些问题。
9. Import Order 是依赖图,不是习惯
初学者常见问题是:为什么 import order 很重要?
答案是每种格式都依赖前面格式建立的上下文。
一个典型依赖图如下:
这个顺序对每个工具并不一定完全相同,但依赖逻辑是稳定的:
DEF 需要 layer、site 和 component-master context。
Verilog link 需要 library context。
Timing analysis 需要 linked design 和 timing library。
Physical stage 需要 physical abstract 和 technology context。
Export 需要完整且一致的数据库。
如果一个 flow 在没有显式顺序的情况下混合这些阶段,问题会更难诊断。好的 flow 会把依赖链显式化。
10. 标准格式就绪状态机
标准格式导入过程可以建模成一个状态机。
这个状态机的价值在于,它为每个阶段提供清晰的入口和出口条件。
不要把 design import 当作一个巨大的命令块,而应该让 flow 逐步回答:
输入文件是否完整?
technology context 是否 ready?
physical abstract 是否已加载?
timing model 是否已加载?
logical graph 是否已构建?
design 是否已经 linked?
physical state 是否已经 attached?
consistency report 是否已经生成?
每个状态的失败都指向不同类别的根因。
11. 典型跨格式失败模式
标准格式问题经常晚于真实根因才表现出来。
下面的表把症状映射到可能的语义不匹配。
| 症状 | 可能根因 | 需要检查的格式关系 |
|---|---|---|
| link 时存在 unresolved cell | 网表引用了缺失的 library master | Verilog vs LEF/Liberty |
| cell 可以 placement 但不能 timing | physical abstract 存在,但 Liberty cell 缺失 | LEF vs Liberty |
| cell 可以 timing 但不能 placement | Liberty 存在,但 LEF macro 缺失 | Liberty vs LEF |
| pin access 失败 | pin geometry 不完整或 layer 错误 | LEF pin vs routing layer |
| DEF component import 失败 | DEF component master 找不到 | DEF vs LEF |
| DEF layer error | DEF route layer 没有在 technology context 中定义 | DEF vs LEF technology |
| constraint 没有生效 | SDC object name 与 design object 不匹配 | SDC vs Verilog |
| clock path 缺失 | clock pin 没有正确建模 | Liberty vs Verilog pin usage |
| placement row error | site mismatch 或 site definition 缺失 | LEF site vs DEF row |
| export 后 LVS mismatch | layout、netlist 和 abstract 名称不一致 | GDS/OASIS vs DEF/Verilog/LEF |
这张表也说明,后端工程师不能只关注 parser error。
文件可以分别合法,但组合起来不一致。
12. File Manifest 是第一个工程产物
成熟 flow 应该记录每次 run 使用的精确输入文件。
这一点比看起来更重要。
如果 run 结果变化,首先应该问:
输入文件是否变化了?
一个 file manifest 应该包含:
format type
absolute path
logical role
file size
timestamp
optional checksum
version label
owner or source
expected stage
示例:
| Format | Role | Example path | Stage |
|---|---|---|---|
| LEF | technology + standard-cell abstract | data/lef/demo_stdcell.lef |
physical context |
| Liberty | timing / power model | data/liberty/demo_stdcell.lib |
timing context |
| Verilog | gate-level netlist | data/verilog/demo_top.v |
logical graph |
| DEF | floorplan state | data/def/demo_floorplan.def |
physical state |
| SDC | timing constraints | data/sdc/demo_top.sdc |
timing constraints |
manifest 应该写入 report 文件,而不是只隐藏在 run script 中。
这样 run 才可审计、可比较。
13. Precheck 应该同时验证文件与语义
第一层 precheck 是 file-level:
file exists
file is readable
file is not empty
path is deterministic
output directory is writable
第二层 precheck 是 format-level:
LEF version 是否被目标 flow 接受
DEF version 是否被目标 flow 接受
Verilog top module name 是否已知
Liberty library 是否有 nominal attributes 或 corner information
unit 和 database precision 是否可理解
第三层 precheck 是 semantic-level:
Verilog master 是否被 LEF 和 Liberty 覆盖
LEF 和 Liberty 的 pin name 是否一致
DEF component 是否映射到已知 physical master
DEF layer 是否映射到已知 technology layer
SDC clock 和 port 是否映射到 design object
第四层 precheck 是 stage-readiness:
工具是否可以进入 link?
工具是否可以进入 DEF import?
工具是否可以进入 timing setup?
工具是否可以生成有意义的 report?
好的 precheck 不需要证明一切。它应该在工具进入更深实现阶段之前,捕获高概率、高成本的失败。
14. LAY-BE-08_standard_formats 的最小 Demo 架构
Demo 08 的目标不是运行完整 placement 或 routing。
它的目标是展示标准格式如何形成协同的后端上下文。
合适的 demo 结构如下:
LAY-BE-08_standard_formats/
├─ data/
│ ├─ lef/
│ │ └─ demo_stdcell.lef
│ ├─ liberty/
│ │ └─ demo_stdcell.lib
│ ├─ verilog/
│ │ └─ demo_top.v
│ ├─ def/
│ │ └─ demo_floorplan.def
│ └─ sdc/
│ └─ demo_top.sdc
├─ scripts/
│ ├─ run_demo.csh
│ └─ clean.csh
├─ tcl/
│ ├─ run_demo.tcl
│ ├─ precheck_formats.tcl
│ ├─ import_context.tcl
│ └─ report_format_summary.tcl
├─ logs/
│ ├─ standard_formats.log
│ ├─ standard_formats.cmd.log
│ └─ standard_formats.sum.log
├─ reports/
│ ├─ file_manifest.rpt
│ ├─ format_precheck.rpt
│ ├─ import_summary.rpt
│ ├─ cell_name_alignment.rpt
│ ├─ pin_name_alignment.rpt
│ └─ def_binding_summary.rpt
└─ README.md
这个 demo 应该回答一组小而明确的问题:
使用了哪些文件?
这些文件是否存在并可读?
physical abstract 能否加载?
timing model 能否加载?
logical graph 能否加载?
library reference 能否解析?
DEF physical state 能否挂接?
flow 能否生成 consistency report?
这已经足以构成一个最小但有意义的标准格式 demo。
15. 推荐的输入与输出映射
对于这个 demo,输入/输出 contract 应该是显式的。
| 类别 | 输入 | 目的 |
|---|---|---|
| Physical abstract | demo_stdcell.lef |
cell size、pin、layer、site、obstruction |
| Timing/power model | demo_stdcell.lib |
timing arc、pin direction、delay/power data |
| Logical netlist | demo_top.v |
module、instance、net、pin connection |
| Physical state | demo_floorplan.def |
die area、row、track、pin、placement state |
| Constraint file | demo_top.sdc |
clock、I/O timing、design constraint |
| Run script | run_demo.csh |
受控工具启动 |
| Tcl entry | run_demo.tcl |
分阶段导入和报告 |
预期输出:
| 输出 | 目的 |
|---|---|
file_manifest.rpt |
记录全部输入文件及其 metadata |
format_precheck.rpt |
记录文件和基础格式 readiness |
import_summary.rpt |
记录 import / link 阶段结果 |
cell_name_alignment.rpt |
检查 netlist master coverage |
pin_name_alignment.rpt |
检查 physical / timing pin 一致性 |
def_binding_summary.rpt |
检查 DEF component / layer binding |
standard_formats.cmd.log |
保存 command stream |
standard_formats.sum.log |
汇总 run status |
这样 demo 就是自包含、可审查的。
16. 通用 csh 运行入口
运行入口应该把路径显式化。
#!/bin/csh -f
set nonomatch
set ROOT_DIR = `pwd`
set LOG_DIR = "$ROOT_DIR/logs"
set RPT_DIR = "$ROOT_DIR/reports"
set TMP_DIR = "$ROOT_DIR/tmp"
set TCL_DIR = "$ROOT_DIR/tcl"
mkdir -p "$LOG_DIR"
mkdir -p "$RPT_DIR"
mkdir -p "$TMP_DIR"
setenv LAY_DEMO_ROOT "$ROOT_DIR"
setenv LAY_LEF_FILE "$ROOT_DIR/data/lef/demo_stdcell.lef"
setenv LAY_LIB_FILE "$ROOT_DIR/data/liberty/demo_stdcell.lib"
setenv LAY_V_FILE "$ROOT_DIR/data/verilog/demo_top.v"
setenv LAY_DEF_FILE "$ROOT_DIR/data/def/demo_floorplan.def"
setenv LAY_SDC_FILE "$ROOT_DIR/data/sdc/demo_top.sdc"
setenv LAY_RPT_DIR "$RPT_DIR"
setenv LAY_LOG_DIR "$LOG_DIR"
setenv LAY_TMP_DIR "$TMP_DIR"
setenv EDA_TOOL_BIN /path/to/backend_tool
$EDA_TOOL_BIN \
-batch "$TCL_DIR/run_demo.tcl" \
-log "$LOG_DIR/standard_formats.log" \
>&! "$LOG_DIR/standard_formats.stdout.log"
这个 wrapper 的目的不仅是启动工具。它的目的也是冻结 run context:
input file path 是显式的
log path 是显式的
report path 是显式的
temporary directory 是显式的
Tcl entry point 是显式的
这样可以避免把 format debug 问题和 path resolution 问题混在一起。
17. 通用 Tcl Precheck 骨架
Tcl precheck 应该在数据库修改开始之前失败。
proc require_env {name} {
if {![info exists ::env($name)]} {
error "Missing required environment variable: $name"
}
}
proc require_file {path} {
if {![file exists $path]} {
error "Required file does not exist: $path"
}
if {![file readable $path]} {
error "Required file is not readable: $path"
}
if {[file size $path] == 0} {
error "Required file is empty: $path"
}
}
set required_vars {
LAY_LEF_FILE
LAY_LIB_FILE
LAY_V_FILE
LAY_DEF_FILE
LAY_SDC_FILE
LAY_RPT_DIR
LAY_LOG_DIR
}
foreach var $required_vars {
require_env $var
}
foreach file_var {
LAY_LEF_FILE
LAY_LIB_FILE
LAY_V_FILE
LAY_DEF_FILE
LAY_SDC_FILE
} {
require_file $::env($file_var)
}
puts "FORMAT_PRECHECK: PASS"
这个 precheck 层有意保持简单。它在工具开始构建设计数据库之前,捕获缺失输入、不可读文件和空文件。
在更大的 flow 中,这一层可以扩展为把检查结果写入 format_precheck.rpt。
18. 通用 Import 与 Link 骨架
一个 tool-neutral 的导入序列可以表示为若干阶段:
puts "STAGE_BEGIN: load_physical_abstract"
# import LEF or equivalent physical abstract
puts "STAGE_END: load_physical_abstract"
puts "STAGE_BEGIN: load_timing_model"
# import Liberty or configure timing library path
puts "STAGE_END: load_timing_model"
puts "STAGE_BEGIN: read_logical_netlist"
# import Verilog netlist
puts "STAGE_END: read_logical_netlist"
puts "STAGE_BEGIN: link_design"
# resolve design references against library context
puts "STAGE_END: link_design"
puts "STAGE_BEGIN: import_physical_state"
# import DEF floorplan or implementation state
puts "STAGE_END: import_physical_state"
puts "STAGE_BEGIN: read_constraints"
# read SDC or equivalent constraint file
puts "STAGE_END: read_constraints"
不同 EDA tool 的具体命令名不同,但架构是稳定的。
flow 应该分离以下动作:
loading physical abstracts
loading timing models
reading logical graph
linking references
attaching physical state
reading constraints
reporting consistency
这种分离会改善调试。如果 DEF import 失败,工程师可以先检查 link 是否成功。如果 link 失败,可以先检查 library context 是否已加载。如果 library context 失败,可以先检查 file manifest 和 precheck report。
19. 报告设计:应该捕获什么
一个好的标准格式 demo 应该生成可以解释数据库状态的报告。
19.1 file_manifest.rpt
这个报告应该捕获:
format type
file path
file size
last modified time
role in flow
optional checksum
19.2 format_precheck.rpt
这个报告应该捕获:
file existence
readability
empty-file check
directory writability
known file version if detectable
blocking errors
warnings
19.3 import_summary.rpt
这个报告应该捕获:
LEF import result
Liberty import result
Verilog import result
link result
DEF import result
constraint import result
19.4 cell_name_alignment.rpt
这个报告应该捕获:
cell masters referenced by Verilog
cell masters available in LEF
cell masters available in Liberty
missing physical views
missing timing views
19.5 pin_name_alignment.rpt
这个报告应该捕获:
pin names in netlist connections
pin names in LEF abstracts
pin names in Liberty cells
missing pins
extra pins
pin direction mismatches
19.6 def_binding_summary.rpt
这个报告应该捕获:
DEF units
DEF die area
rows
tracks
components
pins
component masters
unresolved DEF references
layer binding status
这些报告把 import 从黑箱步骤变成可审计的工程过程。
20. 方法论:把格式看作 Contract
一种有用的方法论是把每种格式看成 contract。
Verilog 给出 contract:
这些 instance、net、module 和 port 存在。
Liberty 给出 contract:
这些 cell、pin、timing arc 和 power model 存在。
LEF 给出 contract:
这些 physical master、pin、layer、site 和 obstruction 存在。
DEF 给出 contract:
这个具体设计状态使用这些 component、row、track、pin、layer 和 route。
只有这些 contract 彼此兼容,后端数据库才有效。
这种兼容性必须通过显式 flow stage 和 report 来检查。
因此,稳健方法论遵循这样的顺序:
1. 建立 manifest。
2. 进行 file precheck。
3. 加载 technology 和 physical abstract。
4. 加载 timing 和 power model。
5. 读取 logical netlist。
6. 解析 design reference。
7. 挂接 physical state。
8. 读取 constraint。
9. 生成 cross-format consistency report。
10. 用这些 report 作为后续阶段的 gate。
这就是“使用标准文件”和“工程化标准格式 Backend Flow”之间的区别。
21. 工程 Review Checklist
在设计允许继续进入 import 和 link 后续阶段之前,下面这些问题应该能被回答:
| Review item | Question |
|---|---|
| Manifest | 是否记录了所有输入文件的 path 和 metadata? |
| File readiness | 文件是否存在、可读、非空? |
| Tool context | working directory 和 run mode 是否显式? |
| Technology context | layer、unit、site、grid 是否可用? |
| Physical abstract | standard cell 和 macro 是否从 LEF 加载? |
| Timing model | Liberty cell 和 operating condition 是否加载? |
| Netlist | top module 是否已知并可读? |
| Linking | 所有 cell reference 是否已解析? |
| Pin consistency | 使用到的 cell,其 LEF 和 Liberty pin name 是否对齐? |
| DEF binding | DEF component 和 layer 是否绑定到已知对象? |
| Constraint binding | constraint 中的 clock 和 port 是否映射到 design object? |
| Reports | 是否生成 import 和 consistency report? |
这个 checklist 应该成为 Backend Flow review 的一部分,而不是事后补充。
22. 为什么这会影响后续阶段
格式对齐会影响后续每个后端阶段。
22.1 Floorplan
Floorplan 依赖:
die/core unit
row site
macro abstract
I/O pin definition
blockage
track
如果这些信息不一致,floorplan 看起来可能合法,但在 placement 或 routing 中表现会很差。
22.2 Placement
Placement 依赖:
standard-cell size
site compatibility
orientation rule
cell class
macro boundary
placement blockage
如果 LEF 和 netlist master name 没有对齐,placement 就无法把物理意义附加到逻辑 instance 上。
22.3 Timing
Timing 依赖:
linked design graph
Liberty timing arc
pin direction
clock definition
constraint
operating condition
如果 Liberty 和 Verilog 不对齐,timing report 可能缺失 path 或报告误导性数据。
22.4 Routing
Routing 依赖:
routing layer
via definition
pin geometry
obstruction
DEF state
technology grid
如果 LEF、DEF 和 technology context 不一致,routing failure 可能会在远离原始 import 问题的位置出现。
22.5 Handoff
Handoff 依赖:
DEF
GDS/OASIS
Verilog
LEF
layer map
constraint
report
如果早期格式对齐较弱,下游 physical verification 以及 equivalence/debug 会变得困难得多。
23. 实践要点
后端工程师不应该把标准格式看成被动文件。
它们是数据库的主动语义输入。
实践要点如下:
Verilog 不够。
Liberty 不只是用于后期 timing。
LEF 不只是物理附录。
DEF 不只是 placement snapshot。
Import order 反映语义依赖。
Linking 是逻辑名称与 library definition 相遇的位置。
Precheck 必须覆盖 file readiness 和 semantic alignment。
Report 必须捕获构建出的 context。
后续阶段失败经常源于早期格式不匹配。
对于一个 demo repository,这意味着 Demo 08 不应该只展示文件存在。它应该展示多种格式如何共同定义一个后端设计上下文。
24. 总结
Backend Flow 依赖多格式协同,因为设计本身是多维度的。
核心角色如下:
| Format | 核心作用 |
|---|---|
| Verilog | 逻辑连接关系与层次结构 |
| Liberty | Timing、power、cell behavior 和 optimization meaning |
| LEF | Technology context 与 physical abstract |
| DEF | 具体设计的 physical implementation state |
后端 EDA tool 通过对齐这些视图来构建统一数据库。
成熟 flow 因此应该提供:
explicit file manifest
file and format precheck
stable import order
library and design linking
cross-format consistency reports
clear failure classification
stage readiness gates
reviewable logs and command traces
更深层的经验是:后端 import 不只是文件读取。
它是语义数据库构建。
当这个构建过程可靠时,floorplan、placement、timing、routing、export 和 handoff 才有稳定基础。当它很薄弱时,下游失败就会变得难以解释且调试成本很高。
结尾思考
后端复杂性的第一层不是算法复杂性,而是语义复杂性。
LEF、Liberty、Verilog 和 DEF 必须协同工作,是因为后端实现必须把逻辑、物理抽象、timing 行为和具体物理状态统一到一个可执行的工程模型中。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)