CalibreDRC与LVS二次开发
1. CalibreDRC二次开发基础
1.1 CalibreDRC概述
CalibreDRC(Design Rule Check)是Mentor Graphics公司开发的一款用于检查集成电路设计是否符合设计规则的工具。设计规则检查是芯片设计流程中的关键步骤,确保设计的物理布局符合制造工艺的限制和要求,从而提高芯片的良率和可靠性。CalibreDRC通过读取设计的GDSII文件和设计规则文件,自动检测并报告违反设计规则的区域。
1.2 CalibreDRC的工作流程
CalibreDRC的工作流程主要包括以下几个步骤:
-
读取设计文件:从GDSII文件中读取设计的物理布局。
-
解析设计规则文件:读取并解析设计规则文件(通常是.rul文件)。
-
执行检查:根据设计规则文件中的规则,对设计进行详细的检查。
-
生成报告:输出检查结果,通常包括违反规则的区域、规则ID和描述等信息。
-
结果分析:用户根据报告分析违反规则的原因,进行设计修正。
1.3 设计规则文件的格式
设计规则文件通常采用Mentor Graphics的Calibre Design Rules (CDR)格式,这是一种基于C语言的脚本格式,用于定义设计规则。CDR文件中常见的语句包括:
-
规则定义:定义具体的规则,如最小线宽、最小间距等。
-
几何操作:对设计中的几何形状进行操作,如合并、相交等。
-
逻辑操作:使用逻辑操作符对规则进行组合和条件判断。
1.4 CalibreDRC的基本命令
CalibreDRC提供了一系列命令,用于执行设计规则检查和结果处理。以下是一些常用的基本命令:
-
drc:执行设计规则检查。
-
streamin:读取GDSII文件。
-
streamout:输出GDSII文件。
-
report:生成检查报告。
-
layer:定义和操作层次。
1.5 二次开发的需求与意义
CalibreDRC的二次开发是为了满足特定设计需求,提高检查效率和准确性。通过二次开发,用户可以:
-
定制规则:根据特定工艺和设计需求,编写自定义的设计规则。
-
优化流程:通过脚本自动化,减少手动操作,提高检查速度。
-
数据处理:对检查结果进行进一步的分析和处理,生成用户需要的报告格式。
2. CalibreDRC二次开发实例
2.1 最小线宽检查的二次开发
2.1.1 基本原理
最小线宽检查是确保设计中的线宽符合制造工艺的最小要求。CalibreDRC通过定义最小线宽规则,并对设计中的每一层进行检查,报告所有违反最小线宽规则的区域。
2.1.2 示例代码
以下是一个最小线宽检查的CDR规则示例:
// 定义最小线宽规则
RULE min_width (layer, width)
{
// 读取指定层
layer = read_layer(layer);
// 计算违反最小线宽的区域
vio = layer NOT (layer GROW width);
// 输出违反规则的区域
write_layer(vio, "vio_" + layer);
}
// 调用最小线宽规则
min_width("poly", 0.13);
2.1.3 代码解释
-
RULE min_width (layer, width):定义一个名为
min_width
的规则,接受两个参数:层名和最小线宽。 -
layer = read_layer(layer):读取指定层的数据。
-
vio = layer NOT (layer GROW width):计算违反最小线宽的区域。
GROW
操作将层中的每个形状扩展指定的宽度,NOT
操作计算扩展后的形状与原形状的差异,即违反最小线宽的区域。 -
write_layer(vio, “vio_” + layer):将违反规则的区域写入新的层,名称为
vio_
加上原层名。
2.2 最小间距检查的二次开发
2.2.1 基本原理
最小间距检查是确保设计中不同形状之间的间距符合制造工艺的最小要求。CalibreDRC通过定义最小间距规则,并对设计中的每一层进行检查,报告所有违反最小间距规则的区域。
2.2.2 示例代码
以下是一个最小间距检查的CDR规则示例:
// 定义最小间距规则
RULE min_spacing (layer1, layer2, spacing)
{
// 读取指定层
layer1 = read_layer(layer1);
layer2 = read_layer(layer2);
// 计算违反最小间距的区域
vio = layer1 NOT (layer2 GROW spacing);
// 输出违反规则的区域
write_layer(vio, "vio_" + layer1 + "_" + layer2);
}
// 调用最小间距规则
min_spacing("active", "poly", 0.13);
2.2.3 代码解释
-
RULE min_spacing (layer1, layer2, spacing):定义一个名为
min_spacing
的规则,接受三个参数:两个层名和最小间距。 -
layer1 = read_layer(layer1):读取第一个层的数据。
-
layer2 = read_layer(layer2):读取第二个层的数据。
-
vio = layer1 NOT (layer2 GROW spacing):计算违反最小间距的区域。
GROW
操作将第二个层中的每个形状扩展指定的间距,NOT
操作计算扩展后的形状与第一个层的差异,即违反最小间距的区域。 -
write_layer(vio, “vio_” + layer1 + “_” + layer2):将违反规则的区域写入新的层,名称为
vio_
加上两个原层名。
2.3 重叠区域检查的二次开发
2.3.1 基本原理
重叠区域检查是确保设计中不同层次之间的重叠区域符合特定的要求。CalibreDRC通过定义重叠区域规则,并对设计中的每一层进行检查,报告所有违反重叠区域规则的区域。
2.3.2 示例代码
以下是一个重叠区域检查的CDR规则示例:
// 定义重叠区域规则
RULE overlap_check (layer1, layer2, min_overlap)
{
// 读取指定层
layer1 = read_layer(layer1);
layer2 = read_layer(layer2);
// 计算重叠区域
overlap = layer1 AND (layer2 GROW min_overlap);
// 输出重叠区域
write_layer(overlap, "overlap_" + layer1 + "_" + layer2);
}
// 调用重叠区域规则
overlap_check("metal1", "via1", 0.13);
2.3.3 代码解释
-
RULE overlap_check (layer1, layer2, min_overlap):定义一个名为
overlap_check
的规则,接受三个参数:两个层名和最小重叠区域。 -
layer1 = read_layer(layer1):读取第一个层的数据。
-
layer2 = read_layer(layer2):读取第二个层的数据。
-
overlap = layer1 AND (layer2 GROW min_overlap):计算重叠区域。
GROW
操作将第二个层中的每个形状扩展指定的最小重叠区域,AND
操作计算扩展后的形状与第一个层的重叠部分。 -
write_layer(overlap, “overlap_” + layer1 + “_” + layer2):将重叠区域写入新的层,名称为
overlap_
加上两个原层名。
2.4 组合规则的二次开发
2.4.1 基本原理
组合规则是将多个基本规则组合起来,形成更复杂的检查。通过组合规则,可以实现更精细和全面的检查。
2.4.2 示例代码
以下是一个组合规则的CDR示例,结合最小线宽和最小间距检查:
// 定义最小线宽规则
RULE min_width (layer, width)
{
layer = read_layer(layer);
vio = layer NOT (layer GROW width);
write_layer(vio, "vio_min_width_" + layer);
}
// 定义最小间距规则
RULE min_spacing (layer1, layer2, spacing)
{
layer1 = read_layer(layer1);
layer2 = read_layer(layer2);
vio = layer1 NOT (layer2 GROW spacing);
write_layer(vio, "vio_min_spacing_" + layer1 + "_" + layer2);
}
// 定义组合规则
RULE combo_check (layer, width, layer1, layer2, spacing)
{
// 执行最小线宽检查
min_width(layer, width);
// 执行最小间距检查
min_spacing(layer1, layer2, spacing);
}
// 调用组合规则
combo_check("poly", 0.13, "active", "poly", 0.13);
2.4.3 代码解释
-
RULE min_width (layer, width):定义最小线宽规则。
-
RULE min_spacing (layer1, layer2, spacing):定义最小间距规则。
-
RULE combo_check (layer, width, layer1, layer2, spacing):定义组合规则,接受五个参数:两个层名、最小线宽、两个层名和最小间距。
-
min_width(layer, width):调用最小线宽规则。
-
min_spacing(layer1, layer2, spacing):调用最小间距规则。
3. CalibreLVS二次开发基础
3.1 CalibreLVS概述
CalibreLVS(Layout versus Schematic)是Mentor Graphics公司开发的一款用于验证集成电路设计的物理布局(Layout)与原理图(Schematic)是否一致的工具。LVS检查是确保设计功能正确性的关键步骤,通过对比布局和原理图,报告所有不匹配的区域。
3.2 CalibreLVS的工作流程
CalibreLVS的工作流程主要包括以下几个步骤:
-
读取布局和原理图文件:从GDSII文件和SPICE文件中读取设计数据。
-
解析布局和原理图数据:读取并解析布局和原理图文件中的数据。
-
执行LVS检查:根据定义的LVS规则,对比布局和原理图的数据。
-
生成报告:输出检查结果,通常包括不匹配的区域、网表差异等信息。
-
结果分析:用户根据报告分析不匹配的原因,进行设计修正。
3.3 LVS规则文件的格式
LVS规则文件通常采用Mentor Graphics的Calibre LVS (CLVS)格式,这是一种基于C语言的脚本格式,用于定义LVS规则。CLVS文件中常见的语句包括:
-
规则定义:定义具体的LVS规则,如网表提取、节点匹配等。
-
几何操作:对设计中的几何形状进行操作,如合并、相交等。
-
逻辑操作:使用逻辑操作符对规则进行组合和条件判断。
3.4 CalibreLVS的基本命令
CalibreLVS提供了一系列命令,用于执行LVS检查和结果处理。以下是一些常用的基本命令:
-
extract:从布局中提取网表。
-
compare:对比提取的网表和原理图网表。
-
report:生成LVS检查报告。
-
layer:定义和操作层次。
3.5 二次开发的需求与意义
CalibreLVS的二次开发是为了满足特定设计需求,提高检查效率和准确性。通过二次开发,用户可以:
-
定制规则:根据特定工艺和设计需求,编写自定义的LVS规则。
-
优化流程:通过脚本自动化,减少手动操作,提高检查速度。
-
数据处理:对检查结果进行进一步的分析和处理,生成用户需要的报告格式。
4. CalibreLVS二次开发实例
4.1 网表提取的二次开发
4.1.1 基本原理
网表提取是从布局中提取电路的节点和连接关系,生成SPICE网表。CalibreLVS通过定义网表提取规则,并对设计中的每一层进行处理,提取出网表信息。
4.1.2 示例代码
以下是一个网表提取的CLVS规则示例:
// 定义网表提取规则
RULE extract_netlist (layer)
{
// 读取指定层
layer = read_layer(layer);
// 提取网表
netlist = extract(layer);
// 输出网表
write_netlist(netlist, "extracted_" + layer + ".sp");
}
// 调用网表提取规则
extract_netlist("metal1");
4.1.3 代码解释
-
RULE extract_netlist (layer):定义一个名为
extract_netlist
的规则,接受一个参数:层名。 -
layer = read_layer(layer):读取指定层的数据。
-
netlist = extract(layer):从指定层中提取网表信息。
-
write_netlist(netlist, “extracted_” + layer + “.sp”):将提取的网表信息写入新的SPICE文件,名称为
extracted_
加上原层名。
4.2 节点匹配的二次开发
4.2.1 基本原理
节点匹配是确保布局中的节点与原理图中的节点完全一致。CalibreLVS通过定义节点匹配规则,并对设计中的每一层进行处理,报告所有不匹配的节点。
4.2.2 示例代码
以下是一个节点匹配的CLVS规则示例:
// 定义节点匹配规则
RULE match_nodes (layout_netlist, schematic_netlist)
{
// 读取布局网表
layout_netlist = read_netlist(layout_netlist);
// 读取原理图网表
schematic_netlist = read_netlist(schematic_netlist);
// 对比节点
mismatch = compare_nodes(layout_netlist, schematic_netlist);
// 输出不匹配的节点
write_mismatch(mismatch, "mismatch_nodes.txt");
}
// 调用节点匹配规则
match_nodes("extracted_metal1.sp", "schematic.sp");
4.2.3 代码解释
-
RULE match_nodes (layout_netlist, schematic_netlist):定义一个名为
match_nodes
的规则,接受两个参数:布局网表文件名和原理图网表文件名。 -
layout_netlist = read_netlist(layout_netlist):读取布局网表文件。
-
schematic_netlist = read_netlist(schematic_netlist):读取原理图网表文件。
-
mismatch = compare_nodes(layout_netlist, schematic_netlist):对比布局网表和原理图网表中的节点,生成不匹配的节点信息。
-
write_mismatch(mismatch, “mismatch_nodes.txt”):将不匹配的节点信息写入新的文本文件,名称为
mismatch_nodes.txt
。
4.3 电路元件匹配的二次开发
4.3.1 基本原理
电路元件匹配是确保布局中的电路元件与原理图中的电路元件完全一致。CalibreLVS通过定义电路元件匹配规则,并对设计中的每一层进行处理,报告所有不匹配的电路元件。
4.3.2 示例代码
以下是一个电路元件匹配的CLVS规则示例:
// 定义电路元件匹配规则
RULE match_elements (layout_netlist, schematic_netlist)
{
// 读取布局网表
layout_netlist = read_netlist(layout_netlist);
// 读取原理图网表
schematic_netlist = read_netlist(schematic_netlist);
// 对比电路元件
mismatch = compare_elements(layout_netlist, schematic_netlist);
// 输出不匹配的电路元件
write_mismatch(mismatch, "mismatch_elements.txt");
}
// 调用电路元件匹配规则
match_elements("extracted_metal1.sp", "schematic.sp");
4.3.3 代码解释
-
RULE match_elements (layout_netlist, schematic_netlist):定义一个名为
match_elements
的规则,接受两个参数:布局网表文件名和原理图网表文件名。 -
layout_netlist = read_netlist(layout_netlist):读取布局网表文件。
-
schematic_netlist = read_netlist(schematic_netlist):读取原理图网表文件。
-
mismatch = compare_elements(layout_netlist, schematic_netlist):对比布局网表和原理图网表中的电路元件,生成不匹配的电路元件信息。
-
write_mismatch(mismatch, “mismatch_elements.txt”):将不匹配的电路元件信息写入新的文本文件,名称为
mismatch_elements.txt
。
4.4 组合LVS规则的二次开发
4.4.1 基本原理
组合LVS规则是将多个基本LVS规则组合起来,形成更复杂的检查。通过组合LVS规则,可以实现更精细和全面的LVS检查。这种组合可以包括网表提取、节点匹配、电路元件匹配等多个步骤,确保设计的各个方面都符合要求。
4.4.2 示例代码
以下是一个组合LVS规则的CLVS示例,结合网表提取和节点匹配:
// 定义网表提取规则
RULE extract_netlist (layer)
{
// 读取指定层
layer = read_layer(layer);
// 提取网表
netlist = extract(layer);
// 输出网表
write_netlist(netlist, "extracted_" + layer + ".sp");
}
// 定义节点匹配规则
RULE match_nodes (layout_netlist, schematic_netlist)
{
// 读取布局网表
layout_netlist = read_netlist(layout_netlist);
// 读取原理图网表
schematic_netlist = read_netlist(schematic_netlist);
// 对比节点
mismatch = compare_nodes(layout_netlist, schematic_netlist);
// 输出不匹配的节点
write_mismatch(mismatch, "mismatch_nodes.txt");
}
// 定义组合LVS规则
RULE combo_lvs (layer, schematic_netlist)
{
// 提取布局网表
extract_netlist(layer);
// 读取提取的布局网表
layout_netlist = "extracted_" + layer + ".sp";
// 执行节点匹配
match_nodes(layout_netlist, schematic_netlist);
}
// 调用组合LVS规则
combo_lvs("metal1", "schematic.sp");
4.4.3 代码解释
-
RULE extract_netlist (layer):定义一个名为
extract_netlist
的规则,接受一个参数:层名。该规则从指定层中提取网表信息,并将其写入新的SPICE文件。-
layer = read_layer(layer):读取指定层的数据。
-
netlist = extract(layer):从指定层中提取网表信息。
-
write_netlist(netlist, “extracted_” + layer + “.sp”):将提取的网表信息写入新的SPICE文件,名称为
extracted_
加上原层名。
-
-
RULE match_nodes (layout_netlist, schematic_netlist):定义一个名为
match_nodes
的规则,接受两个参数:布局网表文件名和原理图网表文件名。该规则对比布局网表和原理图网表中的节点,生成不匹配的节点信息,并将其写入新的文本文件。-
layout_netlist = read_netlist(layout_netlist):读取布局网表文件。
-
schematic_netlist = read_netlist(schematic_netlist):读取原理图网表文件。
-
mismatch = compare_nodes(layout_netlist, schematic_netlist):对比布局网表和原理图网表中的节点,生成不匹配的节点信息。
-
write_mismatch(mismatch, “mismatch_nodes.txt”):将不匹配的节点信息写入新的文本文件,名称为
mismatch_nodes.txt
。
-
-
RULE combo_lvs (layer, schematic_netlist):定义一个名为
combo_lvs
的组合LVS规则,接受两个参数:层名和原理图网表文件名。该规则首先调用extract_netlist
规则提取布局网表,然后调用match_nodes
规则进行节点匹配。-
extract_netlist(layer):调用网表提取规则,从指定层中提取网表。
-
layout_netlist = “extracted_” + layer + “.sp”:读取提取的布局网表文件名。
-
match_nodes(layout_netlist, schematic_netlist):调用节点匹配规则,对比布局网表和原理图网表中的节点。
-
-
combo_lvs(“metal1”, “schematic.sp”):调用组合LVS规则,指定层名
metal1
和原理图网表文件名schematic.sp
。
4.5 高级LVS规则的二次开发
4.5.1 基本原理
高级LVS规则不仅包括基本的网表提取和节点匹配,还可以进行更复杂的电路分析和验证。通过高级LVS规则,用户可以:
-
检测寄生元件:识别布局中的寄生元件,确保其不影响电路性能。
-
验证电路功能:不仅检查节点和元件的一致性,还可以验证电路的功能是否符合预期。
-
自定义报告格式:生成用户需要的特定报告格式,方便后续分析和修正。
4.5.2 示例代码
以下是一个高级LVS规则的CLVS示例,结合寄生元件检测和功能验证:
// 定义网表提取规则
RULE extract_netlist (layer)
{
layer = read_layer(layer);
netlist = extract(layer);
write_netlist(netlist, "extracted_" + layer + ".sp");
}
// 定义节点匹配规则
RULE match_nodes (layout_netlist, schematic_netlist)
{
layout_netlist = read_netlist(layout_netlist);
schematic_netlist = read_netlist(schematic_netlist);
mismatch = compare_nodes(layout_netlist, schematic_netlist);
write_mismatch(mismatch, "mismatch_nodes.txt");
}
// 定义寄生元件检测规则
RULE parasitic_check (layout_netlist, schematic_netlist)
{
layout_netlist = read_netlist(layout_netlist);
schematic_netlist = read_netlist(schematic_netlist);
// 检测寄生元件
parasitics = detect_parasitics(layout_netlist, schematic_netlist);
// 输出寄生元件信息
write_parasitics(parasitics, "parasitics.txt");
}
// 定义功能验证规则
RULE functional_check (layout_netlist, schematic_netlist)
{
layout_netlist = read_netlist(layout_netlist);
schematic_netlist = read_netlist(schematic_netlist);
// 验证电路功能
functional_mismatch = verify_function(layout_netlist, schematic_netlist);
// 输出功能不匹配信息
write_functional_mismatch(functional_mismatch, "functional_mismatch.txt");
}
// 定义组合高级LVS规则
RULE advanced_lvs (layer, schematic_netlist)
{
// 提取布局网表
extract_netlist(layer);
// 读取提取的布局网表
layout_netlist = "extracted_" + layer + ".sp";
// 执行节点匹配
match_nodes(layout_netlist, schematic_netlist);
// 执行寄生元件检测
parasitic_check(layout_netlist, schematic_netlist);
// 执行功能验证
functional_check(layout_netlist, schematic_netlist);
}
// 调用组合高级LVS规则
advanced_lvs("metal1", "schematic.sp");
4.5.3 代码解释
-
RULE parasitic_check (layout_netlist, schematic_netlist):定义一个名为
parasitic_check
的规则,接受两个参数:布局网表文件名和原理图网表文件名。该规则检测布局中的寄生元件,并生成寄生元件信息。-
parasitics = detect_parasitics(layout_netlist, schematic_netlist):检测布局中的寄生元件。
-
write_parasitics(parasitics, “parasitics.txt”):将检测到的寄生元件信息写入新的文本文件,名称为
parasitics.txt
。
-
-
RULE functional_check (layout_netlist, schematic_netlist):定义一个名为
functional_check
的规则,接受两个参数:布局网表文件名和原理图网表文件名。该规则验证电路的功能是否符合预期,并生成功能不匹配信息。-
functional_mismatch = verify_function(layout_netlist, schematic_netlist):验证电路的功能是否符合预期。
-
write_functional_mismatch(functional_mismatch, “functional_mismatch.txt”):将功能不匹配信息写入新的文本文件,名称为
functional_mismatch.txt
。
-
-
RULE advanced_lvs (layer, schematic_netlist):定义一个名为
advanced_lvs
的组合高级LVS规则,接受两个参数:层名和原理图网表文件名。该规则首先调用extract_netlist
规则提取布局网表,然后依次调用match_nodes
、parasitic_check
和functional_check
规则进行节点匹配、寄生元件检测和功能验证。-
extract_netlist(layer):调用网表提取规则,从指定层中提取网表。
-
layout_netlist = “extracted_” + layer + “.sp”:读取提取的布局网表文件名。
-
match_nodes(layout_netlist, schematic_netlist):调用节点匹配规则,对比布局网表和原理图网表中的节点。
-
parasitic_check(layout_netlist, schematic_netlist):调用寄生元件检测规则,检测布局中的寄生元件。
-
functional_check(layout_netlist, schematic_netlist):调用功能验证规则,验证电路的功能是否符合预期。
-
-
advanced_lvs(“metal1”, “schematic.sp”):调用组合高级LVS规则,指定层名
metal1
和原理图网表文件名schematic.sp
。
5. CalibreDRC与CalibreLVS的集成
5.1 集成的意义
CalibreDRC和CalibreLVS是芯片设计流程中的两个关键工具。通过将它们集成在一起,可以实现更全面的设计验证,提高设计的可靠性和良率。集成后的流程可以包括:
-
DRC检查:确保设计的物理布局符合制造工艺的限制和要求。
-
LVS检查:确保设计的物理布局与原理图完全一致。
-
报告整合:将DRC和LVS的检查结果整合到一个报告中,方便用户进行综合分析和修正。
5.2 集成的工作流程
集成CalibreDRC和CalibreLVS的工作流程通常包括以下几个步骤:
-
读取设计文件:从GDSII文件中读取设计的物理布局。
-
解析设计规则文件:读取并解析设计规则文件(通常是.rul文件)。
-
执行DRC检查:根据设计规则文件中的规则,对设计进行详细的DRC检查。
-
生成DRC报告:输出DRC检查结果,通常包括违反规则的区域、规则ID和描述等信息。
-
读取原理图文件:从SPICE文件中读取设计的原理图。
-
执行LVS检查:根据定义的LVS规则,对比布局和原理图的数据。
-
生成LVS报告:输出LVS检查结果,通常包括不匹配的区域、网表差异等信息。
-
结果整合:将DRC和LVS的检查结果整合到一个报告中,方便用户进行综合分析和修正。
5.3 示例代码
以下是一个将CalibreDRC和CalibreLVS集成的示例脚本:
// 定义DRC检查规则
RULE drc_check (gds_file, rule_file)
{
// 读取设计文件
design = streamin(gds_file);
// 解析设计规则文件
rules = read_rules(rule_file);
// 执行DRC检查
drc_violations = drc(design, rules);
// 生成DRC报告
write_report(drc_violations, "drc_report.txt");
}
// 定义LVS检查规则
RULE lvs_check (gds_file, spice_file, rule_file)
{
// 读取设计文件
design = streamin(gds_file);
// 读取原理图文件
schematic = read_netlist(spice_file);
// 解析LVS规则文件
lvs_rules = read_rules(rule_file);
// 提取布局网表
layout_netlist = extract(design);
// 执行LVS检查
lvs_results = compare(layout_netlist, schematic, lvs_rules);
// 生成LVS报告
write_report(lvs_results, "lvs_report.txt");
}
// 定义集成检查规则
RULE integrated_check (gds_file, rule_file, spice_file, lvs_rule_file)
{
// 执行DRC检查
drc_check(gds_file, rule_file);
// 执行LVS检查
lvs_check(gds_file, spice_file, lvs_rule_file);
// 读取DRC报告
drc_report = read_report("drc_report.txt");
// 读取LVS报告
lvs_report = read_report("lvs_report.txt");
// 整合DRC和LVS报告
combined_report = combine_reports(drc_report, lvs_report);
// 输出整合后的报告
write_report(combined_report, "combined_report.txt");
}
// 调用集成检查规则
integrated_check("design.gds", "rules.rul", "schematic.sp", "lvs_rules.rul");
5.3.1 代码解释
-
RULE drc_check (gds_file, rule_file):定义一个名为
drc_check
的规则,接受两个参数:GDSII文件名和设计规则文件名。该规则执行DRC检查,并生成DRC报告。-
design = streamin(gds_file):从GDSII文件中读取设计数据。
-
rules = read_rules(rule_file):读取并解析设计规则文件。
-
drc_violations = drc(design, rules):执行DRC检查,生成违反规则的区域信息。
-
write_report(drc_violations, “drc_report.txt”):将DRC检查结果写入新的文本文件,名称为
drc_report.txt
。
-
-
RULE lvs_check (gds_file, spice_file, rule_file):定义一个名为
lvs_check
的规则,接受三个参数:GDSII文件名、SPICE文件名和LVS规则文件名。该规则执行LVS检查,并生成LVS报告。-
design = streamin(gds_file):从GDSII文件中读取设计数据。
-
schematic = read_netlist(spice_file):从SPICE文件中读取原理图数据。
-
lvs_rules = read_rules(rule_file):读取并解析LVS规则文件。
-
layout_netlist = extract(design):从设计中提取布局网表。
-
lvs_results = compare(layout_netlist, schematic, lvs_rules):对比布局网表和原理图数据,生成LVS检查结果。
-
write_report(lvs_results, “lvs_report.txt”):将LVS检查结果写入新的文本文件,名称为
lvs_report.txt
。
-
-
RULE integrated_check (gds_file, rule_file, spice_file, lvs_rule_file):定义一个名为
integrated_check
的组合检查规则,接受四个参数:GDSII文件名、设计规则文件名、SPICE文件名和LVS规则文件名。该规则首先调用drc_check
规则执行DRC检查,然后调用lvs_check
规则执行LVS检查,最后整合DRC和LVS的检查结果。-
drc_check(gds_file, rule_file):调用DRC检查规则。
-
lvs_check(gds_file, spice_file, lvs_rule_file):调用LVS检查规则。
-
drc_report = read_report(“drc_report.txt”):读取DRC报告文件。
-
lvs_report = read_report(“lvs_report.txt”):读取LVS报告文件。
-
combined_report = combine_reports(drc_report, lvs_report):整合DRC和LVS的检查结果。
-
write_report(combined_report, “combined_report.txt”):将整合后的检查结果写入新的文本文件,名称为
combined_report.txt
。
-
-
integrated_check(“design.gds”, “rules.rul”, “schematic.sp”, “lvs_rules.rul”):调用组合检查规则,指定GDSII文件名
design.gds
、设计规则文件名rules.rul
、SPICE文件名schematic.sp
和LVS规则文件名lvs_rules.rul
。
通过以上集成示例,用户可以更加高效地进行芯片设计验证,确保设计不仅符合制造工艺的要求,还与原理图完全一致,从而提高设计的可靠性和良率。