FPGA 与原型验证

Simulation 与 Emulation 有什么区别?

2026/06/15 作者:星际 AI 笔记作者 142 次阅读 4 次点赞

在 SoC、AI 芯片和复杂 FPGA 系统项目中,Simulation 和 Emulation 是两个经常被同时提到的验证手段。它们都属于 pre-silicon verification,也就是在芯片 Tapeout 或真实硬件完成之前,通过不同平台尽早发现设计问题。

但在实际项目里,Simulation 和 Emulation 并不是简单的“慢”和“快”的关系。Simulation 更关注 RTL 逻辑在精确激励下是否符合设计规范;Emulation 更关注大规模系统能否在接近真实运行条件下启动、交互和收敛。

如果只用运行速度来区分两者,很容易忽略它们在验证流程中的真正价值。更准确的理解是:Simulation 是精细化验证和问题定位的基础平台,Emulation 是大规模系统级验证和软硬件协同的加速平台。

不是替代关系,而是阶段互补

Simulation 适合验证 RTL 的功能正确性、协议行为、边界条件和 corner case。它提供很强的可控性和可观测性,工程师可以精确构造输入激励,查看波形,插入 assertion,收集 coverage,并逐周期定位问题。

Emulation 适合验证更大的系统场景,例如 SoC 级启动、Bootloader、Linux boot、driver bring-up、firmware 联调、复杂外设交互和长流程系统测试。它运行速度远高于传统 RTL 仿真,同时仍保留一定 RTL 级调试能力。

因此,成熟的芯片验证流程通常不会在 Simulation 和 Emulation 之间二选一,而是让它们承担不同阶段的任务:

  • 用 Simulation 把 IP、block 和 subsystem 的逻辑问题尽量清理干净。
  • 用 Emulation 承载更大的 SoC 场景和软件联调。
  • 用 FPGA Prototyping 或 First Silicon 环境继续验证真实 IO、长期 workload 和最终系统行为。

什么是 Simulation?

Simulation 通常指 RTL simulation,也就是使用软件仿真器执行 Verilog、SystemVerilog、VHDL 等 RTL 代码,并通过 testbench、UVM、assertion、scoreboard、reference model 和 coverage 来判断设计行为是否正确。

它的优势在于“细”和“准”。工程师可以构造一个非常具体的场景,例如:

  • 某个 AXI transaction 在 backpressure 下连续等待多个 cycle。
  • FIFO 在 empty、almost empty、almost full、full 边界切换。
  • reset release 与 clock enable 在临界时刻交错。
  • interrupt、DMA completion 和 error response 同时发生。
  • 某个低概率异常路径被精确触发。

在这些场景中,Simulation 可以记录大量内部信号,帮助工程师逐周期分析状态机、计数器、握手信号、仲裁逻辑和协议响应。这种可观测性是它最重要的价值。

Simulation 常见应用包括:

  • IP 和 block 级功能验证。
  • subsystem 级协议验证。
  • assertion-based verification。
  • functional coverage 和 code coverage 收敛。
  • corner case、异常路径和边界条件验证。
  • 精确波形调试和 bug root cause 分析。
  • 回归测试和版本迭代中的功能一致性检查。

对于早期 RTL 开发,Simulation 几乎是不可替代的。因为此时设计还在快速变化,问题大多发生在局部逻辑、接口协议、状态机和寄存器行为中,最需要的是快速构造测试、快速复现问题、快速观察内部行为。

什么是 Emulation?

Emulation 是把 RTL 设计映射到专用硬件仿真平台上运行的一种验证方式。它不是用普通软件仿真器逐行执行 RTL,而是通过硬件平台承载大规模逻辑,从而获得比 RTL Simulation 高得多的运行速度。

在大型 SoC 项目中,Emulation 常用于承载完整芯片或重要子系统,例如 CPU subsystem、NoC、DDR Controller、PCIe、DMA、NPU、interrupt controller、security subsystem、firmware 运行环境等。它可以让团队在真实硅片回来之前运行更长、更复杂的软件和系统场景。

