在 Cadence 仿真流程中,器件端子数量不匹配是一个常见但棘手的问题。本文详细解析 Spectre 的 SFE-45 错误,涵盖两种典型场景及其解决方案。
问题背景
在运行 Spectre 仿真时,可能会遇到 SFE-45 错误,提示器件实例的端子数量与模型定义不符。这类问题通常在以下场景中出现:
- 普通网表:手动创建或自动生成的电路网表
- 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.
用户反馈
“前两天都还是好的,今天突然就报错了。”
分析过程
- 打开
input.scs检查,确实 M1 实例只有 3 个端子 - 执行 Recreate Netlist 后问题依旧
- 器件模型
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 实现(例如 C0 → XC0)。
实施方法
虽然错误由 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 错误时:
- 检查错误信息:确认是哪个实例、哪个模型
- 查看模型定义:在 PDK 中确认实际端子数量
- 检查实例名前缀:是否为 R/L/C/M 等原语前缀
- 应用对应解决方案:
- 普通网表 → 重启 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 |
参考资料
- Cadence Article: Error found by spectre during hierarchy flattening when simulating DSPF netlist
- Spectre Circuit Simulator User Guide
- Virtuoso ADE Product Suite User Guide