在使用电压相关规则(Voltage Dependent Rules, VDR)进行版图设计时,准确标注电压信息至关重要。Cadence Virtuoso 提供的 VDR Sanity Checker 工具能够自动验证版图电压标签的一致性,帮助设计人员快速发现电压标注错误,确保设计质量。本文将详细介绍这一工具的功能、使用方法及其检查能力。

应用背景

为什么需要电压标签验证?

在先进工艺节点的模拟/混合信号 IC 设计中,电压相关规则(VDR)变得越来越重要:

  1. 工艺约束:不同电压域之间的间距规则不同
  2. 可靠性要求:电压差异会影响氧化层厚度、金属间距等设计规则
  3. 复杂性增加:多电压域设计中,手动标注电压标签容易出错
  4. 验证需求:需要确保版图标签与原理图定义的电压值一致

常见问题

  • 版图中电压标签缺失或不完整
  • 标签电压值与原理图不匹配
  • 同一网络在不同层上标注了不同的电压值(本文重点关注)
  • 电压域边界处的标注错误

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:

  1. 哪些层(Layer-Purpose Pairs)是用来标记电压的
  2. 这些电压标记层对应哪些物理网络层

定义步骤

步骤 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 后:

  1. 打开版图编辑器
  2. 检查菜单:Tools → Voltage Dependent Rules → Sanity Checker
  3. 如果菜单可用(不是灰色)→ 配置成功 ✓
  4. 如果菜单灰色(不可用)→ 检查:
    • 约束组名称是否与技术库中定义的一致
    • 技术库是否成功导入
    • 环境变量是否正确设置

核心功能与检查能力

两种检查模式

VDR Sanity Checker 提供两种主要的对比验证模式:

1. Check Against Schematic(对比原理图)

功能:将版图上的电压标签与原理图中定义的网络电压进行对比。

工作原理

  • 读取原理图中每个网络的电压属性(通常来自仿真电压定义)
  • 检查版图上对应网络的所有电压标签
  • 对比标签值与原理图定义值是否一致

典型应用场景

  • 验证版图标注是否正确反映了电路设计意图
  • 在原理图驱动的设计流程中进行最终验证

2. Check Against Layout(对比版图网络属性)

功能:将版图上的电压标签与版图自身定义的网络电压属性进行对比。

工作原理

  • 读取版图中每个网络的物理电压属性
  • 扫描该网络上所有电压标识层的标签
  • 验证所有标签是否与网络属性一致

典型应用场景

  • 纯版图设计流程(无原理图)
  • 验证电压传播(Voltage Propagation)结果的正确性

关键检查能力:多标签冲突检测

[!NOTE] 重要发现:VDR Sanity Checker 可以检测出同一个 NET 上多个电压标识层标注不一致的情况

检测机制

当同一个网络在不同的电压标识层(Voltage Marker Layers)上被标注了不同的电压值时:

  1. 标签数量检查:工具会检查每个网络的标签数量是否符合预期(通常每个网络应有一个 Vmax 和一个 Vmin 标识)
  2. 标签值一致性检查:如果存在多个标签,工具会验证它们是否彼此一致
  3. 与参考值对比:至少有一个标签会与该网络的参考电压(原理图或版图定义)不匹配

警告信息: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

  1. 打开版图编辑器(Virtuoso XL)
  2. 选择菜单:Tools → Voltage Dependent Rules → Sanity Checker
  3. 界面应显示可用(非灰色)

步骤 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.5V
    • Missing Vmin Label
    • Duplicate 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:通常为 vlabelvoltage
  • 数据类型:文本标签(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: 按以下顺序检查配置:

  1. 检查环境变量设置
    ; 在 CIW 中执行
    envGetVal("layout" "vdrConstraintGroupName")
    ; 应该返回您定义的组名,如 "VDR_CG"
    
  2. 检查技术库中的约束组定义
    • 导出技术库查看 constraintGroups 部分是否包含该组
    • 确认组名与环境变量设置一致
  3. 验证语法正确性
    • 确保使用了 spacings()
    • 每个物理层映射单独定义,没有使用嵌套列表
    • 使用了 'layer'purpose 关键字
  4. 重新导入技术库
    • 修改后需要重新导入技术库
    • 重启 Virtuoso Layout Editor

Q2: 工具可以检测哪些类型的电压标签错误?

A: VDR Sanity Checker 可以检测:

  • ✓ 标签缺失
  • ✓ 标签值与参考值不匹配
  • ✓ 标签数量异常(多于或少于预期)
  • ✓ 同一网络多个标签之间的冲突
  • ✓ 标签格式错误

Q3: 如果版图和原理图的电压都不对怎么办?

A: Sanity Checker 会报告两者之间的差异,但无法判断哪个是”正确”的。设计人员需要:

  1. 检查仿真设置中的电压定义
  2. 与设计规范对比
  3. 手动确认正确的电压值

Q4: 多个标签冲突时,工具会标记所有冲突的标签吗?

A: 是的。工具会在所有不匹配或相互冲突的标签位置生成 Marker,并在报告中列出所有标签的具体位置和值。

Q5: 这个工具与 LVS 检查有什么区别?

A:

  • LVS(Layout vs Schematic):验证版图与原理图的拓扑一致性(器件、连接关系)
  • VDR Sanity Checker:专注于验证电压标签的正确性,属于设计规则检查(DRC)的扩展

两者互补,都是版图验证流程的重要组成部分。

参考资料

总结

Cadence VDR Sanity Checker 是一个强大而实用的工具,能够自动化验证版图电压标签的一致性。特别是在检测同一网络多个标识层标注不一致方面,它通过 VDR-5005 警告和可视化 Marker 精准定位问题,大大提高了设计效率和准确性。

在实际项目中,建议将 Sanity Check 集成到标准验证流程中,结合约束管理器和自动化脚本,确保所有电压标签的正确性,从而保证设计的可靠性。


延伸阅读