Emulation 常见应用包括:

  • SoC 级 pre-silicon verification。
  • Bootloader 和 firmware bring-up。
  • Linux boot 和 early driver bring-up。
  • CPU、NoC、DDR、DMA、PCIe、NPU 等复杂子系统联调。
  • cache coherency、memory ordering、interrupt handling 等系统问题定位。
  • 复杂协议和系统级数据路径验证。
  • 软件团队较早介入硬件平台。
  • Tapeout 前的大规模系统回归。

可以把 Emulation 理解为一个偏硬件验证团队使用的系统级加速验证平台。它回答的问题通常是:这个 SoC 在 RTL 层面能否作为一个系统启动、运行并处理复杂交互?

核心区别一:运行平台不同

Simulation 运行在软件仿真器上。设计代码、testbench、模型、assertion 和 coverage 工具共同构成仿真环境。它的灵活性很强,修改 RTL 或 testbench 后可以较快重新编译和运行,适合频繁迭代。

Emulation 运行在专用硬件平台上。RTL 需要经过编译、映射、分区和平台适配,才能在硬件仿真系统中运行。这个准备过程通常比普通仿真更复杂,但一旦平台建立起来,就能承载更大的系统和更长的执行流程。

因此,两者的工程特点不同:

维度 Simulation Emulation
运行载体 软件仿真器 专用硬件验证平台
环境构建 相对灵活,适合频繁修改 平台构建更复杂,适合大规模场景
设计规模 IP、block、subsystem 为主,也可做 SoC 但速度受限 subsystem 和 SoC 级更常见
依赖资源 服务器和仿真工具 Emulation 硬件资源和编译流程
典型使用者 RTL、验证、架构团队 验证、RTL、软件、系统团队

核心区别二:运行速度不同

运行速度是最直观的区别。Simulation 逐事件、逐周期执行 RTL 逻辑,精度高但速度慢。对于小模块,这通常可以接受;但对于完整 SoC、Linux boot、复杂 driver 流程或长时间 workload,纯 RTL Simulation 往往不现实。

Emulation 通过硬件平台执行设计,速度通常比 RTL Simulation 高几个数量级。它不一定达到最终芯片频率,也通常不如 FPGA Prototyping 快,但足以支撑很多 Simulation 难以覆盖的系统场景。

速度差异会直接影响可验证的问题类型:

  • Simulation 适合验证一个精确 corner case。
  • Emulation 适合运行一个复杂系统流程。
  • Simulation 适合分析某个 bug 的逐周期原因。
  • Emulation 适合发现系统在 OS boot、driver probe、DMA 传输或多子系统交互中的问题。

例如,一个 AI SoC 的 Linux boot 流程可能涉及 CPU、DDR、interrupt controller、timer、UART、storage controller、firmware、driver 和 device tree。用 RTL Simulation 完整跑完可能成本很高;而在 Emulation 上,团队可以更早看到系统启动路径上的真实交互,并把问题定位到更具体的硬件或软件边界。

核心区别三:可观测性与调试方式不同

Simulation 的可观测性最强。工程师可以查看几乎任意层级的内部信号,可以增加 waveform dump,可以插入 assertion,也可以通过 testbench 精确控制输入条件。对于定位 RTL bug,这种能力非常关键。

Emulation 的可观测性弱于 Simulation,但通常强于普通 FPGA 原型验证。很多 Emulation 平台提供 transaction-level debug、信号采样、断点、trace、memory inspection 等调试能力,可以在较高运行速度下保留一定内部可见性。

但 Emulation 的调试仍然需要权衡。采集越多信号,可能占用越多硬件资源,影响编译复杂度和运行效率。对于复杂 SoC,工程团队通常需要提前规划:

  • 哪些信号必须长期可观测。
  • 哪些 transaction 需要 trace。
  • 哪些寄存器和 memory 区域需要快速检查。
  • 哪些系统事件需要硬件计数器或日志支持。
  • 哪些 bug 可以回到 Simulation 中做精确复现。

