仿真是什么:芯片还没造出来,怎么先在电脑里「跑」它
更新时间:2026-09-05。本文是「集成电路大类 · 芯片设计」入门层(beginner)第十篇新正文。写完 RTL(见 Verilog 语法速览)之后,第一件事不是去流片,而是在电脑里把这块电路「跑」起来看对不对——这就是仿真。它是验证的主力手段(系统方法见 芯片功能验证),也是「仿真第一」原则的由来。看完仿真怎么观察信号,见 看波形基本功。
本文要回答的问题
- 芯片还没造出来,凭什么能在电脑里「运行」?
- testbench、DUT、激励、波形这些词各是什么?
- 仿真和「上 FPGA 板」有什么区别?为什么不直接上板?
- 前仿真、后仿真、功能仿真、时序仿真,差在哪?
一、仿真的本质:软件逐时间步「演」电路
从代码到门电路 说过,Verilog 描述的是一块并行电路。仿真(simulation) 就是用一个软件(仿真器,如 VCS、Xcelium、Questa、开源的 Icarus Verilog)来模拟这块电路随时间的行为:它维护每个信号的值,按时间推进,在时钟沿、输入变化时重新计算受影响的逻辑。
关键区别于跑软件:仿真里时间是模拟出来的,电路的「并行」是仿真器靠事件调度在软件里假装同时发生的。所以仿真可以随时暂停、倒退、查看任意一根内部信号——这是真实硬件给不了的自由度。
二、testbench:给电路搭一个「测试台」
仿真需要两样东西:
- DUT(Design Under Test,被测设计):你写的那块电路模块;
- testbench(测试台,简称 TB):一段不可综合的 Verilog/SystemVerilog,负责产生时钟、复位和输入激励(stimulus),把信号接到 DUT,并检查输出对不对。
一个最小 testbench 长这样:
module tb_acc;
reg clk = 0, rst_n = 0, en = 0; // TB 驱动的信号用 reg
reg [7:0] din;
wire [7:0] acc; // 接 DUT 输出用 wire
always #5 clk = ~clk; // 每 5 时间单位翻转 → 周期 10
acc u_dut (.clk(clk), .rst_n(rst_n), .en(en), .din(din), .acc(acc));
initial begin
$dumpfile("wave.vcd"); $dumpvars; // 导出波形文件
#12 rst_n = 1; // 释放复位
#10 en = 1; din = 8'd3; // 给激励
#20 din = 8'd5;
#30 if (acc !== 8'd8) $display("ERROR: acc=%0d", acc);
#20 $finish; // 结束仿真
end
endmoduleinitial、#延迟、$display、$finish 这些都是仿真专用语法,不能综合成硬件(见 Verilog 语法速览 里 initial 的说明)。
三、仿真 vs 上板(FPGA 原型):两条互补的验证路
很多人问:既然能上 FPGA 板真跑,为什么还要仿真?因为两者特点互补:
| 维度 | 仿真(simulation) | 上板 / FPGA 原型 |
|---|---|---|
| 本质 | 软件逐事件模拟时间 | 真实硬件并行运行 |
| 速度 | 慢(时钟周期是算出来的,大设计很慢) | 快(能跑到 MHz~百 MHz) |
| 可观测性 | 任意内部信号都能看、能暂停/回溯 | 只能看到引出的信号,内部难窥探 |
| 激励控制 | 可精确构造任意边角场景、错误注入 | 构造异常场景较麻烦 |
| 成本/迭代 | 改代码即可重跑,极便宜 | 要综合、布局布线、下载,迭代慢 |
| 代表性 | 不含真实门延迟/布线延迟(前仿真) | 接近真实时序,但 FPGA ≠ 目标工艺 |
结论:先用仿真把功能逻辑充分调对(便宜、看得清、能造边界场景),再上 FPGA 跑规模、跑软件、验证系统级交互。这正是「仿真第一 / simulation-first」的由来,也是为什么流片前通常先做 FPGA 原型(见 FPGA 与 ASIC 对比)。
四、前仿真 vs 后仿真:带不带真实延迟
- 前仿真( RTL 仿真 / 功能仿真):直接跑你的 RTL,只验证逻辑功能对不对,不考虑门延迟和布线延迟。快,是日常调试主力。
- 后仿真(门级/时序仿真):综合 + 布局布线后,用带真实延迟的门级网表再仿真,能暴露时序违例、异步问题。慢,通常在关键处或签核(sign-off)阶段做。
现代流程大量时序问题改由 静态时序分析 静态地算遍所有路径,门级后仿真用得比过去少,但异步、DFT、低功耗等场景仍有价值。
五、为什么「仿真第一」是铁律
芯片流片一次极贵(见 一颗芯片的成本账、tape-out 是什么),回来才发现逻辑错误,轻则几百万掩膜费打水漂、重则几个月周期重来。所以业界铁律是:在流片前用仿真(配合形式验证、覆盖率等)尽可能穷尽地证明设计正确——验证工程师人数常超过设计工程师,仿真回归(regression)通宵跑是常态(系统方法见 芯片功能验证)。仿真发现 bug 的成本是「改几行代码重跑」,硅片上发现 bug 的成本是「重新流片」。
六、这一篇在知识体系里的位置
- 想知道仿真出来的波形怎么读、怎么定位第一个错 → 看波形基本功;
- 想系统了解验证方法学、断言、覆盖率、UVM → 芯片功能验证;
- 想看综合后门级网表、时序怎么分析 → 综合是什么、静态时序分析入门;
- 想动手写 testbench、跑仿真到上板 → FPGA 线的 testbench 与仿真、设计流程。
总结
一句话总结:仿真是在芯片还没造出来时,用 EDA 仿真器在电脑里逐时间步「演」你的 RTL——testbench 负责产生时钟/复位/激励并检查输出、DUT 是你的可综合设计,波形则用来观察任意内部信号;相比上 FPGA 板,仿真慢但可观测性极强、能精确构造边界场景、改代码即可重跑、成本极低,因此要「仿真第一」先把功能调对、再上板跑系统规模;前仿真跑 RTL 只验功能、后仿真用带延迟门级网表兼验时序,而之所以把仿真做到极致,是因为流片一次极贵,仿真里改 bug 是改几行代码、硅片上改 bug 是重新流片。