本文整理 Virtuoso ADE 调用 Spectre 时几类容易混淆的存储位置,并说明如何把大型波形和临时文件放到合适的文件系统。内容依据 Cadence ASK 的产品文档与技术文章;部分链接需要 Cadence 客户账号登录后访问。

核心结论:projectDirsaveResDirTMPDIR 控制的不是同一类数据。若主要问题是 transient 波形很大,应优先规划 PSF/PSFXL 结果目录;只修改 TMPDIR 不会自动迁移正式波形结果。

1. 三类路径分别控制什么

路径或变量 主要用途 是否用于大型波形
asimenv.startup/projectDir ADE 默认仿真项目/运行目录的根位置 未另行指定结果目录时可能承载结果
adexl.results/saveResDir ADE XL、Explorer、Assembler 的仿真结果保存位置 是,官方文档明确用于 PSF 仿真结果
TMPDIR Cadence 工具及其子程序使用的通用临时工作区 通常不是正式 PSF/PSFXL 结果目录
adexl.results/useLocalPsfDir 让分布式仿真在远端系统的本地目录保存结果 是,仅适用于相应的分布式运行场景
adexl.results/saveLocalPsfDir 指定上述远端本地结果目录 是,仅在 useLocalPsfDir 启用时使用

Spectre 仿真常见的正式产物包括输入网表、运行日志以及 PSF/PSFXL 结果数据库。具体目录层次会随 ADE L、Explorer、Assembler、history、test、corner、design point 和运行方式变化,不应依赖一套硬编码的固定后缀。

2. 指定 ADE 的默认仿真项目目录

Cadence 的 projectDir 环境变量参考给出的设置接口是:

1
2
3
4
5
6
envSetVal(
  "asimenv.startup"
  "projectDir"
  'string
  "/project/simulation"
)

把它加入 .cdsinit 后,会成为 ADE 使用的默认项目目录。可以在 CIW 中检查当前值:

1
envGetVal("asimenv.startup" "projectDir")

如果多个用户在同一个启动目录中工作,可以按用户名划分目录:

1
2
3
4
5
6
envSetVal(
  "asimenv.startup"
  "projectDir"
  'string
  strcat("/project/simulation_" getShellEnvVar("USER"))
)

Cadence 的技术文章也给出了用 getShellEnvVar("USER") 构造用户专属目录的方式。

参考资料:

3. 把大型 PSF/PSFXL 波形放到独立磁盘

对于 ADE XL、ADE Explorer 和 ADE Assembler,使用 adexl.results/saveResDir 指定仿真结果位置:

1
2
3
4
5
6
envSetVal(
  "adexl.results"
  "saveResDir"
  'string
  "/waveform/spectre_psf"
)

也可以按用户划分:

1
2
3
4
5
6
envSetVal(
  "adexl.results"
  "saveResDir"
  'string
  strcat("/waveform/" getShellEnvVar("USER") "/spectre_psf")
)

在 Explorer/Assembler 的保存选项中,如果选择 Preferred 结果位置,PSF 结果会使用 saveResDir 指定的 preferred location。目录必须可写,并应放在容量、inode 数量和持续写入性能都合适的文件系统上。

参考资料:

saveResDir 是 maestro/ADE XL 系列的结果管理变量。对于旧 ADE L,最保守的做法是把整个 projectDir 放到容量和性能合适的存储上,并用实际版本的 ADE 文档确认是否存在额外的结果位置选项。

4. TMPDIR 能否使用节点本地盘

Cadence 的技术文章说明,许多 Cadence 工具使用进程环境变量 TMPDIR 定位临时文件工作区。该文章同时强调:目标目录必须在工具执行前已经存在,工具不会代为创建。

建议在启动 Virtuoso 前由 shell 设置,而不是依赖仿真开始后再修改环境。

Bash

1
2
3
4
mkdir -p "/local_scratch/$USER/cadence_tmp"
chmod 700 "/local_scratch/$USER/cadence_tmp"
export TMPDIR="/local_scratch/$USER/cadence_tmp"
virtuoso &

C shell / tcsh

mkdir -p "/local_scratch/$USER/cadence_tmp"
chmod 700 "/local_scratch/$USER/cadence_tmp"
setenv TMPDIR "/local_scratch/$USER/cadence_tmp"
virtuoso &

这样启动的 Virtuoso 以及它随后启动的本地子进程能够继承该环境变量。可以在 CIW 中检查 Virtuoso 看到的值:

1
getShellEnvVar("TMPDIR")

参考资料:How to direct the simulation toolset to use a particular disk area for temporary files

必须保留的边界

Cadence 上述技术文章确认的是 Cadence 仿真工具集对 TMPDIR 的通用使用方式,文章中的具体例子涉及仿真期间的压缩文件处理。它不能证明 Spectre 求解器的所有中间数据都会写入 TMPDIR

