在当今的集成电路设计中,随着设计复杂度增加,节点和元件数量呈指数级增长。仿真信号的盲目保存会消耗大量的磁盘空间并延长仿真时间。Cadence 的 “Using Spectre SAVE Effectively” (RAK) 详细介绍了如何通过 saveoptions 语句精确控制信号保存,本文旨在全面总结该 RAK 的核心技术点。


1. 基础 save 语句语法

save 语句用于指定需要保存的信号。其基本格式支持以下参数:

  • signalName: 节点的名称(如 save vout)。
    • 使用 :q:dynamic 后缀保存节点电荷而非电压(如 save 7:q)。
  • compName: 元件名称,用于保存该元件内部的信号。
  • modifier: 修饰符,用于指定保存的具体内容,如端口名、端口索引、工作点名称、参数名或 VerilogA 内部变量。

常用关键字 (Keywords)

关键字 用途
currents 保存器件的所有电流
static 保存器件的电阻电流
displacement 保存器件的电容电流
dynamic 保存器件的电荷或磁通
oppoint 保存器件的工作点参数 (Operating Points)
probe 使用探针测量电流
pwr 保存电路、子电路或器件的功耗
all 保存器件的所有关联信号

2. 进阶 save 控制参数

除了基础语法,save 语句还支持丰富的控制参数:

  • depth=num: 控制通配符匹配的深度。默认匹配所有层级。
  • sigtype: 定义保存对象的类型,可选 node (默认), dev, subckt, 或 all
  • devtype: 限制特定类型的器件。
  • subckt=subckt_master: 仅保存特定子电路 master 实例中的信号。
  • exclude: 使用通配符排除特定的信号列表。
  • compression: 控制波形压缩(no, all, wildcardonly)。
  • ports=yes/no: 是否保存子电路的端口名称。
  • filter=rc: 过滤掉仅连接到寄生元件的内部 RC 节点。
  • probelvl=num: 递归探测层级中的终端电流深度。
  • time_window: 指定仿真输出的时间窗口(如 time_window=[10n 50n])。

3. options 语句中的全局设置

options 语句可以设置仿真器的全局保存行为:

  • save: 定义默认保存的信号级别(selected, allpub, lvlpub, all, none)。
  • nestlvl: 定义子电路输出的层级深度。
  • subcktprobelvl: 定义自动探测子电路终端电流的深度。
  • subcktiprobes: 是否在计算子电路终端电流时插入 iprobe 器件。
  • currents: 全局设置输出电流(selected, all, nonlinear, none)。
  • useprobes: 测量终端电流时是否使用电流探针。
  • useterms: 输出终端标记方式。name 使用节点名(M1:d),index 使用索引(M1:1)。
  • pwr: 全局功耗计算设置(none, all, subckts, devices, total)。
  • savehdlvars: 设置 AHDL(如 Verilog-A)变量的保存级别。

4. 15 个实战场景总结 (Lab 内容概括)

RAK 通过 15 个实验展示了不同需求下的最佳实践:

  1. 保存全设计电压: 使用 saveOptions options save=allpub
  2. 仅保存顶层电压电流: save * *:currents depth=1
  3. 保存特定路径信号: save X1.X1.X1.in(支持多级层级路径)。
  4. 保存指定器件/子电路的所有电流: save X1:currents Q0:currents
  5. 保存至第 n 层级(排除子电路终端电流): save * *:currents depth=n
  6. 保存至第 n 层级(包含子电路终端电流): 设置 subcktprobelvl=n
  7. 保存所有非线性器件电流: options currents=nonlinear
  8. 保存除子电路终端外的所有电流: options currents=all
  9. 特定子电路端口关联信号探测: save Ix_1:portname probelvl=3
  10. 特定网络 (Net) 关联信号探测: save netname:currents probelvl=3
  11. 堆叠 FinFET 参数保存: 配合 subcktoppoint=yes 指定内部管子参数(如 I1:vds)。
  12. DC 与 Transient 工作点保存:
    • 静态:dcOpInfo info what=oppoint
    • 动态:finalTimeOP 或指定 infotimes
  13. 通配符与时间窗口: save X*.* depth=3 time_window=[t1 t2]
  14. 功耗分析:
    • 全局:save :pwr
    • 特定子电路:save X1:pwr
  15. VerilogA 变量及内部信号: saveOptions options saveahdlvars=all

5. ADE Maestro/Explorer GUI 操作建议

在 Virtuoso ADE 界面中,可以通过以下方式实现高效保存:

  • Save Options 表单: 在 Outputs -> Save All 中设置全局参数。
  • Save By Subckt 标签页: (IC6.1.8 ISR3+) 直接在 GUI 中通过表格选择实例、设置深度和信号类型(sigtype)。
  • 外部 .scs 文件: 编写专门的 save.scs 文件,在 Setup -> Model Libraries 中加载,这是管理复杂 save 语句最推荐的方式。

[!TIP] 善用 filter=rc 和通配符排除功能,可以极大减小仿真后产生的 PSF 文件体积,提高波形查看器 (ViVA) 的加载速度。


参考资料

  • Cadence Rapid Adoption Kit: Using Spectre SAVE Effectively (Product Version: IC 6.1.8 ISR17, SPECTRE 20.1 ISR4)