卓越嵌入式工程师培养计划:从零到独立负责项目的完整学习路线
2026/10/14 16:36:00
以下是对您提供的博文《超详细版讲解 Icarus Verilog 如何支持行为级建模语句》的深度润色与重构版本。本次优化严格遵循您的全部要求:
iverilog不是“能跑就行”的仿真器:它在悄悄告诉你RTL哪里没写对你有没有遇到过这样的时刻?
写完一个简单的同步FIFO,iverilog一跑波形全对,$display打印也干净利落;可往 Yosys 里一综合,报错inferred latch on signal 'rd_ptr';再一看综合网表,多出一堆锁存器,时序根本绷不住。
又或者,你在 testbench 里用initial begin #10 rst = 0; #20 rst = 1; end拉了个复位,iverilog波形看着完美,但 FPGA 上电后状态永远不对——因为综合器直接把这段initial当空气处理了。
这些不是 bug,是信号。
是iverilog在用它特有的方式,低声提醒你:“你写的 Verilog,和硬件真正要做的事之间,还隔着一层没说破的契约。”
而这份契约,就藏在它对always、assign、if-else、case这些行为级语句的执行模型里。
先划重点:iverilog是仿真器,不是综合器。它不关心你的代码能不能变成门电路,只关心“如果这段代码真的在硬件里跑起来,每一纳秒会发生什么”。
所以它干了一件很“较真”的事:把每个always块,当成一个独立的、有心跳的进程来养。
比如这句:
always @(posedge clk or negedge rst_n) begin if (!rst_n) q <= 1'b0; else q <= d; endiverilog