在使用 Virtuoso/ADE 跑 Spectre 仿真时,时不时会在网表里看到某个 subckt 的名字被加上了 _schematic 后缀。这本身只是 netlister 在做”重名消歧”,本来没什么;问题在于当后续要用 include dspf 方式做反标时,DSPF 里没有 _schematic 这个名字,于是反标失效。本文基于 Cadence Support 文章 “Why does the spectre netlister add _schematic extension to subckt names” 整理触发机制、典型场景和解法。


1. 问题描述

在 Spectre 网表里看到类似:

image-20260511140429071

—— 即 cellname 后被 netlister 自动追加了 _schematic

紧接着的副作用:当你想用 DSPF 反标做后仿(典型方式是在 Spectre netlist 里 include "xxx.dspf"),DSPF 文件里写的是原始 cellname(adc_sample_hold),并不会改名带 _schematic,所以 netlist 里 *_schematic 这个 subckt 不会被 DSPF 替换掉,反标失败。

类似的、不止 _schematic 一种形式,还会出现 <libname>_<cellname> 前缀、<cellname>_schematic2(绑定到其它 view 时)、甚至两者叠加。整体可以归并到同一类”netlister 在改写 cellname”。Cadence ADE 用户手册的 Generating Customized Cellnames 一节,以及配套 KB 文章 20359236 已经覆盖了大部分场景,本文聚焦其中容易踩坑的”明明改回同库了,还是带 _schematic“那一类。


2. 一个典型触发流程

考虑下面这种情况:

  1. 顶层 TopCell 在库 dspf_test 中。
  2. 它的内部实例 adc_sample_hold 同时从两个不同的库被引用(config view 里两个 instance 分别绑到 dspf_testdspf_test_2)。image-20260511140530912
  3. 第一次生成网表后,你注意到这两份 adc_sample_hold 来自不同库,于是回到 config view 把它们改成同一个库 —— 但改成的是 dspf_test_2,而不是 Topcell 所在的 dspf_test
  4. 重新跑 Create Netlist。

image-20260511140652098

按理说既然现在两个 instance 都绑到同一个库 dspf_test_2,cell view 完全相同,不应该再有命名冲突。但你会发现:网表里这两个 instance 仍然指向 adc_sample_hold_schematic,并不是干净的 adc_sample_hold

原因是 incremental hierarchical netlisting(ihnl,增量网表):netlister 复用了上一次的 cds netlist 缓存,上一次生成时因为重名加的 _schematic 已经被记下来了,增量重跑并不会回头去清掉这个改写。


3. 解法:Recreate(而不是 Create)

修复办法很简单:在 ADE 里改用 Recreate Netlist(而不是 Create Netlist)。

Recreate 会flush 所有 cds netlist 缓存,从头重新生成;这样上一轮残留的 _schematic 改写就会被清空,新网表里 cellname 恢复为干净的 adc_sample_hold,DSPF 反标也就能正常匹配。

经验上:

  • DSPF / SPEF 反标后跑出来结果不对,先怀疑 cellname 不匹配。 把 DSPF 头部的 .SUBCKT 名字与 spectre netlist 里实际 subckt 名字对一下,再决定是不是反标本身的问题。
  • 任何对 config view、library binding、view name 的调整之后,习惯性走一次 Recreate。 它比 debug _schematic 残留快得多。
  • 大型项目里 Recreate 会比 incremental 慢若干倍 —— 这是 ihnl 存在的本意。日常迭代仍然用 incremental,只在结构性变更(换库、换 view、加 dspf)之后做一次 Recreate。

4. 何时 netlister 会加后缀:9 种典型场景

Cadence 文章列了 9 个会触发 cellname 改写的案例。它们的共同主题都是:netlister 在同一份网表里发现两个语义”应当不同”但默认名字会撞掉的 subckt,于是用后缀(_schematic_<viewName>)或前缀(<libname>_)来消歧。

Case 触发条件 改写形式  
1 单 lib、单 cell,两个不同的 view,inherited view list 一致 _schematic image-20260511140821360
2 两组 cell:lib 名不同 / cell 名相同 / view 名相同 _schematic image-20260511140847012
3 第一组:lib 名不同、cell 名同、view 同 → _schematic
第二组:同 lib 同 cell 同 view(正常合法用法)按预期重复出现,内部内容形如 Case 2
_schematic image-20260511140916228
4 单层级 cell,内部内容形如 Case 2 _schematic image-20260511140944723
5 同 Case 4,但通过 config view 切到另一个 view _<viewName> 例如 _schematic2 image-20260511141006745
6 同一个 cell 来自 3 个不同 lib —— 第一个保持原名,第二个加 _schematic,第三个再叠加 <libname>_ _schematic + <libname>_ 前缀 image-20260511141019831
7 上述若干情况的组合 综合 image-20260511141134071
8 上述若干情况的组合 综合 image-20260511141143845
9 类似组合,但 cellname 以数字开头 —— 同时被加 lib 名前缀(数字开头不是合法 SPICE 标识符) <libname>_ 前缀 + 其它 image-20260511141206328

几条可以记下来的规律:

  • _schematic 总是和”同名 cell 来自不同 lib 或不同 view”绑定。只要保证一层网表里同名 cell 只来自一个 lib + 一个 view,就不会撞。
  • _<viewName> 形式说明 netlister 看到的 view 不是默认的 schematic,而是 config view 切换过去的另一个 view(例如 schematic2schematic_layout 等)。
  • <libname>_ 前缀有两种触发源:
    • 多 lib 同名 cell 的多重冲突(Case 6);
    • cellname 以数字 / 非法字符开头(Case 9)—— 这一种和 ihnl 无关,不能用 Recreate 修掉,应该直接改 cellname。

5. 实战检查清单

遇到 _schematic 或其它前后缀时,按这个顺序排查:

  1. 打开生成的网表grep 一下加后缀的 cell:
    1
    
    grep -n "subckt .*_schematic" input.scs
    

    看是哪一个 cell 被改名。

  2. 回到 config view / library manager,确认该 cell 的所有 instance 绑定的 (lib, cell, view) 三元组是否唯一。
  3. 若三元组现在已经唯一,但网表里还在 _schematic —— 走 Recreate Netlist
  4. 若三元组本就不唯一(业务上确实需要两份不同的 cell 共存),那么 _schematic 是必要的,不该消除;但要注意 DSPF / SPEF 反标也得相应改名,否则反标不会命中。
  5. 若是 _<otherView> 形式,检查 config view 是不是把某些 instance 切到了非 schematic view,根据业务决定是改 config 还是接受这个后缀。
  6. 若是 <libname>_<cellname> 前缀且 cellname 数字开头,改 cellname

6. 小结

  • _schematic 后缀本质是 Spectre netlister 的重名消歧机制,正常情况下并不是错误。
  • 麻烦在于它会在 DSPF/SPEF 反标流程里挡路 —— DSPF 不会跟着改名。
  • 大多数”我已经改回单一 lib 了但还是带 _schematic“的情况是 incremental netlisting (ihnl) 缓存了上一轮的改名结果。用 Recreate Netlist 强制清缓存重生成即可。
  • 凡是涉及到 cellname 改写的,先核对 (lib, cell, view) 三元组是否唯一,再决定走 Recreate、改 config view 还是改 cellname 本身。

参考