关于Verilog中的always仿真

`timescale 1ns/1ps
module zuse;
reg[3:0] a,b,c,d;
initial
begin
a=0;
b=0;
c=0;
d=0;
end
always
begin
c<=c+1;
d<=d+1;
#5 a<=a+1;
#5 b<=b+1;

end
endmodule
仿真结果是:

注意到a和b的波形不一样,怎么解释?

没有不同啊。你的波形没有问题,我给你分析一下:
你这段代码里没有clk,所以没有时钟波形,只看到一些数字变化。
initial语句只执行一次,always语句总是在执行。
开始的时候,a和b都是0,延迟5ns之后a为1,b仍然为0.a为1的状态再延迟5ns时,b才为1,此时a仍然为1.这个时候对于a为1,已经执行5ns了,再过5ns,a就为2了,这时b为1的状态持续了5ns。这个在你的波形中有反应,波形没错。
如果我没猜错的话,你可能想让a和b同时变换吧?如果这样的话,要这样写这句赋值语句:
#5 a<=a+1;
b<=b+1;
而不是你所写的那样。如果没理解的话,希望亲能追问。也希望我能解答你的疑惑。追问

非常感谢这位大哥的指点,小弟愚昧,请问#5 a<=a+1;和#5 b<=b+1;不应该是相对于进入always块的同一开始时刻吗?我认为他们应该是具有相同的延时起点的。您说对了,我是想让他们同时改变。这个结果让我对非阻塞赋值产生了疑惑,望大哥再指点一二。

追答

在always块或initial块中的代码是顺序执行的,只有在并行块中的代码才是并行执行的。所以#5 a<=a+1和#5 b<=b+1的延时起点是不一样的,#5 a<=a+1的延时起点是在进入always语句开始的,而#5 b<=b+1的延时起点是“#5 a<=a+1”执行完才开始的。

温馨提示:答案为网友推荐,仅供参考
相似回答