一个常见工程策略是:先在 Emulation 上发现系统级问题,再把问题缩小到具体模块、协议或场景,最后回到 Simulation 中做更精确的波形级定位。这样可以兼顾速度和调试深度。

核心区别四:可控性不同

Simulation 的可控性非常高。验证工程师可以构造不自然但很有价值的场景,例如异常时序、错误响应、低概率并发、边界条件和协议违规输入。这些场景在真实系统运行中不一定容易出现,但对设计鲁棒性非常重要。

Emulation 更接近系统真实运行。它适合让软件、firmware 和硬件一起跑起来,但不一定适合精确制造每一个 cycle-level corner case。虽然可以通过 transactor、testbench acceleration、软件控制或外设模型注入场景,但总体上,它的控制粒度通常不如 Simulation 细。

因此,Simulation 更适合问:

  • 这个协议 corner case 是否被正确处理?
  • 这个状态机是否存在非法跳转?
  • 这个 FIFO 边界条件是否可靠?
  • 这个 reset sequence 是否在所有相位下都安全?

Emulation 更适合问:

  • 这个系统能否 boot 到预期阶段?
  • driver 与硬件寄存器定义是否一致?
  • CPU、DMA、DDR 和 NoC 之间的交互是否稳定?
  • firmware 初始化顺序是否合理?
  • 多个子系统并发运行时是否存在死锁或性能瓶颈?

核心区别五:适合发现的问题不同

Simulation 擅长发现局部、精确、可复现的问题,例如:

  • 状态机逻辑错误。
  • 协议时序违规。
  • 寄存器读写行为不符合规范。
  • FIFO、counter、arbiter 的边界条件问题。
  • reset、clock enable、interrupt 等局部控制逻辑错误。
  • assertion violation 和 coverage hole。

Emulation 擅长发现系统级、集成型、长流程问题,例如:

  • OS boot 卡在某个 driver probe 阶段。
  • firmware 初始化顺序与硬件依赖不匹配。
  • DMA、cache、DDR 之间的数据一致性问题。
  • interrupt routing 或 interrupt handling 异常。
  • NoC backpressure 导致系统性能下降或局部 hang。
  • CPU、NPU、PCIe、DDR 等子系统并发运行时出现资源竞争。
  • 软件栈对硬件寄存器、队列深度或 memory map 的假设不准确。

这也是为什么大型 SoC 验证不能只依赖一种平台。Simulation 能把“点”验证深,Emulation 能把“面”跑起来。

对比表:Simulation vs Emulation

维度 Simulation Emulation
主要目标 RTL 功能验证和精确 debug 大规模系统级验证和软硬件协同
运行速度 慢,适合局部和精确场景 快得多,适合长流程系统场景
可观测性 很强,内部信号容易查看 较强但有限,需要规划 trace 和 debug
可控性 很强,可精确构造激励 中等,更接近系统真实运行
适合规模 IP、block、subsystem subsystem、SoC、复杂系统
典型任务 coverage、assertion、waveform debug、corner case OS boot、driver bring-up、系统集成、复杂回归
迭代成本 较低,适合频繁改 testbench 和 RTL 较高,需要编译、映射和平台适配
软件参与 早期通常有限 软件团队可以更早介入
典型用户 RTL 工程师、验证工程师、架构工程师 验证、RTL、软件、系统和 Bring-up 团队
主要风险 系统场景运行太慢 debug 深度不如 Simulation,平台资源有限

常见误区

误区一:Emulation 就是更快的 Simulation。
Emulation 确实更快,但它不是简单把 Simulation 加速。它需要硬件平台、编译映射、调试规划和系统环境搭建。它更适合系统级验证,不是为了替代所有 RTL 仿真。

误区二:有了 Emulation,就不需要 Simulation。
这是很危险的理解。很多 bug 必须在 Simulation 中通过 waveform、assertion 和精确激励定位。Emulation 可以帮助发现系统级问题,但并不适合替代所有局部逻辑验证。

