Verilog中不同begin-end语句是否并发执行?仿真时长如何判定?
Verilog中begin-end语句的并发执行逻辑
先直接给你明确答案:Verilog里的initial(以及always)块是并发执行的,而begin-end只是用来包裹顺序执行语句的块——单个begin-end内部的代码是顺序运行的,但不同initial/always里的begin-end是同时启动的。
结合你给出的测试代码来分析:
//Sample test values to run simulation (module jkflop_top continues) initial begin j=0; k=0; rst=1; #4 j=1; k=1; rst=0; #50 j=0; k=1; rst=0; #20 j=1; k=1; rst=0; end //Carry out simulation for 100 units of time initial begin #100 $finish; end endmodule
这两个initial块会在仿真启动的瞬间同时开始运行:
- 第一个
initial里的begin-end是顺序执行:先给j、k、rst赋初始值,等待4个时间单位后更新信号,再等50单位,再等20单位——算下来最后一次信号更新是在4+50+20=74时间点,之后这个块就执行完毕,进入 idle 状态。 - 第二个
initial块会卡在100时间单位时执行$finish,直接终止整个仿真。
所以你的判断完全正确:整个程序只会运行100个时间单位。哪怕第一个块提前执行完了,第二个块的$finish到点就会触发,结束仿真。
额外提一句:如果是always块里的begin-end,逻辑也是一样的——内部顺序执行,不同always块之间并发运行。Verilog的并发特性是基于initial/always这些顶级块的,begin-end只是用来把需要顺序执行的语句打包,不改变并发的本质。
内容的提问来源于stack exchange,提问作者BEWARB
相关产品推荐
相关产品推荐

