3. 设计数据准备
在Synopsys Fusion Compiler(以下简称FC)的物理实现流程中,设计数据的完整性与正确性直接决定了后续布局布线(P&R)的收敛效率与芯片最终性能。本章聚焦于四大核心输入数据——门级网表(Gate-level Netlist)、时序约束(SDC)、物理库(LEF/DEF)以及技术文件(Tech File)的检查与加载方法。这些数据不仅是FC启动的“燃料”,更是贯穿floorplan、placement、CTS、routing全流程的“宪法”。任何一项数据的缺失、版本不匹配或语义错误,都可能导致工具报错、时序违例失控甚至芯片功能失效。因此,掌握一套系统化的数据体检与加载流程,是每一位物理实现工程师的基本功。
上图展示了FC中设计数据准备的整体链路。四类输入数据在进入工具后,需要经过统一的“体检引擎”进行交叉验证,最终输出三类结果:致命错误、警告或通过。只有全部通过,才能安全地进入后续的物理实现步骤。下面我们将逐一拆解每类数据的检查要点与加载方法。
3.1 门级网表:逻辑完整性与连接一致性
核心原理:门级网表是综合(Synthesis)后的产物,它描述了标准单元(Standard Cell)、宏单元(Macro)、IO Pad以及它们之间的电气连接关系。FC并不关心网表是如何生成的,它只负责将网表中的逻辑单元映射到物理库中的具体几何图形上。因此,网表必须与逻辑库(Liberty文件)中的单元定义完全一致,包括引脚名称、端口方向、功能定义等。
判断方法与操作流程:在FC中,加载网表通常使用read_verilog或read_netlist命令。加载后,必须立即执行link_design命令。该命令会将网表中的单元实例与已加载的逻辑库进行“链接”。如果链接失败,通常意味着网表中引用了逻辑库中不存在的单元,或者单元引脚不匹配。
# 典型加载流程
read_verilog ./rtl2gate/top.vg
current_design top
link_design
# 检查链接报告
report_links > link_report.txt
# 查看未链接的单元
get_cells -hier -filter "ref_name == \"*unknown*\""
链接成功后,还需要检查网表的完整性:
- 悬空引脚(Floating Pins):使用
report_net -connections检查是否存在未连接的输入引脚。悬空输入在物理上会导致浮栅,引发漏电或逻辑错误。 - 多驱动冲突(Multiple Drivers):同一网络被多个输出引脚驱动,会导致逻辑竞争。使用
check_design -type multiple_drivers检查。 - 电源地连接:确认网表中是否包含电源地引脚(VDD/VSS)的连接信息。在FC中,通常通过
derive_pg_connection命令自动连接,但前提是网表中已声明了PG端口。
report_net、report_cell命令进行结构化检查,或者使用get_pins、get_nets配合过滤条件进行批量验证。
3.2 时序约束(SDC):设计意图的精确传递
核心原理:SDC(Synopsys Design Constraints)文件是综合、物理实现和STA(静态时序分析)之间传递设计意图的唯一桥梁。它定义了时钟频率、时钟不确定性(uncertainty)、输入输出延迟、伪路径(false path)、多周期路径(multicycle path)等关键信息。如果SDC与网表不匹配,例如约束了网表中不存在的时钟端口,FC在时序优化时就会“无的放矢”,导致布局布线后时序严重违例。
判断方法与操作流程:加载SDC后,必须进行“约束一致性检查”。
# 加载SDC
read_sdc ./constraints/top.sdc
# 检查约束覆盖率
report_clock -skew -attributes
report_ports -verbose
# 检查未约束的路径
report_timing -unconstrained_paths
# 检查约束冲突
check_timing -verbose > check_timing.log
重点检查以下项目:
- 时钟定义:确认所有时钟都定义了
create_clock,且时钟源(source)在网表中真实存在。使用report_clocks查看时钟树。 - IO约束:检查
set_input_delay和set_output_delay是否覆盖了所有端口。未约束的端口在STA中会被视为理想路径,导致过度乐观。 - 时序例外(Exceptions):确认
set_false_path、set_multicycle_path中的对象(get_pins/get_cells)在网表中存在。失效的例外会被工具忽略,但不会报错,这是最隐蔽的风险。
check_timing。该命令会报告“unconstrained endpoints”、“no_clock”等问题。在7nm及更先进工艺下,check_timing的“no_input_delay”和“no_output_delay”警告必须清零,否则后续的时序收敛将充满不确定性。
3.3 物理库(LEF/DEF)与技术文件(Tech File):物理实现的“图纸”
核心原理:LEF(Library Exchange Format)定义了标准单元、宏单元和IO的物理抽象信息,包括单元边界、金属层占用、通孔位置、天线规则等。DEF(Design Exchange Format)则描述了芯片的物理布局信息,如die面积、行(row)、电源网络、宏单元放置位置等。技术文件(Tech File)是工艺厂提供的“配方”,包含了金属层厚度、介电常数、最小线宽、线间距、通孔类型等RC寄生参数和DRC规则。
判断方法与操作流程:在FC中,技术文件通常通过set_technology_file或read_tech_file加载。LEF通过read_lef加载,DEF通过read_def加载。加载顺序至关重要:必须先加载Tech File和LEF,再加载DEF,因为DEF中的单元放置需要LEF中的几何信息。
# 正确的加载顺序
set_technology_file -file ./tech/tsmc7ff_tech.tf
read_lef ./lef/tsmc7ff_stdcell.lef
read_lef ./lef/tsmc7ff_macro.lef
read_def ./def/floorplan.def
# 检查物理库一致性
check_physical_design -stage pre_place
report_ignored_layers
report_ignored_vias
关键检查项包括:
- 层叠结构(Stackup)一致性:Tech File中定义的金属层名称、顺序必须与LEF中引用的层名称一致。例如,LEF中使用了“M3”层,但Tech File中只有“M2”和“M4”,则会导致加载失败。
- 单元尺寸与Site匹配:LEF中的标准单元高度必须与Tech File中定义的Row Height(行高)匹配。通常,一个标准单元的高度是Row Height的整数倍。
- 通孔规则(Via Rules):检查Tech File中定义的Via类型(如V12、V23)是否在LEF中被正确引用。缺失的Via定义会导致布线时无法打孔。
set_site命令将DEF中的site映射到LEF中的新名称,或者重新生成DEF。
3.4 案例拆解:一次“静默失败”的SDC加载
背景与目标:某5G基带芯片项目,在FC中完成布局后,发现CTS(时钟树综合)后的setup时序违例高达-2.5ns。工程师最初怀疑是CTS策略问题,但经过多轮调整仍无改善。
初始现象与关键数据:通过report_timing -delay_type max查看违例路径,发现所有违例路径的终点都是同一个寄存器组(reg_group_inst)。进一步查看该寄存器的时钟引脚,发现其时钟源是“clk_div2”,但SDC中定义的时钟是“clk_div4”。
分析判断过程:工程师使用report_clock -skew检查时钟树,发现clk_div2和clk_div4的时钟偏斜(skew)相差极大。通过check_timing发现,SDC中虽然定义了clk_div4,但网表中实际生成clk_div4的寄存器(divider_reg)被优化掉了,导致clk_div4的时钟源不存在。工具在加载SDC时,并未报错,而是将clk_div4视为“ideal clock”,从而忽略了其真实延迟。
实际操作步骤:
- 使用
all_clocks命令列出所有时钟,发现clk_div4的source是“divider_reg/Q”。 - 使用
get_cells divider_reg确认该寄存器在网表中不存在。 - 回溯综合脚本,发现综合时使用了
set_dont_touch约束,但该约束被误写为set_dont_touch_network,导致综合工具将divider_reg优化掉了。 - 修复综合脚本,重新生成网表。
- 在FC中重新加载网表和SDC,再次运行
check_timing,确认“no_clock”警告清零。
结果对比与复盘:修复后,CTS后的setup违例从-2.5ns降至-0.3ns,经过两轮优化后完全收敛。复盘经验:SDC中的时钟定义必须与网表中的实际逻辑路径一一对应,不能依赖工具的“自动推断”。在加载SDC后,务必执行check_timing并逐条阅读“no_clock”和“unconstrained_endpoint”警告。
3.5 常见误区与总结复盘
| 误区 | 后果 | 正确做法 |
|---|---|---|
网表加载后不执行link_design |
后续所有命令都可能因找不到单元而失败 | 加载后立即链接,并检查report_links |
SDC中使用了通配符(如get_pins *reg*)但未确认匹配对象 |
约束可能未生效,时序分析过于乐观 | 使用get_pins后配合sizeof检查数量 |
| LEF与Tech File版本不匹配 | DRC错误、RC提取偏差 | 核对工艺厂提供的版本兼容性矩阵 |
| DEF中的单元放置与LEF中的site不匹配 | 布局阶段报错或单元重叠 | 使用check_physical_design预检 |
忽略check_timing的警告 |
隐藏的时序约束漏洞在CTS后爆发 | 将check_timing警告清零作为设计启动的“门禁” |
总结复盘:设计数据准备不是简单的“读文件”操作,而是一次严谨的“数据审计”。建议建立以下标准作业流程(SOP):
- 版本核对:确认网表、SDC、LEF、Tech File均来自同一版本的工艺库和综合工具。
- 顺序加载:严格遵循“Tech File → LEF → Netlist → SDC → DEF”的加载顺序。
- 交叉验证:使用
link_design验证逻辑一致性,使用check_timing验证约束完整性,使用check_physical_design验证物理规则。 - 报告归档:将
report_links、check_timing.log、check_physical_design.log作为设计评审的必备附件。
只有经过上述严格检查的数据,才能为后续的floorplan和布局布线提供可靠的基础。在下一阶段,我们将基于这些已验证的数据,开始进行芯片的物理规划(Floorplan)。