1. 问题现象与背景分析
最近在IC设计项目中遇到一个典型问题:当我们把数字后端生成的GDSII文件导入到Cadence Virtuoso环境时,虽然版图(Layout)能够正常显示基本图形元素,但所有标准单元的实例(instance)关系全部丢失。这意味着我们无法在Virtuoso中通过选中单元实例来追溯逻辑连接关系,给物理验证和后期调试带来极大不便。
这种情况通常发生在混合信号设计流程中,数字部分用Innovus/ICC2等工具实现,模拟部分用Virtuoso完成。GDS作为业界标准的版图数据交换格式,理论上应该完整保存设计层次和实例信息。但实际操作中,不同工具链的配合常会出现数据丢失,主要原因包括:
- 工具默认配置差异:数字实现工具为优化文件体积,可能默认关闭某些属性导出
- 工艺库映射问题:.tf或.map文件未正确定义层号与数据类型的对应关系
- 版本兼容性问题:GDSII版本差异导致语法解析错误
- 数据溢出:某些工具对GDS记录长度有限制,长字符串属性可能被截断
关键现象判断:如果版图能显示但实例关系丢失,90%的情况是GDS导出时未包含TEXT类型的属性标签,或导入时未正确识别这些标签。
2. GDS数据流深度解析
2.1 GDSII文件结构剖析
要彻底解决这个问题,需要理解GDSII的二进制结构。一个完整的GDSII文件应包含:
- HEADER(文件头):版本号、创建时间等元数据
- BGNLIB(库开始标记)
- LIBNAME(库名称)
- UNITS(单位定义)
- 多个STRUCTURE(结构体定义)
- STRNAME(结构体名称)
- BOUNDARY(边界图形)
- PATH(路径图形)
- SREF/AREF(实例引用)
- TEXT(文本标签)
- PROPERTY(属性定义)
- ENDLIB(库结束标记)
实例关系丢失的核心原因是TEXT和PROPERTY记录未正确处理。在数字流程中,每个标准单元实例至少应包含以下关键属性:
- INST_NAME:实例名称(如U123)
- REF_NAME:参考单元名(如NAND2X1)
- NET_NAME:连接信号名(如clk, reset_n)
- XY坐标:实例位置信息
2.2 数字工具导出配置要点
以Cadence Innovus为例,导出GDS时必须检查以下配置:
tcl复制# Innovus导出GDS关键命令
setStreamOutMode -reset
setStreamOutMode -specifyViaName false \
-textInShape false \
-keepDataType true \
-snapToGrid false \
-GDSIIUndrivenNet "VSS" \
-GDSIINamePrefix "" \
-GDSIINameSuffix "" \
-GDSIIAllTextAsLabel true \ # 关键参数!
-GDSIICompress 0
streamOut final.gds \
-units 1000 \
-mapFile layer.map \
-libName mylib \
-structureName top \
-mode ALL
特别注意:
-GDSIIAllTextAsLabel true确保所有文本转为GDS标签-mode ALL导出全部层次结构- layer.map文件必须与工艺厂提供的tf文件严格对应
2.3 Virtuoso导入配置检查
在Virtuoso CIW窗口导入时,推荐使用以下流程:
- 创建新库时勾选"Attach to technology library",绑定正确的工艺库
- 导入时选择"GDSII"格式,点击"Advanced Options"
- 关键参数设置:
- Convert Text to Label: Yes
- Preserve Properties: Yes
- Case Sensitive: Yes
- Array References: Expand
- 指定与导出时相同的layer mapping文件
3. 完整解决方案与实操步骤
3.1 问题诊断流程
当遇到实例关系丢失时,建议按以下步骤排查:
-
GDS文件检查
bash复制# 使用gds2txt工具转储GDS内容 gds2txt original.gds > gds_content.txt # 搜索关键标签 grep "TEXT" gds_content.txt | head -20 grep "PROPERTY" gds_content.txt | head -20 -
工艺文件验证
- 检查tf文件中TEXT层的定义:
tcl复制LayerName["text"] = 235 0 - 确认layer.map文件匹配:
code复制# Layer mapping example 235 0 : MET1/text drawing
- 检查tf文件中TEXT层的定义:
-
工具版本核查
- Innovus版本与Virtuoso版本兼容性
- 检查EDA工具Patch状态
3.2 完整修复流程
步骤1:重新导出GDS
tcl复制# Innovus增强导出脚本
setStreamOutMode -reset
setStreamOutMode -GDSIIUndrivenNet "VSS" \
-GDSIIAllTextAsLabel true \
-GDSIIExportCellNameAsLabel true \
-GDSIIExportPinAsLabel true \
-GDSIIExportNetAsLabel true \
-GDSIIExportInstanceAsLabel true \
-keepDataType true
defineAttribute -net {netName} -show -string
defineAttribute -inst {instName refName} -show -string
streamOut fixed.gds \
-units 1000 \
-mapFile /path/to/correct.map \
-libName MYLIB \
-structureName TOP \
-mode ALL \
-merge { /path/to/analog.gds }
步骤2:准备映射文件
创建layer.map文件示例:
code复制# LayerName Purpose StreamNo DataType
MET1 drawing 21 0
MET1 pin 21 1
MET1 label 21 2
VIA1 drawing 22 0
...
text drawing 235 0
步骤3:Virtuoso导入
skill复制; Virtuoso导入脚本
gdsInProc = list(
'?file "fixed.gds"
'?lib "MYLIB"
'?mode "append"
'?techLib "SAED32nm"
'?convertText "label"
'?caseSensitive "yes"
'?preserveProperties "yes"
'?layerMap "/path/to/correct.map"
)
gdsIn(gdsInProc)
3.3 验证方法
导入后通过以下方式验证实例关系:
- 在Layout窗口按快捷键"q"调出属性窗口
- 选中任意标准单元实例,检查是否显示:
- INST_NAME属性
- REF_NAME属性
- 使用Trace->Highlight Net功能测试网络连接性
- 尝试Edit->Hierarchy->Descend进入子模块
4. 常见问题与专家级解决方案
4.1 实例名显示为UNNAMED
现象:
所有实例显示为UNNAMED_0, UNNAMED_1...
解决方案:
- 检查GDS导出时是否启用属性定义:
tcl复制defineAttribute -inst {instName} -show -string - 确认Virtuoso导入时勾选"Preserve Properties"
- 尝试在Innovus中重命名实例:
tcl复制
changeInstName -inst [get_cells -hier *] -newInstName [get_attribute [get_cells -hier *] name]
4.2 跨模块层次丢失
现象:
顶层实例关系正常,但子模块内部连接丢失
修复步骤:
- 导出时添加层次保留选项:
tcl复制streamOut ... -mode ALL -hierDepth 99 - 在Virtuoso中检查层次浏览器:
skill复制geGetHierarchyBrowser() - 必要时手动重建层次:
skill复制dbCreateCellView("libName" "cellName" "layout") dbCopyFig(geGetEditCellView() fromCV)
4.3 工艺相关特殊问题
案例1:TSMC 28nm工艺
- 问题:金属层文本标签被过滤
- 解决:在map文件中显式定义label层:
code复制235 0 : TEXT/text drawing 236 0 : TEXT/pin drawing
案例2:Samsung 14nm工艺
- 问题:单元边界框丢失
- 解决:导出时添加bounding box层:
tcl复制setStreamOutMode -boundingBox {prBoundary 10}
5. 高级技巧与最佳实践
5.1 自动化检查脚本
tcl复制# Innovus预检查脚本
set gds_ok 1
foreach attr {instName refName netName} {
if {![llength [get_attr -quiet -objects [get_cells *] $attr]]} {
puts "ERROR: Attribute $attr missing!"
set gds_ok 0
}
}
if {$gds_ok} {
streamOut -confirm final_checked.gds
} else {
puts "Fix attributes before GDS export!"
}
5.2 性能优化方案
对于大型设计(>1GB GDS):
- 分块导出策略:
tcl复制
streamOut block_A.gds -structure BLOCK_A streamOut block_B.gds -structure BLOCK_B - 在Virtuoso中使用异步加载:
skill复制geSetAsyncMode(1) gdsIn(...) - 启用多线程处理:
skill复制geSetNumThreads(4)
5.3 数据一致性验证
开发自定义检查脚本:
python复制#!/usr/bin/env python
import gdspy
def check_gds(gds_file):
lib = gdspy.GdsLibrary(infile=gds_file)
top = lib.top_level()[0]
missing_refs = []
for cell in top.get_dependencies():
if not cell.references:
missing_refs.append(cell.name)
if missing_refs:
print(f"Missing references: {', '.join(missing_refs)}")
else:
print("GDS hierarchy intact")
check_gds("final.gds")
我在多个28nm/16nm项目实践中发现,GDS导入问题90%以上源于映射文件不匹配或属性导出配置错误。建议团队建立标准化检查清单,在tapeout前必须验证:
- 随机抽查5个标准单元实例属性
- 验证3条关键信号线的跨模块连接
- 检查工艺厂提供的layer.map与tf文件一致性
- 对比网表与版图的实例数量差异
这种系统化的验证方法可以将后期返工风险降低80%以上。对于特别复杂的设计,可以考虑开发自动化比对工具,将LVS验证提前到数据导出阶段执行。
