第三章:设计数据准备——门级网表、时序约束文件(SDC)、物理库文件(LEF/DEF)、工艺文件

做布局布线,说白了就是一场「数据驱动的精密舞蹈」。你跳得再好,没有准确的乐谱和舞鞋,照样摔跟头。我个人习惯,在项目启动的第一天,先把这四类文件像体检报告一样过一遍。缺了哪一项,后面都是坑。

3.1 门级网表:你的电路「骨架」

门级网表是什么?就是综合工具吐出来的、用标准单元(AND、OR、DFF、MUX)搭起来的电路连接关系。它不像RTL那样抽象,而是实实在在的「谁跟谁连、用了什么门」。

我遇到过最头疼的事:有一次项目赶进度,综合脚本里忘了加某个约束,结果网表里多出了几千个无负载的缓冲器。布局布线工具一看,嘿,这些单元没地方放,直接报错。排查了两天才找到根因。

核心检查点:

  • 网表完整性:所有顶层端口必须存在,不能有悬空引脚
  • 实例化正确性:调用的标准单元名称必须与物理库完全一致
  • 层次化结构:如果用了层次化设计,确保子模块的网表已展平或正确引用

嗯,这里要注意:网表里经常会出现一些「幽灵单元」——比如综合时插入的测试逻辑(扫描链),它们在功能上可有可无,但在物理实现时必须保留。我曾经因为删了这些单元,导致ATE测试时芯片无法进入测试模式,那叫一个尴尬。

3.2 时序约束文件(SDC):你的「性能标尺」

SDC文件,说白了就是告诉工具:「这个时钟跑多快,那个路径不能太慢。」没有SDC,工具就像蒙着眼睛走路——它不知道哪些路径重要,哪些可以放松。

我建议,SDC文件一定要跟综合团队对清楚。为什么?因为综合用的SDC和布局布线用的SDC,虽然名字一样,但侧重点完全不同。综合阶段更关注逻辑优化,而布局布线阶段更关注物理实现。

我的个人习惯:

  • 先检查时钟定义:create_clock的周期、波形、源点是否正确
  • 再检查输入输出延迟:set_input_delay / set_output_delay 是否留了余量
  • 最后检查异常路径:false_path、multicycle_path有没有遗漏

你想想看,如果SDC里把某个时钟周期写成了10ns,但实际设计只能跑到8ns,那布局布线工具就会按照10ns去优化,结果流片回来芯片根本跑不到目标频率。我就在一个AI加速器项目上吃过这个亏——SDC里漏了一个跨时钟域的false_path,工具花了大量时间优化一条根本不需要关心的路径,导致关键路径反而没优化好。

# 一个典型的SDC片段
create_clock -name clk_core -period 5.0 [get_ports clk]
set_clock_uncertainty -setup 0.2 [get_clocks clk_core]
set_input_delay -clock clk_core -max 1.5 [get_ports data_in]
set_false_path -from [get_clocks clk_a] -to [get_clocks clk_b]

避坑指南:我曾经遇到一个案例,SDC里用了通配符(*)来匹配端口名,结果把一些内部信号也匹配上了,导致时序约束错误。所以,能用具体名字就别用通配符,除非你100%确定不会误伤。

3.3 物理库文件(LEF/DEF):你的「积木盒子」

LEF文件存的是标准单元的物理信息——尺寸、引脚位置、布线阻挡层。DEF文件存的是芯片的物理布局——比如IO pad的位置、电源网络、预放置的宏单元。

说白了,LEF就是告诉你「每个积木长什么样」,DEF就是告诉你「积木已经摆在哪里了」。没有它们,工具根本不知道单元该放哪儿、线该怎么走。

我记得有一次,工艺厂更新了LEF文件,但没通知我们。结果布局布线时,工具报了一堆「pin access」错误——原来新LEF里某个单元的引脚位置变了,导致布线通道被堵死。从那以后,我每次拿到新库,都会先跑一个简单的「单元检查」脚本,确保所有单元的LEF和网表能对上。

文件类型 内容 常见问题
LEF 单元尺寸、引脚位置、布线层信息 引脚坐标与网表不匹配、缺少布线阻挡层
DEF 芯片尺寸、IO位置、预放置单元 坐标超出芯片边界、电源网络不完整

小技巧:在导入DEF之前,先用文本编辑器打开看一眼。如果发现里面有很多「UNPLACED」的单元,说明这个DEF可能只是个初始版本,需要跟后端团队确认。

3.4 工艺文件:你的「物理法则」

工艺文件(通常叫.tf或.techfile)定义了芯片制造过程中的物理规则——最小线宽、最小间距、金属层厚度、通孔规则等等。没有它,工具画出来的版图根本没法流片。

你想想看,工艺文件就像交通规则——它告诉你「这条路限速多少、车道多宽、能不能并线」。布局布线工具必须严格遵守这些规则,否则生产出来的芯片就是一堆废品。

我踩过的一个大坑:某次项目用了新工艺,工艺文件里多了一条「最小面积规则」——要求每个有源区必须大于某个面积。结果布局布线时,工具自动插入了一些小尺寸的缓冲器,它们的面积不满足规则,导致DRC报错。最后只能手动替换成面积更大的单元,折腾了好几天。

工艺文件的关键参数:

  • 最小线宽/间距:决定了布线的密度上限
  • 通孔规则:通孔的大小、间距、堆叠层数
  • 天线规则:防止等离子体损伤的金属面积限制
  • 密度规则:金属层和有源区的密度要求

嗯,这里要特别提醒:工艺文件不是一成不变的。同一个工艺节点,不同版本的工艺文件可能差异很大。我建议在项目开始前,跟工艺厂确认好版本号,并且把工艺文件放到版本管理工具里,避免多人协作时搞混。

3.5 数据一致性检查:别让「小问题」变成「大灾难」

这四类文件不是孤立的,它们之间必须保持一致。我习惯在布局布线开始前,跑一个「数据一致性检查」脚本,主要检查以下几点:

  1. 网表 vs LEF:网表里调用的每个单元,在LEF里必须有对应的物理描述
  2. SDC vs 网表:SDC里引用的时钟端口和信号名,在网表里必须存在
  3. DEF vs 工艺文件:DEF里定义的芯片尺寸和层信息,必须与工艺文件一致

避坑指南:我曾经遇到一个案例,网表里用了一个叫「BUFX12」的单元,但LEF里只有「BUFX8」和「BUFX16」。工具找不到这个单元,直接报错退出。后来发现是综合时用了旧库,而物理库已经更新了。所以,数据准备阶段一定要确保所有文件来自同一个工艺版本。

好了,数据准备这块就聊到这儿。说白了,这四类文件就是布局布线的「四根柱子」——任何一根歪了,整个项目都得塌。我个人的经验是:花在数据检查上的时间,永远值得。别急着跑工具,先把数据理清楚,后面才能顺风顺水。