因此应按以下方式理解:

  • 设置 TMPDIR 可以把遵循该环境变量的临时文件引导到本地盘。
  • 正式的 PSF/PSFXL 波形仍由结果目录控制。
  • 网表、日志、checkpoint/recover 文件是否移动,取决于各自的运行参数和结果目录,不应假定它们都受 TMPDIR 控制。
  • Spectre 的核心求解过程大量使用内存;若瓶颈是持续写波形,优化 saveResDir 往往比只修改 TMPDIR 更直接。

5. LSF、Slurm 等远程作业的注意事项

本地路径必须在实际执行 Spectre 的计算节点上存在。登录节点上的 /local_scratch 与计算节点上的同名路径通常不是同一份数据。

远程作业应为每个 job 建立独立目录,例如:

1
/local_scratch/<user>/<job-id>/tmp

Slurm 作业环境示例:

1
2
3
export TMPDIR="/local_scratch/$USER/$SLURM_JOB_ID/tmp"
mkdir -p "$TMPDIR"
chmod 700 "$TMPDIR"

LSF 作业环境示例:

1
2
3
export TMPDIR="/local_scratch/$USER/$LSB_JOBID/tmp"
mkdir -p "$TMPDIR"
chmod 700 "$TMPDIR"

目录创建、容量检查和作业结束后的清理由站点的 job wrapper、prolog/epilog 或管理员策略处理更安全。还应确认调度系统是否保留提交环境中的 TMPDIR;不能仅因为 Virtuoso 登录会话里能看到该变量,就假定远端 Spectre 进程也能看到。

ADE Explorer/Assembler 的远程提交由 Job Policy 控制。Cadence 文档中的入口是 SetupJob Setup

6. 分布式仿真的远端本地 PSF 目录

如果主要性能瓶颈来自远程作业直接向共享文件系统写 PSF,ADE 还提供了分布式仿真专用变量:

1
2
3
4
5
6
7
8
9
10
11
12
13
envSetVal(
  "adexl.results"
  "useLocalPsfDir"
  'boolean
  t
)

envSetVal(
  "adexl.results"
  "saveLocalPsfDir"
  'string
  "/local_scratch/ade_psf"
)

官方定义中:

  • useLocalPsfDir 用于让远端系统上的分布式仿真结果保存到该系统的本地目录。
  • saveLocalPsfDir 在启用前一变量时指定远端本地目录。
  • 指定路径必须在所有参与运行的远端系统上存在。

参考资料:

节点本地目录的生命周期取决于计算环境。正式启用前应使用小规模仿真验证以下事项:

  1. 作业完成后 ViVA 是否仍能重新打开波形。
  2. 需要保留的结果是否会复制到持久存储。
  3. 节点回收或清理后是否会丢失原始 PSF。
  4. Monte Carlo、corner 和多 test 运行是否都能正确定位结果。

7. 推荐的存储布局

一种常见且容易管理的布局是:

1
2
3
4
项目/网表/运行控制:  /project/<user>/simulation
最终 PSF 波形:       /fast_wave/<user>/spectre_psf
节点临时文件:        /local_scratch/<user>/<job-id>/tmp
远端本地 PSF(可选):/local_scratch/<user>/<job-id>/psf

配置原则:

  1. projectDir 放在可靠、可追溯的项目存储上。
  2. saveResDir 放在容量大、持续写性能好的持久文件系统上。
  3. TMPDIR 放在实际执行节点的本地 SSD/NVMe,并为每个 job 隔离。
  4. 只有在验证结果保留流程后,才启用远端本地 PSF。
  5. 同时减少不必要的信号保存;否则再快的临时盘也无法消除过量波形写入。

8. 如何验证配置真的生效

不要只检查 .cdsinit 文本,应进行一次小规模仿真并核实:

1
2
3
envGetVal("asimenv.startup" "projectDir")
envGetVal("adexl.results" "saveResDir")
getShellEnvVar("TMPDIR")

随后检查:

  • Spectre 实际命令行中的 raw/results 路径。
  • spectre.out 和 ADE job log 中记录的工作目录。
  • PSF/PSFXL 文件实际增长的文件系统。
  • 计算节点上 TMPDIR 下是否出现该作业的临时文件。
  • 作业结束并重新打开 ADE 后,ViVA 是否还能加载波形。

如果 TMPDIR 下没有明显 I/O,而 PSF 目录持续大量写入,这是正常且有价值的诊断结果:说明当前仿真的主要磁盘负载是正式波形结果,而不是通用临时文件。

9. 未采用的说法

Cadence ASK 搜索页会显示自动生成的答案,并明确提示生成内容可能有误。调研中曾出现把其他 Cadence 产品或 wrapper 的 -tempdir 选项归因于普通 Spectre 的搜索结果。本文没有把该选项写成 Spectre 通用参数,因为找到的来源不足以支持这一结论。

对于普通 Virtuoso ADE/Spectre 流程,本文只采用有 Cadence 产品文档或技术文章支持的设置:

  • asimenv.startup/projectDir
  • adexl.results/saveResDir
  • shell 环境变量 TMPDIR
  • 分布式运行的 useLocalPsfDir/saveLocalPsfDir