什么是 Elaboration(展开)

在 Xcelium 中,elaboration 是位于编译之后、仿真之前的设计构建阶段。负责这个阶段的工具是 xmelab,Cadence 将其定义为与 HDL 语言无关的 elaborator。

Cadence ASK 对它的核心描述是:

“constructs a hierarchy … establishes signal connectivity, and computes initial values”

也就是完成三项主要操作:

  1. 根据设计中的实例化和配置信息构建设计层次。
  2. 建立各实例之间的信号连接。
  3. 计算设计中所有对象的初始值。

处理完成的设计层次会保存成 simulation snapshot,之后由 xmsim 加载并执行仿真。Cadence ASK:Elaboration

Xcelium 的完整流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
HDL 源文件
    │
    ▼
xmvlog / xmvhdl
编译各个 HDL design unit
    │
    ▼
xmelab
构建设计层次、连接信号、计算初始值
    │
    ▼
Simulation Snapshot
    │
    ▼
xmsim
加载 snapshot 并运行仿真

Cadence 文档说明:

阶段 主要操作 结果
Compilation 解析并编译 Verilog、SystemVerilog、VHDL 等源文件 每个 HDL design unit 的内部表示
Elaboration 根据实例化和 configuration 构建层次、连接信号并计算初始值 Simulation snapshot
Simulation 加载 snapshot 及其引用的中间对象 日志、SHM/VCD 波形和模型输出

Cadence ASK:Introduction to the Xcelium Simulator

1. 构建设计层次

编译阶段产生的是各个 HDL design unit 的内部表示。Elaboration 根据设计中的:

  • instantiation information(实例化信息)
  • configuration information(配置信息)

把这些独立的设计单元组织成一个完整的 design hierarchy。

例如,一个顶层设计引用 CPU、memory 和 interface 等设计单元时,elaboration 会确定本次仿真中实际存在的实例及其上下级关系。这里的“展开”主要指从实例化关系出发,形成完整的实例层次。

2. 建立信号连接

在实例层次确定后,xmelab 建立各个实例之间的 signal connectivity,包括端口与信号之间的连接关系。

因此,simulation snapshot 中保存的已经不是彼此独立的模块定义,而是完成连接的整体设计表示。

3. 计算初始值

Cadence 文档明确说明,xmelab 会计算设计中所有对象的 initial values。完成此操作后,snapshot 就具备仿真器启动设计所需的初始状态信息。

这里的 initial value 属于仿真开始前构建设计模型的一部分;仿真时间推进以及后续信号变化由 xmsim 执行。

4. 生成 Simulation Snapshot

Elaboration 完成后,设计层次被保存到 simulation snapshot 中。

Cadence 将 snapshot 定义为:

仿真器运行仿真时所使用的设计表示。

Snapshot 会与编译器和 elaborator 生成的其他中间对象一起存放在 library database 中。之后,xmsim 以 snapshot 作为主要输入,并加载 snapshot 引用的其他中间对象。

因此可以把两者的关系概括为:

1
2
Elaboration 是构建设计的操作
Snapshot 是该操作产生的可运行设计表示

5. Elaboration 期间的优化和访问控制

Cadence 文档还说明,默认情况下 elaborator 会把设计中的仿真对象设置为不具备外部 read、write 或 connectivity access,以便进行能够提高仿真性能的优化。

这会影响通过以下方式访问 HDL 对象的能力:

  • Tcl 命令
  • PLI
  • VPI
  • VHPI
  • 外部调试环境

需要外部访问时,可以在 xrunxmelab 中使用:

1
-access

也可以使用:

1
-afile

通过 access file 为特定实例或部分设计设置访问权限。Cadence ASK:Elaboration—The XMELAB Flow

6. Elaboration 也包含代码生成工作

Cadence 文档说明,elaborator 默认会启动一个 code-generation process。对于多核计算机,可以使用:

1
-mccodegen

启动多个并行的代码生成进程,以减少 elaboration 中代码生成部分的时间。

所以 elaboration 不只是建立一张层次关系表,还会为后续高性能仿真准备相应的可执行内部表示。

7. 什么时候需要重新 Elaboration

Cadence 文档明确说明:当设计层次中的 design unit 发生变化时,需要:

1
2
3
4
5
重新编译发生变化的 design unit
              +
重新 elaborate 整个 design hierarchy
              +
生成新的 simulation snapshot

Xcelium 提供两种相关更新方式:

  • xmupdate:重新编译过期的 design unit、重新 elaboration 并更新 snapshot,但不立即仿真。
  • xmsim -update:执行上述更新,然后启动仿真。

整个设计至少需要完整 elaboration 一次,之后才能使用这些自动更新功能。Cadence ASK:Elaboration—Updating the Snapshot

一句话定义

Elaboration 是 Xcelium 使用 xmelab,根据实例化和配置信息构建完整设计层次、建立信号连接、计算对象初始值,并将结果生成 simulation snapshot 的过程。