在 Cadence Virtuoso ADE Assembler/Explorer 中以 ICRP 模式运行仿真时,用户有时会看到如下状态组合:

  • History Item 的 Status 栏:running - 0/1 complete
  • Test 和 Corner 的结果表格:各行显示 loading

这并不是报错,而是仿真流程中的一个正常中间状态。本文解释 ICRP 是什么,以及 loading 期间后台在做什么。

1. ICRP 是什么?

ICRP 全称 IC Remote Process(集成电路远程进程),是 ADE Assembler / Explorer(即 adexl)在后台为每个仿真点启动的一个独立的 virtuoso -nograph 子进程。

其工作原理如下:

1
2
3
4
5
Maestro (主进程)
  └── 任务调度 (Job Manager)
        ├── ICRP-1 (virtuoso -nograph) → 负责 Corner 1 的 netlisting + Spectre
        ├── ICRP-2 (virtuoso -nograph) → 负责 Corner 2 的 netlisting + Spectre
        └── ...

每个 ICRP 进程负责一个仿真点(或一组仿真点)的完整执行周期:网表生成 → 启动仿真器 → 结果回传。

2. running vs loading 各代表什么?

位置 状态 含义
History Item → Status running Maestro 的任务管理器已启动并开始分发仿真任务
Test / Corner 表格 loading 对应的 ICRP 子进程已收到任务,但尚未启动仿真内核(如 Spectre)

简而言之:running 是”调度层已开跑”,loading 是”执行层正在准备”,两者同时出现是正常的过渡阶段。

3. loading 期间后台在做什么?

ICRP 子进程在 loading 阶段通常依次执行以下操作:

3.1 初始化环境

启动 virtuoso -nograph,加载用户环境配置:

  • 读取 .cdsinitcdsinit.il 等初始化脚本
  • 加载 CDF、SKILL 工具箱
  • 加载 Model 文件路径配置

注意:如果 .cdsinit 中有耗时的 SKILL 代码(如自动加载大量库),这一步会显著延长 loading 时间。

3.2 网表生成(Netlisting)

ICRP 根据当前的电路设计和变量配置生成仿真网表(.scs.sp 文件):

  • 对于原理图视图(schematic),调用 OSS 网表器
  • 对于抽取视图(extracted view),调用 xRC/EMX 等引擎并合并网表
  • 处理 Corner 变量的参数替换

这是最常见的耗时操作,设计规模越大或使用了抽后仿真(Post-layout simulation),耗时越长。

3.3 加载数据库

打开并读取仿真点所涉及的所有单元视图(Cellview),包括:

  • 设计库(Design Library)中的层次化单元
  • PDK 中的模型文件

3.4 等待 License

启动仿真器内核(Spectre / APS / UltraSim),并向 License Server 申请检出相应的 License。若 License 资源紧张,ICRP 进程会阻塞在此步骤直到获取到 License。

3.5 执行前置脚本

如果在 ADE 中配置了仿真前置触发(Pre-simulation triggers)或 Ocean 脚本,ICRP 也会在此阶段执行这些脚本。


完成上述所有准备工作后,仿真器真正启动,表格状态才会从 loading 变为 running(显示具体的仿真进度)。

4. loading 正常持续时间

设计规模 正常持续时间
小型原理图仿真 几秒 ~ 30 秒
中型设计 30 秒 ~ 2 分钟
大型 / 抽后仿真 2 分钟 ~ 10 分钟

若超过 10 分钟仍显示 loading,通常说明卡住了,需要进行排查。

5. 如何监控 ICRP 的细分状态

Run Summary Assistant 提供了比主界面更细粒度的状态信息:

  1. 菜单栏选择 View → Assistants → Run Summary(或直接在 History Item 处右键查看)。
  2. 在助手界面中,可以看到每个 ICRP 的当前阶段:
    • Pending:任务已排队,等待 ICRP 启动
    • Starting:正在启动 virtuoso -nograph
    • Configuring:正在加载环境和执行初始化脚本
    • Netlisting:正在生成网表
    • Running:仿真器已启动,正在计算
    • Cleaning up:仿真完成,正在整理结果

将鼠标悬停在状态图标上,可以看到更详细的进度提示。

6. 常见问题排查

6.1 长时间停在 loading / Configuring

原因.cdsinit 中存在耗时操作(如 autoload 大量库,执行复杂 SKILL 脚本)。

解决方法

  • .cdsinit 中添加判断,当运行在 -nograph 模式(即 ICRP 模式)时跳过不必要的 UI 初始化:
; 在 .cdsinit 中添加,跳过 ICRP 模式下的 UI 相关加载
unless(getShellEnvVar("ADEXL_NOGRAPH") == "1"
  ; 加载 UI 相关的 SKILL 工具
  load("myUITools.il")
)
  • 或使用环境变量 CDS_NOGRAPH_SKIP_INITFILE 跳过部分初始化(需 Virtuoso IC617 及以上版本)。

6.2 长时间停在 Netlisting

原因:设计层次复杂,或使用了多层抽取视图。

解决方法

  • 检查是否需要使用 APS 的增量网表功能(Incremental Netlisting)
  • 减少非必要的抽取层次(在 ADE 中修改 Switch View List)
  • 确认 .tmpADEDir 临时目录不存在冲突文件;必要时清理后重跑(Simulation → Clean Simulation Results

6.3 长时间停在等待 License

原因:License Server 上相应 License 已用尽,ICRP 进程队列等待。

解决方法

  • 通过 lmstat -a 查看当前 License 占用情况
  • 在 ADE 中减少并行仿真数量(Job Policy 设置中调低 Max parallel jobs
  • 联系 EDA 管理员确认 License 配置

6.4 通过 Job Log 查看详细报错

在 Test/Corner 表格中右键点击报错的仿真点,选择 View Job Log,可以看到 ICRP 进程的完整日志输出,是定位卡顿具体阶段最直接的方式。

6.5 相关环境变量

环境变量 / SKILL 设置 说明
adexl.icrpStartup → startMaxJobsImmediately 设为 t 时所有任务同时启动,在资源受限时可能互相竞争
adexl.icrpStartup → maxConcurrentJobs 控制最大并行 ICRP 数量
CDS_NOGRAPH_SKIP_INITFILE 跳过 -nograph 模式下的部分初始化

7. 参考资料 (References)