在 IC 设计的网表生成过程中,OSSHNL (OpenAccess Schematic Hierarchical Netlister) 错误是最常见也最令人困扰的问题之一。本文基于 Cadence 官方支持网站的深入调研,详细解析三个高频错误代码的根本原因、触发场景和解决方案。
研究背景
在日常仿真工作中,经常会遇到各种 OSSHNL 错误阻止网表生成,导致仿真无法进行。通过对 Cadence 官方支持网站的系统调研,我们整理出三个最常见且影响最大的错误代码及其官方解决方案。
OSSHNL 概述
OSSHNL (OpenAccess Schematic Hierarchical Netlister) 是 Cadence 的层次化网表生成器,负责将 schematic 设计转换为仿真器可用的网表文件(如 CDL、Spectre netlist 等)。
OSSHNL-408: PCell 求值错误 🔴
错误级别
Critical Error - 完全阻止网表生成
完整错误信息
1
2
3
ERROR (OSSHNL-408): Failed to generate the netlist because of a PCell
evaluation error on cellview 'lib/cell/view'. Set simDetectPCellFailure
to "ignore" to prevent this error.
根本原因
这是 Cadence 在 IC 6.1.8 ISR8 / ICADVM 18.1 ISR8 中引入的重大行为变更:
旧版本行为:
- PCell 求值失败 → 生成警告
- 网表继续生成(可能不正确)
新版本行为 (ISR8+):
- PCell 求值失败 → 产生错误
- 网表生成中止
技术层面原因:
si二进制程序(netlister)运行时缺少 SKILL 上下文文件- 特别是
dbRead.cxt文件,它包含求值 schematic PCell 所需的 SKILL 函数 - 当 PCell 包含复杂参数化逻辑时,没有这些上下文文件会导致求值失败
常见触发场景
- 在 IC 6.1.8 ISR8 或更高版本运行
auCdl或sinetlisting - Schematic 中使用了依赖特定 SKILL 函数的 PCell
- 从旧版本 Virtuoso 升级后,原有设计无法生成网表
- 使用了第三方 PDK 提供的复杂 PCell
解决方案
方案 1:临时绕过(快速修复)
在项目目录的 .simrc 文件中添加:
simDetectPCellFailure = "ignore"
效果:
- ✅ 允许网表继续生成
- ⚠️ PCell 可能无法正确展开
- ⚠️ 生成的网表可能包含错误
适用场景:紧急情况下临时使用,不推荐长期使用
方案 2:加载缺失的上下文(推荐)
在 .simrc 文件中添加:
loadContext(prependInstallPath("/etc/context/64bit/dbRead.cxt"))
效果:
- ✅ 根本解决问题
- ✅ PCell 正确求值
- ✅ 生成正确的网表
原理:预先加载 dbRead.cxt 上下文文件,提供 PCell 求值所需的 SKILL 函数。
方案 3:升级软件(永久修复)
升级到 IC 6.1.8 ISR10 或更高版本
改进:
- Cadence 在 ISR10 中修复了 CCR 2208154
- 所有必需的上下文文件会自动加载
- 无需手动配置
官方文档
- Article ID: a1O3w000009beiCEAQ
- 标题: IC618/ICADVM18.1 ISR8: auCdl netlisting failing with PCell Eval error
OSSHNL-940: 重复的 Cell 名称 ⚠️
错误级别
Warning - 不阻止网表生成,但可能产生错误结果
完整警告信息
1
2
WARNING (OSSHNL-940): Same Cell name 'CellName' is present in multiple
libraries - LibA and LibB.
根本原因
网表生成器在 cds.lib 定义的库搜索路径中发现多个库包含同名的 cell。
潜在危险:
- Netlister 根据
cds.lib中的库搜索顺序选择第一个匹配的 cell - 如果搜索顺序不正确,可能选中错误版本的 cell
- 导致网表包含错误的电路逻辑
- 仿真结果不可预测
常见触发场景
- 多版本 PDK 同时加载
1 2
DEFINE tsmc28_v1.0 /path/to/v1.0 DEFINE tsmc28_v1.1 /path/to/v1.1 # cell 名称重复
- 项目库重名
1 2
DEFINE OLD_PROJECT /path/to/old DEFINE NEW_PROJECT /path/to/new # 从 OLD 复制过来,cell 名称相同
- 供应商切换时保留旧库
1 2
DEFINE VENDOR_A_LIB /path/to/vendor_a DEFINE VENDOR_B_LIB /path/to/vendor_b # 相同功能,相同命名
解决方案
方案 1:清理 cds.lib(推荐)
编辑 cds.lib 文件:
1
2
3
4
5
6
# 移除不必要的库引用
# DEFINE old_lib /path/to/old_lib # 注释掉或删除
# 或调整库的优先级顺序(正确的库放在前面)
DEFINE correct_lib /path/to/correct # 优先使用
DEFINE backup_lib /path/to/backup # 备用
检查顺序:
- 按从上到下的顺序搜索
- 第一个匹配的库会被使用
方案 2:重命名 Cell
使用批量重命名工具:
; 使用 CCSRenamePrefixFast.il 工具
load("CCSRenamePrefixFast.il")
renameLibs = list("DUPLICATE_LIB")
scanLibs = list("DUPLICATE_LIB" "TOP_LIB")
; 添加唯一前缀
CCSRenamePrefixFast(renameLibs scanLibs "rename_map.txt")
映射文件 rename_map.txt:
1
2
# 给冲突的 cell 添加前缀
CELL_ LIB2_CELL_
方案 3:控制消息显示
设置环境变量(仅在某些 Virtuoso 版本可用):
1
setenv issueInfoMsgOnCellRename 0
[!WARNING] 这只是隐藏警告消息,不解决根本问题。网表仍可能使用错误的 cell。
最佳实践
- 命名规范
- 为不同项目/库使用唯一的 cell 命名前缀
- 例如:
PROJ_A_INV,PROJ_B_INV
- 库管理
- 定期审查
cds.lib,移除不再使用的库 - 使用版本后缀:
PDK_V1,PDK_V2
- 定期审查
- 版本控制
cds.lib纳入版本控制(Git)- 记录每次库引用的变更原因
官方文档
OSSHNL-117: 忽略视图(View) 🔴
错误级别
Error/Warning - 可能导致网表不完整或仿真失败
完整错误信息
1
2
ERROR/WARNING (OSSHNL-117): The design view 'lib/cell/view' of instance
'I1' is being ignored because it is not in the switch list or stop view list.
根本原因
Virtuoso 网表生成器需要为每个层次的实例选择合适的视图(view)进行展开或停止:
Switch View List(切换视图列表):
- 定义哪些视图用于层次展开(继续往下遍历)
- 常见值:
schematic,cmos_sch,av_extracted
Stop View List(停止视图列表):
- 定义哪些视图作为叶子单元(停止遍历,直接网表化)
- 常见值:
spectre,veriloga
触发错误的条件: 实例有可用的视图,但所有视图都不在 Switch List 或 Stop List 中 → netlister 忽略该实例
后果:
- 连接断开
- 网表不完整
- 仿真失败或结果错误
常见触发场景
- Post-Layout 仿真
1 2
使用 Calibre 提取的 av_extracted 视图 但 ADE 环境的 Switch List 中没有配置
- PDK 切换
1 2 3
旧 PDK: spectre view 新 PDK: cdl view ADE 环境未更新 view 列表
- Verilog-A 模型
1 2
使用 veriloga view 的行为模型 Stop List 中缺少 veriloga
解决方案
步骤 1:检查实例的可用视图
在 CIW 中运行:
; 检查某个 instance 有哪些视图
cv = dbOpenCellView("LIB" "CELL" "schematic")
inst = dbFindAnyInstByName(cv "I1")
masterCell = dbOpenCellViewByType(inst~>libName inst~>cellName nil)
; 查看 master cell 的所有可用视图
foreach(view masterCell~>views
printf("Available view: %s\n" view~>name)
)
dbClose(masterCell)
dbClose(cv)
步骤 2:更新 ADE 环境设置
在 ADE L 或 ADE Explorer 中:
-
打开仿真环境:Setup → Environment
- 更新 Switch View List:
1 2 3 4
当前可能是:spectre cmos_sch schematic symbol 需要添加 post-layout view: av_extracted spectre cmos_sch schematic symbol
- 更新 Stop View List(如果使用 Verilog-A):
1 2 3 4
当前可能是:spectre 需要添加: veriloga spectre
- 点击 OK 保存
步骤 3:验证视图优先级
[!IMPORTANT] Switch View List 的顺序很重要! 从左到右,优先级递减。
正确顺序示例:
1
av_extracted → spectre → cmos_sch → schematic → symbol
含义:
- 优先使用
av_extracted(layout-extracted) - 如果没有,使用
spectre - 依次降级
实际案例
问题描述: 使用 post-layout netlist 进行仿真时,出现 OSSHNL-117 错误:
1
2
ERROR (OSSHNL-117): The design view 'ANALOG_LIB/OPA/av_extracted'
of instance 'I_OPA' is being ignored...
排查过程:
- 确认
OPAcell 确实有av_extractedview - 检查 ADE Environment 设置
发现问题:
1
2
Switch View List: spectre schematic symbol
(没有 av_extracted)
解决方法:
1
2
Setup → Environment → Switch View List
更新为:av_extracted spectre schematic symbol
结果:错误消失,仿真成功运行
官方文档
- Article ID: a1O0V000006Al6NUAS
- 标题: OSS HNL (Hierarchical Netlister) Troubleshooting Guide
快速参考表
| 错误代码 | 严重程度 | 根本原因 | 主要修复方法 | 影响范围 |
|---|---|---|---|---|
| OSSHNL-408 | 🔴 Error | PCell 求值失败 | 在 .simrc 加载 dbRead.cxt 或升级 ISR |
阻止网表生成 |
| OSSHNL-940 | ⚠️ Warning | 多库包含同名 cell | 清理 cds.lib 或重命名 cell |
可能使用错误版本 |
| OSSHNL-117 | 🔴 Error | View 不在 switch/stop list | 在选ADE Environment 添加缺失view | 实例被忽略 |
调试流程图
当网表生成失败时,按以下流程排查:
graph TD
A[Netlist 生成失败] --> B{检查 CIW 错误代码}
B -->|OSSHNL-408| C[PCell 求值错误]
C --> C1{检查 Virtuoso 版本}
C1 -->|IC618 ISR8+| C2[在 .simrc 加载 dbRead.cxt]
C1 -->|旧版本| C3[考虑升级到 ISR10+]
C2 --> F[重新生成 netlist]
C3 --> F
B -->|OSSHNL-940| D[重复 Cell 名称]
D --> D1[打开 cds.lib]
D1 --> D2{检查库搜索顺序}
D2 -->|顺序错误| D3[调整库顺序]
D2 -->|有冗余库| D4[移除不用的库]
D3 --> F
D4 --> F
B -->|OSSHNL-117| E[View 被忽略]
E --> E1[检查instance master的可用视图]
E1 --> E2[ADE → Setup → Environment]
E2 --> E3[添加缺失view到Switch/Stop List]
E3 --> F
F[重新生成 netlist] --> G{检查是否成功}
G -->|成功| H[开始仿真]
G -->|失败| I[检查其他错误]
相关错误代码
- OSSHNL-325: Place master 被修改(与 OSSHNL-117 类似,master 不一致)
- CDSGDM-117: GDM 层面的视图切换警告(与 OSSHNL-117 相关)
- OSSHNL-408: 本文已详细介绍
后续建议
1. 建立标准化的 .simrc 配置
创建项目级 .simrc 模板:
; ========================
; Standard .simrc Template
; ========================
; Fix OSSHNL-408 (PCell evaluation error)
loadContext(prependInstallPath("/etc/context/64bit/dbRead.cxt"))
; Control PCell failure behavior
simDetectPCellFailure = "warn" ; 或 "ignore"(根据团队需求)
; 其他仿真设置
; ...
2. 定期审查 cds.lib
建立 review checklist:
- 移除不再使用的库引用
- 确保库搜索顺序符合项目需求
- 检查是否有重名 cell(OSSHNL-940)
- 库路径是否正确
3. ADE 环境模板化
为不同仿真场景创建标准环境:
Pre-layout 仿真:
1
2
Switch View List: spectre cmos_sch schematic symbol
Stop View List: spectre veriloga
Post-layout 仿真:
1
2
Switch View List: av_extracted calibre spectre schematic symbol
Stop View List: spectre veriloga
4. 版本升级计划
如果频繁遇到 OSSHNL-408,考虑:
- 评估升级到 IC 6.1.8 ISR10+ 的可行性
- 跟踪 Cadence 的 ISR 发布说明
- 了解每个 ISR 修复的 bug
总结
本文基于 Cadence 官方支持网站的深入调研,系统梳理了三个最常见的 OSSHNL 错误代码:
- OSSHNL-408: IC 6.1.8 ISR8+ 的 PCell 求值机制变更导致,需加载
dbRead.cxt或升级软件 - OSSHNL-940: 多库同名 cell 警告,通过规范
cds.lib管理避免 - OSSHNL-117: View 配置不当导致实例被忽略,需正确配置 ADE Environment
关键要点:
- ✅ 使用官方推荐的解决方案,避免临时 workaround
- ✅ 建立标准化的项目配置模板(
.simrc, ADE Environment) - ✅ 定期维护
cds.lib,避免库引用混乱 - ✅ 了解 Virtuoso 版本差异,合理规划升级
掌握这些错误的根本原因和系统解决方法,可以大大提高 IC 设计中网表生成和仿真的效率,减少不必要的调试时间。
参考资源
Cadence 官方文档
- Article a1O3w000009beiCEAQ - OSSHNL-408 PCell Error
- Article a1O0V000006Al6NUAS - OSS HNL Troubleshooting Guide
- Virtuoso ADE User Guide - Environment Variables
调研记录
本文档基于 2026年1月27日对 Cadence 官方支持网站的系统调研。所有解决方案均来自官方知识库文章和用户指南。