资讯动态

Simulation与Emulation的区别:从原理到选型,芯片验证必读

发布时间:2026/9/24 12:58:16 来源:尧图企业网站定制
芯片项目做到第三年的时候我吃过一次暗亏。团队里一位刚转岗过来的同事在周会上汇报外设驱动的验证已经用 emulation 跑过了。 结果 Mentor 一问他跑的是 RTL 仿真用的 VCS。老员工当场脸色不太好看倒不是他验证工作做得差而是这两个词在芯片研发流程里代表的是两种完全不同的流程节点、两种数量级的成本投入甚至直接决定你能不能在流片前把操作系统跑起来。这不是抠字眼的问题是工程边界问题。别再傻傻分不清这种标题看着像科普鸡汤但在实际工作中把 Simulation 当成 Emulation或者反过来指望 Emulation 干 Simulation 的活都会让项目付出真金白银的代价。这篇文章不打算做名词解释八股文而是从原理、成本、应用场景、常见翻车现场四个角度把这两个概念彻底捋清楚。不管你是芯片验证工程师、嵌入式软件开发、还是做产线仿真、网络仿真的看完能直接拿来用就行。1. 从一次项目周会上的口误说起先弄清楚你在用什么先回到我吃暗亏的那个场景。同事说已经用 emulation 跑过了实际他用的是仿真。如果只是口头汇报顶多被纠正一下用词。但如果这个口误发生在需求对接层面后果就完全不一样了——他可能拿着仿真的覆盖结果去回填 emulation 的验证计划导致真正的硬件仿真环节被跳过直到流片回来才发现总线时序问题。这就是为什么做芯片的人对这两个词极度敏感。1.1 两个词被混用的真实代价混用最直接的代价体现在三个地方计划层面明明该上硬件仿真平台比如 Palladium、Zebu、Veloce 这类设备才能验证的场景被当成仿真任务分配给软件仿真组结果跑了一个月还在 boot 阶段。成本层面软件模拟器的 license 一年几十万人民币常有而一套企业级硬件仿真平台的价格是千万量级起步。把验证任务错误地往昂贵平台上一放预算超支不说机器资源也被白白占用。结论层面仿真通过不等于时序正确两者验证的维度根本不在一层。你拿着模拟器的通过去回答硬件时序的问题答案必然失真。1.2 先给结论一张表记住核心差异我这里先放一张快速对照表后面所有章节都是围绕这张表展开的。关于这两个概念先不需要纠结教科书定义先把下表刻在脑子里。对比维度软件模拟Simulation硬件仿真Emulation载体纯软件跑在通用服务器/PC上专用硬件平台FPGA阵列或专用处理器阵列建模对象对目标系统建立可执行模型对目标微架构做逻辑级/时序级复刻执行速度低通常为 kHz 级别高通常为 MHz 级别比模拟快 2-3 个数量级精度功能级为主周期/时序精度看模型可做到周期精确甚至信号级时序匹配成本软件授权 通用服务器硬件设备 维护 机房环境费用高昂典型工具VCS、Questa、Xcelium、Gem5、QEMUPalladium、Zebu、Veloce、FPGA 原型核心价值快速验证功能逻辑跑大量回归测试跑操作系统、启动系统级软件、性能评估你可能注意到像 QEMU 这种工具很多人叫它模拟器但它的中文习惯叫法又是仿真器。这是因为该词的混用在业界由来已久根源在下一节。2. 追根溯源Simulation 和 Emulation 本来就是两条道上的东西要真正区分这两个概念得往回看它们各自的家谱。它们不是同一门技术演变出来的两个分支而是从完全不同的需求出发各自长成的两套体系。2.1 Simulation 的出身给软件造一个虚拟运行环境Simulation 的老家是计算科学和软件工程。核心思想是建立数学模型然后让这个模型在宿主机器上执行。你写了一段跑在 ARM 处理器上的代码但我手上只有 x86 服务器那我就在 x86 上用软件假装自己是 ARM把你的代码翻译过来执行。至于这个翻译过程是逐条解释、还是提前编译成 x86 指令、还是维护一个指令级模型只是不同实现方案。这正是我日常工作中大量使用 VCS、Questa 做寄存器传输级仿真的理论基础。编译器把 Verilog 代码转成可执行的仿真模型事件驱动引擎按时间推进信号变化。这套体系是为验证逻辑正确性而生的它不打任何包票说自己的时间轴和真实芯片完全一致只保证功能行为符合 RTL 描述。所以 Simulation 从一开始就带着一个烙印用软件的方式去近似硬件近期目的通常是验证、调试和早期的软件开发。它灵活、便宜、可观测性强但永远隔着建模这层纱。2.2 Emulation 的出身为了软件延续而生的硬拷贝Emulation 的老家是计算机体系结构和系统迁移而且它的起点很有意思——上世纪 60 年代IBM 为了让旧的 System/360 程序能在新的硬件上继续运行提出了用硬件或者微代码去模拟另一套硬件的执行环境这个思路。是 IBM 最早提出了 emulation 这个词为的是在硬件层面重建一套兼容环境。这个思路后来长成了两棵大树指令集架构层面的硬件仿真用 FPGA 或专用仿真器把目标 CPU 的微架构复刻出来目标代码在上面跑的时钟周期、总线行为、Cache 命中逻辑都跟真实硅片高度一致。系统迁移与兼容层比如当年苹果从 PowerPC 迁移到 x86 时用的 Rosetta本质是动态二进制翻译它算不算 emulation学术上存在争论工程上更倾向归类为二进制翻译模拟器因为它的时间行为完全不可比但它确实做到了跑同一份二进制程序。工程界现在说 Emulation尤其是芯片验证语境下的 Emulation基本都指向第一棵大树用可编程硬件去复刻一个可执行的目标系统模型。它不是更快的模拟器它是一个用实物逻辑电路搭起来的目标芯片的孪生体。2.3 分层和抽象让这两个概念越来越容易混淆为什么包括我在内的很多工程师早期都会搞混这两个词因为计算机系统是分层的。在指令集架构层往下看模拟器和仿真器都在执行同一条目标指令。在应用程序开发者眼里QEMU 和一台真实的 ARM 开发板没有本质区别反正编译出来的二进制都能跑。在操作系统内核开发者眼里两者差异才开始显露仿真器可能没有模拟 Cache 延迟驱动里一个依赖 Cache 时序的优化在模拟器上表现为碰巧正确。再加上三个领域各自起了一堆混乱的名字——像 Gem5 是软件写的、却号称周期精确模拟器QEMU 是纯软件、但名字里常用的动词是 emulateFPGA 原型验证是硬件平台、但又经常被单独拎出来和商用 Emulation 平台对立。词汇的混乱导致新人在查询资料时很容易把软件模拟器硬件仿真器周期精确模拟器当成同一个东西的各种叫法。理解了它们的出身后面所有的差异其实都顺理成章了一个从软件世界长出来永远靠抽象和翻译吃饭一个从硬件和体系结构世界长出来靠物理复刻逼近真实时序。接下来要从原理层面剖开来看这两者到底差了多远。3. 原理拆解模拟器在做翻译仿真器在做复刻我经常打一个比方Simulation 像是给一部英文小说写中文译稿你读到的永远是译文语法、意境都可能因为译者风格而失真Emulation 像是把印刷英文小说的那套铅字模具直接复刻出来然后用它印出一本一模一样的书。3.1 软件模拟的看家本领指令翻译与模型抽象软件模拟的实现路径可以粗分成三个流派解释执行每条目标指令被读取后由一个大的 switch-case 或者查表逻辑去模拟执行环境。优点是实现简单、无需提前编译缺点是每次执行都要做取指、译码的开销速度上不去。动态二进制翻译这是 QEMU 这类全系统模拟器的核心思路。目标代码按基本块为单位被翻译成宿主指令并缓存起来下次执行直接命中缓存。它把翻译的代价摊薄到无数次执行中所以比纯解释快很多。但要注意翻译出来的代码是跑在宿主机上的原生指令Cache 行为、分支预测器行为都是宿主机的不是目标机的。周期精确的体系结构模型代表是 Gem5。这类工具在软件层面对流水线深度、Cache 层级、总线仲裁器等做了精细建模能给出周期级别的统计。但它的运行速度极慢模拟一个几十毫秒的操作系统启动在服务器上也可能要跑好几天。Simulation 的优势在于可观测性和可控制性。你可以随时停下来看某个寄存器的值、把时间倒回去、灌入随机激励、插桩覆盖率统计。这些在硬件仿真平台上是极其昂贵或者做不到的。所以软件模拟永远有自己的根据地。3.2 硬件仿真的看家本领RTL 到 FPGA 的映射Emulation 平台的原理简单说就是把设计好的 RTL 级代码综合、映射到一片或一片片 FPGA 上让硬件逻辑直接运行 RTL。这跟流片的过程有些类似差别只在于 FPGA 是可重配置的且频率通常远低于真实芯片的目标频率。具体流程大致是把 SoC 的 RTL 代码读入仿真器工具链。进行综合和映射把逻辑门、寄存器、存储阵列排布到 FPGA 查找表、触发器和块内存上。处理多片 FPGA 之间的信号划分与互连因为一颗大型 SoC 通常不是一片 FPGA 能装下的需要做多片分割片间走高速串行收发器。时钟系统特殊处理。目标芯片可能是 2GHz 的设计而 FPGA 上跑到 100MHz 就很吃力了所以仿真平台往往用分频、多相时钟等手段让逻辑功能正确、时序关系一致。外设的接入由 Transactor事务转换器完成把仿真平台上的总线事务转换成现实的接口信号比如 PCIe、USB、以太网。正是因为这套流程Emulation 平台有了一个 Simulation 永远做不到的能力它可以直接连接真实外设。你可以把一块真实的内存颗粒或者一个真网卡接在仿真平台上让它跟被仿的 SoC 一起跑这在软件模拟器上根本没法实现因为模拟器的外设全是虚拟的、需要建模。3.3 从流水线、缓存、外设三个维度看两者的精度差口说无凭看三个具体维度对比就很直观了流水线硬件仿真里流水线寄存器、旁路网络、预测器都是真正的电路。OoO乱序执行窗口的竞争条件、前递冲突都跟真实硅片行为一致。软件模拟里即使做了周期精确建模也只是IrC级的调度更细的竞争窗口依然会丢失。CacheFPGA 上可以原样例化 Cache 阵列和替换算法Cache 命中率、缺失延迟都是真实硬件行为。软件模拟通常只能做统计级建模对一致性协议的多核竞争行为模拟不够精确这也是软件模拟在跑对称多处理器系统时经常和时间对不齐的原因。外设Emulation 平台可以直接挂真外设最典型的是跑 PCIe 枚举和真实 DDR 训练Simulation 中这些都是虚拟模型模型没覆盖到的行为全部不可见。比如 DDR 初始化训练序列复杂几乎不可能在纯软件模拟里做到逐 bit 对齐。一句话总结原理差异Simulation 是用程序去模仿一颗芯片Emulation 是用可重配电路去复刻一颗芯片。前者总是差一层抽象后者想做到逻辑级相同。到了这一步两者的性能、价格、使用场景的巨大差异就都是顺理成章的结果了。4. 速度、精度、成本三张实测对照表帮你做选型原理清楚了接下来是工程师最关心的量化问题。我在不同项目里实际测过的数据整理如下数值会因设计规模、工具版本、项目优化程度浮动但量级和相对关系长期稳定。4.1 性能与成本标定执行方式典型运行速度运行 1 秒目标时间所需墙钟时间相对速度纯 RTL 动态仿真VCS/Questa1 ~ 100 kHz10 ~ 1000 分钟1 倍周期精确软件模拟Gem5 等10 ~ 1000 kHz 少见更高1 ~ 100 分钟10 ~ 1000 倍快商用硬件仿真 Emulation1 ~ 100 MHz0.01 ~ 1 秒超过万倍FPGA 原型验证10 ~ 200 MHz受布局约束0.005 ~ 0.1 秒接近实时注意这里的快是一把双刃剑。Emulation 快是因为它用电路并行执行大量逻辑但它调试困难得多。仿真的慢换来了深度观测能力。在成本端我给大家一个大致感受。软件模拟的工具链授权从几万到几十万一年都有跑在普通服务器上机时费几百块一天。商用硬件仿真平台一台设备的采购加运维一年基本奔着千万级去FPGA 原型板的单板成本在几十万到百万之间但搭建和维护的人天成本很高而且每次三班倒的设备机时都要钱。资源类型SimulationEmulation商用平台FPGA 原型部署周期1 天内可开工1 ~ 2 周环境准备数周~数月分割与映射运行成本/小时低极高中高可观测性极强中支持少量信号探针弱内部节点难以观测调试能力完备的波形、覆盖率、反标支持触发式波形抓取、有界调试依赖逻辑分析仪非常受限适合阶段功能验证、回归、低层驱动系统验证、软件整机、性能预评估最接近流片性能的软硬件验证4.2 不同项目阶段怎么选工程选型上我踩过几次坑后总结出的经验是不要试图用 KPI 式的单一指标做选型而是看你的验证目标在哪个层次上。如果验证目标是这一段 RTL 逻辑在给定激励下是否功能正确直接用 Simulation它快速、可观测、覆盖率工具链成熟。如果验证目标升维到Linux 内核能不能在这颗 SoC 上启动Simulation 基本会劝退你启动几十秒要跑几天甚至几周。这种系统性任务必须上 Emulation。如果验证目标还包含这套软件系统的整体交互行为是否符合真实硬件环境FPGA 原型是最好的选择因为它速度最接近真实还能接真实外设。我经历过的最理想组合是日常迭代用 Simulation每周做一次大回归关键里程碑比如内核启动、系统级压力、多核一致性协议验证切到 Emulation到流片前软硬件协同验证再用 FPGA 原型把全套软件跑一遍。层次分明各司其职预算也能控制在合理范围。5. 应用场景全景什么场合用 Simulation什么环节必须上 Emulation选型和场景是一体两面的东西。下面按我实际接触过的几个典型领域展开尤其是很多做嵌入式、做工业仿真的朋友可能意识不到自己日常用的仿真和芯片行业的仿真差着很远。5.1 芯片验证流程里的前后门分工芯片设计公司里Simulation 和 Emulation 在验证流程里的分工非常清晰。前门RTL 动态仿真保底。每个模块验证工程师日常跑的都是 VCS/Questa/Xcelium 这类软件仿真写 SystemVerilog/UVM 的 testbench跑定向用例和回归。这一阶段追求的是逻辑 bug 快速清零覆盖率快速提升。前门阶段如果就要求跑操作系统级别测试属于用错了工具效率极低。后门Emulation 平台做系统级坚持。当模块集成到一起要做系统级测试、做 OS 启动、做软硬件接口验证时把这个任务交给仿真平台就轻巧得多。Emulation 平台可以在分钟级里跑完以前要跑几天的软件负载。还能做功耗评估、性能剖析、甚至接上外部测试工具做一致性认证。流片前的最后一公里基本得有它撑住。另外要提一句 FPGA 原型验证的特殊位置。很多初创公司买不起 Palladium 这类商用仿真平台会直接用 FPGA 原型板跑软件。它和商用 Emulation 的区别在于商用 Emulation 工具链完整支持自动分割、自动时钟处理、丰富的调试手段FPGA 原型板则更接近手工打造需要动手处理时钟树、跨芯片划分、外设接口调通一次代价不低。但对早期软件开发和演示来说性价比很高。5.2 嵌入式系统和企业 IT 规划里的仿真离开芯片设计公司Simulation 这个词的含义又外延了一层。做嵌入式开发的朋友如果目标芯片还没到货或者想在一台高性能 PC 上做并行开发最常见的选择就是 Quick EmulatorQEMU。注意这里虽然叫 Emulator实际是纯软件的动态二进制翻译工具按本文的语境它更接近系统级软件模拟器。这种模拟器对嵌入式开发的价值主要体现在三个场景架构选型与性能评估在软件层面模拟不同 CPU 架构跑同一份基准测试评估哪种处理器更适合产品需求。底层软件先行开发Bootloader、内核移植、驱动开发可以不依赖真实硬件并行推进等开发板到位直接烧录缩短时间轴。CI/CD 与自动化测试云端虚拟机里跑嵌入式软件的回归测试一天跑几百个场景这是真实硬件难以做到的。而在企业 IT 和工业工程领域Simulation 的应用更普及、也更容易和芯片仿真概念发生混淆。例如企业网络仿真平台enterprise network simulation platform用来规划和验证网络拓扑变更验证路由器配置Plant Simulation 这类离散事件仿真工具用来在虚拟产线上评估节拍、瓶颈工位和物流方案。这些统统是软件建模交互模拟不在本文的 Emulation 语境里但它们都是 Simulation 这个词在各自领域开花结果的体现。5.3 工业仿真工具Plant Simulation 之类与硬件仿真的关系有一条容易被忽略的主线值得单独拿出来讲Simulation 在不同圈层里的身份不一样但思想同源。芯片圈的 Simulation对硬件行为建模追求信号级正确性。产线/物流圈的 Simulation对生产系统建模追求事件序列和统计正确性。网络圈的 Simulation对协议和流量建模追求包行为和时序分布的统计正确性。它们都共享一个核心逻辑用抽象模型代替真实系统在可控代价下获取系统行为的预测能力。理解了这一点你就明白为什么别再傻傻分不清不只是芯片工程师的问题各行各业做仿真的人都有必要搞清楚自己是在建模还是在复刻因为它们的计算成本、验证深度和使用前提完全不同。例如你在 Altium Designer 里给一个元器件设置属性时看到 properties 里只有 simulation generic就常常意味着当前用的只是通用仿真模型不是厂商提供的精确 SPICE 或 IBIS 模型。这种场景下你得到的仿真结果只能说明趋势不能证明真实硬件性能。如果拿这种通用模型的仿真结论去回答 EMC、信号完整性这种时序级问题结果基本不可信。这个场景正好说明连同一个软件内部模型精度不同Simulation 结论的含金量也天差地别。6. 我踩过和见别人踩过的坑判别技巧与排障心得关于这两个词我在工作中见过不少翻车现场下面按踩坑频率排序把最常见的坑和判别心得写出来。6.1 日常最容易踩的三个坑坑一把软件模拟通过当作硬件行为正确。典型场景是内核驱动开发在模拟器上功能验证全过上了真实硬件发现 DMA 一致性、外设时序问题一推车。根因是模拟器里的虚拟外设是理想化模型没有真实硬件的事务延迟和乱序行为。这个坑的解法很简单软件模拟通过只是第一步一定要在 FPGA 原型或真实硬件上补跑时序敏感用例。坑二以为 Emulation 平台自带 Covergroup 全套体验。硬件仿真平台的内部节点观测能力是受限的不是你想挂多少个探针就挂多少。我见过有同事把仿真项目的覆盖率要求原封不动带到 Emulation 平台结果探针布线把 FPGA 跑崩了。后来靠粗粒度探针 触发条件抓取 分段采样这种组合拳才解决问题。覆盖率工具在 Emulation 上是有损的要用但预期要调整。坑三把 FPGA 原型当成品仿真平台用。FPGA 原型调试能力很弱节点观测基本靠外部逻辑分析仪而且用真实外设连接也容易引入与芯片无关的电气因素干扰。如果你要在原型板上做功耗评估之类的高精度测量需要先确认原型板的供电网络设计是否支持否则数据毫无意义。6.2 像steady simulation mode not supported这类报错说明什么搜索引擎里高频出现的 mike 报错 qussi steady simulation mode not supported 这类信息虽然正文残缺但这类报错在工程界很有代表性。它背后的本质是当前仿真环境不支持你想要的模式或能力因为你用的工具/模型本身就有限制。比如某些多物理场仿真工具默认只做瞬态模拟如果你为了收敛性使用稳态模式而许可证或者模型不支持就会直接报 not supported又比如在混合信号仿真里数字部分支持稳态但模拟晶体管模型只支持瞬态你强行切稳态就被拒。这类报错的通用排查思路我整理为三步确认当前模型/工具的能力边界先查文档里 mode 的适用条件不要凭直觉换参数硬试。降级模式或更换模型如果稳态不支持可以退回到瞬态并把仿真时间拉长到系统稳定或者换成行为级模型替代精度高的晶体管模型后者往往天生支持稳态。检查许可证和环境变量很多模式功能受许可证特性控制看似 not supported 实际是没买这个功能。如果你遇到 Altium 元器件属性只有 simulation generic 这类信息本质也一样EDA 工具的模型库里没有精确模型只能拿通用模型凑。这种情况下我的建议是去元器件厂商官网找 SPICE/IBIS 模型手动挂到仿真设置里而不是随便用 generic 模型对付。6.3 给团队协作的两条实用建议最后结合我这些年在芯片和系统验证项目里的协调经验给团队协作提两条建议。第一在项目文档和任务系统里统一词汇表。开会时口头说仿真、模拟、模拟器、仿真器谁也管不着但写进排期、报告和验收标准里的词汇必须明确。我所在团队现在写验证计划时会强制区分三层软件仿真Simulation、硬件仿真Emulation、FPGA 原型验证FPGA Prototyping并在每类任务后标注预期运行时间量和观测手段避免后续扯皮。第二每个验证任务开始前先回答四个问题我要验证的结论属于功能、时序、还是系统行为这个结论需要在真实外设参与下才能成立吗我想要的观测密度目标平台能不能提供这个用例跑一遍的墙钟时间在目标平台上是可接受的吗这四个问题问下来选型基本不会走偏。我个人在实际项目中的体会是Simulation 和 Emulation 不是高低级之分而是设计验证生命周期里缺一不可的两个端点。Simulation 给了你极高的可观测性和快速迭代能力让你能在早期就把逻辑 bug 扫干净Emulation 则在你需要一颗真正的芯片时用最快的速度给你一个尽可能接近真实硬件的替身。两者配合得当流片前的日子能过得从容很多。最后分享一个我自己的小习惯在项目汇报里量化描述验证结果时永远带上工具和平台前缀。是VCS 软件仿真通过就绝不说成验证通过是Zebu 平台系统级验证通过也说清楚它不是流片后的硅前行为。这样既是对自己的工作负责也是对团队后续的排障工作负责。这个词的区分表面是术语洁癖实际上是在维护整个验证链路的可信度。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价