在 Cadence 仿真流程中,器件端子数量不匹配是一个常见但棘手的问题。本文详细解析 Spectre 的 SFE-45 错误,涵盖两种典型场景及其解决方案。


问题背景

在运行 Spectre 仿真时,可能会遇到 SFE-45 错误,提示器件实例的端子数量与模型定义不符。这类问题通常在以下场景中出现:

  1. 普通网表:手动创建或自动生成的电路网表
  2. DSPF 网表:由 Quantus Smart View 提取的寄生参数网表

问题 1:普通器件端子数量错误

错误现象

1
2
3
ERROR(SFE-45): "input.scs" 24: Cannot run the simulation because the instance 
`M1' of `pch_ulvt_mac' requires 4 terminals, but has only 3 terminal specified. 
Specify the required 4 terminals for the instance and rerun the simulation.

用户反馈

“前两天都还是好的,今天突然就报错了。”

分析过程

  1. 打开 input.scs 检查,确实 M1 实例只有 3 个端子
  2. 执行 Recreate Netlist 后问题依旧
  3. 器件模型 pch_ulvt_mac 定义为 4 端子器件

解决方法

重启 Virtuoso,重新生成网表

1
2
3
# 1. 完全退出 Virtuoso
# 2. 重新启动 Virtuoso
# 3. 在 ADE 中执行 Simulation > Netlist > Recreate

重新生成后,M1 实例正确包含 4 个端子。

[!NOTE] 这类问题通常是 Virtuoso session 缓存导致的器件定义不同步。定期重启可避免此类问题。


问题 2:DSPF 网表中的端子数量错误

错误现象

1
2
3
ERROR (SFE-45): "<file_path>.dspf" 317: Cannot run the simulation because the 
instance `C0' of `g45cmim' requires 3 terminals, but has only 2 terminal specified. 
Specify the required 3 terminals for the instance and rerun the simulation.

根本原因分析

器件定义

  • 器件模型 g45cmim 是一个三端子子电路(subcircuit 或 inline subcircuit)

冲突点

  • DSPF 网表中实例名为 C0,以字符 C 开头
  • Spectre 将所有以 C 开头的实例视为原始电容器(primitive capacitor)
  • 原始电容器默认只有 2 个端子

冲突逻辑

1
2
3
4
5
DSPF 网表:    C0 是子电路实例(3 端子)
              ↓
Spectre 解析: C 前缀 → 原始电容(2 端子)
              ↓
            端子数量不匹配 ❌

[!WARNING] 此问题也可能影响其他器件类型(R、L、M 等),只要实例名前缀暗示它是标准原语,但实际端子数量与标准不同。


解决方案:添加 ‘X’ 前缀

核心思路

强制 Spectre 将器件视为子电路而非原语,通过在实例名前添加前缀 X 实现(例如 C0XC0)。

实施方法

虽然错误由 Spectre 报出,但解决方案在 Virtuoso (ADE) 侧实施,通过 cdsenv 变量修改 DSPF 网表生成行为。

版本要求

  • IC618/ICADVM201 ISR25 或更高版本

环境变量设置

方法 1:在 .cdsenv 中添加

1
maestro.simulation dspfNamePrefixSimInfo string "spectre"

方法 2:在 .cdsinit 中加载

envSetVal("maestro.simulation" "dspfNamePrefixSimInfo" 'string "spectre")

方法 3:在 CIW 中临时设置

envSetVal("maestro.simulation" "dspfNamePrefixSimInfo" 'string "spectre")

工作原理

dspfNamePrefixSimInfo 变量说明

设置值 说明
"spectre" 使用 Spectre 仿真信息中的 namePrefix(通常为 ‘X’)
"auCdl" 使用 auCdl 仿真信息中的 namePrefix
"hspiceD" 使用 hspiceD 仿真信息中的 namePrefix

网表变化示例

设置前:

C0 net1 net2 sub g45cmim L=10e-6 W=10e-6

设置后:

XC0 net1 net2 sub g45cmim L=10e-6 W=10e-6

添加 X 前缀后,Spectre 将 XC0 识别为子电路实例,正确处理 3 个端子。


最佳实践

1. 环境配置

在项目级 .cdsenv 中统一设置:

1
maestro.simulation dspfNamePrefixSimInfo string "spectre"

2. 调试步骤

当遇到 SFE-45 错误时:

  1. 检查错误信息:确认是哪个实例、哪个模型
  2. 查看模型定义:在 PDK 中确认实际端子数量
  3. 检查实例名前缀:是否为 R/L/C/M 等原语前缀
  4. 应用对应解决方案
    • 普通网表 → 重启 Virtuoso
    • DSPF 网表 → 设置 dspfNamePrefixSimInfo

3. 预防措施

  • 定期重启 Virtuoso:避免缓存导致的定义不同步
  • 项目初始化时配置环境变量:在 .cdsenv 中提前设置
  • PDK 文档化:记录特殊器件的端子数量

注意事项

[!CAUTION] 不要直接修改 PDK 的 CDF!

虽然可以在 CDF 中修改 namePrefix 来解决此问题,但这可能会破坏其他设计流程,例如:

  • LVS 验证失败
  • DRC 规则失效
  • 其他工具的网表解析错误

正确的做法是通过 环境变量 在网表生成阶段动态调整前缀。


相关命令速查

操作 命令/路径
重新生成网表 ADE → Simulation → Netlist → Recreate
查看当前环境变量 envGetVal("maestro.simulation" "dspfNamePrefixSimInfo")
设置环境变量 envSetVal("maestro.simulation" "dspfNamePrefixSimInfo" 'string "spectre")
保存默认设置 CIW → Options → Save Defaults

参考资料