误区三:Simulation 太慢,所以价值不如 Emulation。
Simulation 慢,是因为它提供了更细的控制和更强的可见性。对于协议边界、状态机、异常路径、coverage 收敛和 bug root cause 分析,它仍然是基础工具。

误区四:Emulation 能跑 OS boot,就说明芯片验证接近完成。
OS boot 是重要里程碑,但不是完整验证结论。系统能启动,不代表所有协议、异常路径、并发访问、压力场景和低概率 corner case 都已覆盖。

误区五:越早上 Emulation 越好。
Emulation 的确可以让系统级验证前移,但前提是 RTL、接口、memory map 和基本软件环境有一定稳定度。如果过早投入,可能会把大量时间花在平台搭建和重复适配上。

在 SoC 和 AI 芯片项目中的组合方式

在一个较成熟的 SoC 项目中,Simulation 和 Emulation 通常按阶段配合。

早期阶段,Simulation 是主力。验证团队围绕 IP、block 和关键 subsystem 建立 testbench,通过 assertion、coverage 和 waveform debug 发现并修复局部逻辑问题。这个阶段的重点是把 RTL 基础质量建立起来。

中期阶段,随着 block 和 subsystem 收敛,Emulation 开始承担更大的系统任务。团队可以在 Emulation 上运行 firmware、Bootloader、早期 OS boot 和关键 driver 流程,同时继续用 Simulation 做回归、corner case 和 bug 精确定位。

后期阶段,Emulation 可以用于 SoC 级系统回归、复杂软件场景、关键数据路径和 Tapeout 前风险收敛。对于 AI SoC,它可以帮助验证 CPU、NPU、DMA、DDR、NoC、PCIe、interrupt controller、firmware 和 runtime 之间的交互。

例如,一个 AI inference 系统可能在单个 NPU block 仿真中计算正确,但在系统运行时仍出现问题。原因可能不是乘加阵列本身,而是 DMA descriptor、cache maintenance、DDR bandwidth、interrupt coalescing、runtime queue management 或 driver timeout policy 之间的协同问题。这类问题只有在系统级环境中才容易暴露,Emulation 正好适合承担这一层验证。

与 FPGA Prototyping 的边界

在实际项目里,Simulation 和 Emulation 之外,团队还常常使用 FPGA Prototyping。三者容易被放在一起比较。

简单来说:

  • Simulation 最适合精确验证 RTL 行为。
  • Emulation 最适合在保留一定 RTL debug 能力的前提下运行大规模系统场景。
  • FPGA Prototyping 更适合 RTL 相对稳定后,高速运行真实软件、连接真实 IO、支撑长期 workload 和 Bring-up 预演。

Emulation 通常比 FPGA Prototyping 更适合硬件验证团队定位复杂 RTL 和系统问题;FPGA Prototyping 通常更适合软件团队、系统团队和 Bring-up 团队长期使用。它们之间也不是替代关系,而是验证链路上的不同平台。

总结

Simulation 和 Emulation 的区别,不只是速度差异,而是验证目标、调试方式、可控性、可观测性和适用阶段的差异。

Simulation 擅长回答“这个 RTL 行为是否正确”。它适合 IP、block、subsystem、协议边界、corner case、assertion、coverage 和波形级 debug。

Emulation 擅长回答“这个 SoC 系统能否在较真实的软件和系统场景下运行”。它适合 OS boot、driver bring-up、firmware 联调、复杂子系统集成、大规模回归和 Tapeout 前系统风险收敛。

真正有效的验证策略,不是用 Emulation 取代 Simulation,也不是只停留在仿真环境中看局部波形,而是把问题分层:局部逻辑问题在 Simulation 中收敛,系统交互问题在 Emulation 中暴露和定位,真实接口和长期运行问题再交给 FPGA Prototyping 与 First Silicon 环境进一步确认。

从技术交流的角度看,选择平台之前,最重要的是先问清楚当前项目要验证什么问题。问题层级清楚了,Simulation 和 Emulation 的位置也就清楚了。