什么是 Elaboration(展开)
在 Xcelium 中,elaboration 是位于编译之后、仿真之前的设计构建阶段。负责这个阶段的工具是 xmelab,Cadence 将其定义为与 HDL 语言无关的 elaborator。
Cadence ASK 对它的核心描述是:
“constructs a hierarchy … establishes signal connectivity, and computes initial values”
也就是完成三项主要操作:
- 根据设计中的实例化和配置信息构建设计层次。
- 建立各实例之间的信号连接。
- 计算设计中所有对象的初始值。
处理完成的设计层次会保存成 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
- 外部调试环境
需要外部访问时,可以在 xrun 或 xmelab 中使用:
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 的过程。