在使用电压相关规则(Voltage Dependent Rules, VDR)进行版图设计时,准确标注电压信息至关重要。Cadence Virtuoso 提供的 VDR Sanity Checker 工具能够自动验证版图电压标签的一致性,帮助设计人员快速发现电压标注错误,确保设计质量。本文将详细介绍这一工具的功能、使用方法及其检查能力。
应用背景
为什么需要电压标签验证?
在先进工艺节点的模拟/混合信号 IC 设计中,电压相关规则(VDR)变得越来越重要:
- 工艺约束:不同电压域之间的间距规则不同
- 可靠性要求:电压差异会影响氧化层厚度、金属间距等设计规则
- 复杂性增加:多电压域设计中,手动标注电压标签容易出错
- 验证需求:需要确保版图标签与原理图定义的电压值一致
常见问题
- 版图中电压标签缺失或不完整
- 标签电压值与原理图不匹配
- 同一网络在不同层上标注了不同的电压值(本文重点关注)
- 电压域边界处的标注错误
VDR Sanity Checker 工具介绍
适用版本
- IC 6.1.8.500.2 及以上
- ICADVM18.1.500.2(ISR2) 及以上
菜单路径
1
Virtuoso XL Layout Editor → Tools → Voltage Dependent Rules → Sanity Checker
前置条件
[!IMPORTANT] 必须在约束管理器(Constraint Manager)中指定正确的约束组(Constraint Group),否则该菜单将显示为灰色(不可用状态)。
1
envSetVal("layout" "vdrConstraintGroupName" 'string "VDR_CG")
如何定义约束组?
VDR 约束组必须在技术库文件(Technology File)中定义。约束组的作用是告诉 Sanity Checker:
- 哪些层(Layer-Purpose Pairs)是用来标记电压的
- 这些电压标记层对应哪些物理网络层
定义步骤
步骤 1:导出技术库
1
File → Export → Technology File
选择 ASCII 格式导出技术库文件。
步骤 2:编辑 constraintGroups 部分
在技术库文件中添加或编辑约束组定义。根据 Virtuoso Technology Data Constraints Reference 验证的官方语法:
constraintGroups(
( "VDR_CG"
spacings(
; 定义电压标签映射 - 每个物理层需要单独定义
( voltageLabelMapping "text" 'layer "metal1" 'purpose "drawing" )
( voltageLabelMapping "text" 'layer "metal2" 'purpose "drawing" )
( voltageLabelMapping "text" 'layer "metal3" 'purpose "drawing" )
( voltageLabelMapping "text" 'layer "metal4" 'purpose "drawing" )
; 定义错误标记层 - 在 y0/drawing 层生成 Marker
( voltageMarkerMapping "y0" 'layer "metal1" 'purpose "drawing" )
( voltageMarkerMapping "y0" 'layer "metal2" 'purpose "drawing" )
( voltageMarkerMapping "y0" 'layer "metal3" 'purpose "drawing" )
( voltageMarkerMapping "y0" 'layer "metal4" 'purpose "drawing" )
)
)
)
语法说明:
voltageLabelMapping:( voltageLabelMapping tx_layer 'layer t_layer 'purpose t_purpose [t_voltage] )tx_layer:电压标签放置的层(如"text")'layer t_layer:目标物理层(如"metal1")'purpose t_purpose:目标层的 purpose(如"drawing")t_voltage(可选):"minVoltage"或"maxVoltage"
voltageMarkerMapping:( voltageMarkerMapping tx_layer 'layer t_layer 'purpose t_purpose )- 定义当发现电压不一致时,在哪个层生成 Marker 标记
[!IMPORTANT] 关键要点:如果要将一个标签层(如
text/drawing)映射到多个物理层,必须为每个物理层单独定义一条映射规则,不能使用嵌套列表。
步骤 3:重新导入技术库
1
File → Import → Technology File
将修改后的 ASCII 技术库文件重新编译到设计库中。
步骤 4:在启动文件中设置环境变量
在 .cdsinit 或启动文件中添加:
1
2
; 设置 VDR 约束组名称
envSetVal("layout" "vdrConstraintGroupName" 'string "VDR_CG")
验证配置
重启 Virtuoso Layout Editor 后:
- 打开版图编辑器
- 检查菜单:
Tools → Voltage Dependent Rules → Sanity Checker - 如果菜单可用(不是灰色)→ 配置成功 ✓
- 如果菜单灰色(不可用)→ 检查:
- 约束组名称是否与技术库中定义的一致
- 技术库是否成功导入
- 环境变量是否正确设置
核心功能与检查能力
两种检查模式
VDR Sanity Checker 提供两种主要的对比验证模式:
1. Check Against Schematic(对比原理图)
功能:将版图上的电压标签与原理图中定义的网络电压进行对比。
工作原理:
- 读取原理图中每个网络的电压属性(通常来自仿真电压定义)
- 检查版图上对应网络的所有电压标签
- 对比标签值与原理图定义值是否一致
典型应用场景:
- 验证版图标注是否正确反映了电路设计意图
- 在原理图驱动的设计流程中进行最终验证
2. Check Against Layout(对比版图网络属性)
功能:将版图上的电压标签与版图自身定义的网络电压属性进行对比。
工作原理:
- 读取版图中每个网络的物理电压属性
- 扫描该网络上所有电压标识层的标签
- 验证所有标签是否与网络属性一致
典型应用场景:
- 纯版图设计流程(无原理图)
- 验证电压传播(Voltage Propagation)结果的正确性
关键检查能力:多标签冲突检测
[!NOTE] 重要发现:VDR Sanity Checker 可以检测出同一个 NET 上多个电压标识层标注不一致的情况。
检测机制
当同一个网络在不同的电压标识层(Voltage Marker Layers)上被标注了不同的电压值时:
- 标签数量检查:工具会检查每个网络的标签数量是否符合预期(通常每个网络应有一个 Vmax 和一个 Vmin 标识)
- 标签值一致性检查:如果存在多个标签,工具会验证它们是否彼此一致
- 与参考值对比:至少有一个标签会与该网络的参考电压(原理图或版图定义)不匹配
警告信息:VDR-5005
当检测到标签异常时,Sanity Checker 会触发 VDR-5005 警告:
1
2
*(WARNING)* (VDR-5005): Nets either do not have correct number of
voltage labels or are labeled with incorrect voltage values.
该警告明确指出两类问题:
- 电压标签数量不正确
- 电压标签的值不正确
使用方法
步骤 1:配置约束组
确保已按照上述”如何定义约束组?“章节的说明完成以下配置:
- ✓ 在技术库中定义了约束组(如
VDR_CG) - ✓ 设置了环境变量
vdrConstraintGroupName - ✓ 菜单
Tools → Voltage Dependent Rules → Sanity Checker显示为可用状态
步骤 2:打开 Sanity Checker
- 打开版图编辑器(Virtuoso XL)
- 选择菜单:
Tools → Voltage Dependent Rules → Sanity Checker - 界面应显示可用(非灰色)
步骤 3:选择检查模式
在 Sanity Checker GUI 中:
- 勾选 “Check Against Schematic”:对比原理图电压
- 或勾选 “Check Against Layout”:对比版图网络属性
- 可同时勾选两者进行双重验证
步骤 4:运行检查
点击 Apply 按钮,工具开始扫描并验证所有网络的电压标签。
步骤 5:查看结果
CIW 报告
在 CIW(命令解释窗口)中会生成详细的报告表格:
| Net Name | Net Voltage (Vmin/Vmax) | Label Voltage (Vmin/Vmax) | Status |
|---|---|---|---|
| VDD | 0.0 / 1.2 | 0.0 / 1.2 | ✓ OK |
| VSS | 0.0 / 0.0 | 0.0 / 0.0 | ✓ OK |
| VDDIO | 0.0 / 1.8 | 0.0 / 2.5 | ✗ Mismatch |
版图 Marker
- 工具会在版图中不匹配的电压标签位置自动生成 Marker
- Marker 会注明错误原因,例如:
Vmax Label Mismatch: Expected 1.8V, Found 2.5VMissing Vmin LabelDuplicate Voltage Labels with Different Values
示例输出
在 CIW 窗口中会显示类似以下的警告信息:
1
2
3
4
5
6
7
*(WARNING)* (VDR-5005): Nets either do not have correct number of
voltage labels or are labeled with incorrect voltage values.
The following nets have voltage label mismatches:
- Net: VDDIO
Expected: Vmin=0.0V, Vmax=1.8V
Found label with: Vmax=2.5V at layer M2_VLABEL
[!NOTE] 具体的输出格式可能因版本而异。可以通过设置
vdrSanityCheckerLogFile环境变量将报告重定向到日志文件。
多层支持
Sanity Checker 会扫描技术库 voltageMarkerMapping 中定义的所有电压标识层:
1
2
3
4
5
6
; 技术库示例配置
voltageMarkerMapping(
(M1_VLABEL "M1" "vlabel")
(M2_VLABEL "M2" "vlabel")
(M3_VLABEL "M3" "vlabel")
)
只要这些层被定义为电压标识层,工具就会自动检查分布在不同金属层上的所有标签。
典型应用场景示例
场景 1:发现标签缺失
问题:设计人员在版图中添加了网络,但忘记标注电压标签。
Sanity Checker 输出:
1
2
WARNING (VDR-5005): Net 'AVDD_CORE' has no voltage labels.
Expected: Vmin=0.0V, Vmax=1.0V
场景 2:检测标签值错误
问题:手动输入电压值时出现笔误,将 1.8V 输入为 1.5V。
Sanity Checker 输出:
1
2
3
WARNING (VDR-5005): Net 'VDDIO' has incorrect Vmax label.
Expected: 1.8V, Found: 1.5V
Marker generated at (125.6, 180.2)
场景 3:检测多层标签冲突(重点场景)
问题:设计人员在 M1 层标注了 1.8V,在 M3 层标注了 2.5V,同一网络出现冲突。
Sanity Checker 输出:
1
2
3
4
5
6
WARNING (VDR-5005): Net 'VDDIO' has conflicting voltage labels.
- M1_VLABEL: Vmax=1.8V
- M3_VLABEL: Vmax=2.5V
- Schematic defines: Vmax=1.8V
Both labels flagged with markers. M3 label is incorrect.
最佳实践
1. 早期验证
在版图设计的各个阶段定期运行 Sanity Checker,而不是等到设计完成后才检查。
2. 结合约束管理器
确保约束组正确配置,包括:
- 电压值定义
- 网络电压属性
- 标识层映射
3. 环境变量配置
可以通过设置环境变量来控制 Sanity Checker 的行为:
1
2
3
4
5
6
7
8
; 设置约束组名称
envSetVal("layout" "vdrConstraintGroupName" 'string "VDR_CG")
; 设置日志文件路径(可选)
envSetVal("layout" "vdrSanityCheckerLogFile" 'string "/path/to/sanity_check.log")
; 设置检查对象类型(Labels, VSync shapes, Userdv shapes)
envSetVal("layout" "vdrSanityCheckerObjectType" 'string "Labels")
通过 SKILL 调用 GUI:
1
2
; 打开 Sanity Checker GUI
vdrSanityCheckerGUI(getCurrentWindow())
4. 版本控制集成
将 Sanity Check 纳入版本提交前的检查流程,确保所有入库的版图都通过了电压标签验证。
技术原理
电压标识层(Voltage Marker Layer)
电压标识层是在技术库中定义的特殊图层,用于承载电压信息:
- Purpose:通常为
vlabel或voltage - 数据类型:文本标签(Label)
- 格式:
Vmin=<value>V Vmax=<value>V
检查算法
VDR Sanity Checker 的基本检查流程:
graph TD
A[开始检查] --> B[读取约束组]
B --> C[获取所有网络]
C --> D{选择检查模式}
D -->|Against Schematic| E[读取原理图电压]
D -->|Against Layout| F[读取版图网络属性]
E --> G[扫描版图电压标签]
F --> G
G --> H{标签数量检查}
H -->|数量异常| I[生成 VDR-5005 警告]
H -->|数量正常| J{标签值检查}
J -->|值不匹配| I
J -->|多标签冲突| I
J -->|全部正确| K[通过验证]
I --> L[生成 Marker]
L --> M[输出报告]
K --> M
M --> N[结束]
容差处理
Sanity Checker 支持设置电压对比的容差(tolerance)来过滤微小差异:
- 数据类型:浮点数(float)
- 默认值:0.00(如果不指定)
- 可配置:通过约束管理器中的 tolerance 参数设置
- 用途:过滤由于仿真精度导致的微小电压差异
常见问题解答
Q1: Sanity Checker 菜单显示为灰色,无法使用?
A: 按以下顺序检查配置:
- 检查环境变量设置
; 在 CIW 中执行 envGetVal("layout" "vdrConstraintGroupName") ; 应该返回您定义的组名,如 "VDR_CG" - 检查技术库中的约束组定义
- 导出技术库查看
constraintGroups部分是否包含该组 - 确认组名与环境变量设置一致
- 导出技术库查看
- 验证语法正确性
- 确保使用了
spacings()块 - 每个物理层映射单独定义,没有使用嵌套列表
- 使用了
'layer和'purpose关键字
- 确保使用了
- 重新导入技术库
- 修改后需要重新导入技术库
- 重启 Virtuoso Layout Editor
Q2: 工具可以检测哪些类型的电压标签错误?
A: VDR Sanity Checker 可以检测:
- ✓ 标签缺失
- ✓ 标签值与参考值不匹配
- ✓ 标签数量异常(多于或少于预期)
- ✓ 同一网络多个标签之间的冲突
- ✓ 标签格式错误
Q3: 如果版图和原理图的电压都不对怎么办?
A: Sanity Checker 会报告两者之间的差异,但无法判断哪个是”正确”的。设计人员需要:
- 检查仿真设置中的电压定义
- 与设计规范对比
- 手动确认正确的电压值
Q4: 多个标签冲突时,工具会标记所有冲突的标签吗?
A: 是的。工具会在所有不匹配或相互冲突的标签位置生成 Marker,并在报告中列出所有标签的具体位置和值。
Q5: 这个工具与 LVS 检查有什么区别?
A:
- LVS(Layout vs Schematic):验证版图与原理图的拓扑一致性(器件、连接关系)
- VDR Sanity Checker:专注于验证电压标签的正确性,属于设计规则检查(DRC)的扩展
两者互补,都是版图验证流程的重要组成部分。
参考资料
- Cadence Support - How to enable Sanity Checker menu
- Virtuoso Technology Data Constraints Reference - voltageMarkerMapping
- Cadence Virtuoso Voltage Dependent Rules Flow Guide
总结
Cadence VDR Sanity Checker 是一个强大而实用的工具,能够自动化验证版图电压标签的一致性。特别是在检测同一网络多个标识层标注不一致方面,它通过 VDR-5005 警告和可视化 Marker 精准定位问题,大大提高了设计效率和准确性。
在实际项目中,建议将 Sanity Check 集成到标准验证流程中,结合约束管理器和自动化脚本,确保所有电压标签的正确性,从而保证设计的可靠性。
延伸阅读: