在 verilog中的非阻塞赋值在什么时候赋值时刻结束?

谢谢啊!
比如
always@(posedge clk)
begin
if(x)
begin
a <= 1;
b <= 2;
end
if(y)
begin
c <= 3;
d <= 4;
end
end
如果x和y都为1,那么上面的四个赋值都会执行。那么它们是同时赋值的,还是先对a、b赋值,然后判断y是否为1,再对c、d赋值呢?
它应该有个原则性的赋值时刻,我的理解是在第一个时钟结束的时候,第二个时钟沿将要到来的时候,不知道这样理解对不对。

在时钟有效沿到来以后就结束了。

你的理解全完是错的,原因在于你把verilog当软件来用了。它实际上是硬件描述语言,不是C语言。
从你的问题补充来看,你根本不知道自己描述的是什么,建议你忘掉所学的软件所有的东西,从硬件的角度去理解verilog。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-04-12
你说的例子中,always块中两个if是串行的,if内部的非阻塞是并行的。也就是先对ab然后后对cd赋值。不过从实际结果来看,都是一样的。因为,always块中的所有非阻塞赋值确切的说,是在当前always块结束才统一赋值的。也就是说, abcd最终实际上是同一时刻得到新的值。而这个块结束后的赋值时刻也就是你所说的原则性赋值时刻(不要纠结于时钟的上升沿后的什么时刻),这涉及到一个仿真器的事件队列的问题。
不过,不建议你这么写,建议你写成两个块:
always@(posedge clk)
begin
if(x)
begin
a <= 1;
b <= 2;
end
else begin
end

always@(posedge clk)
if(y)
begin
c <= 3;
d <= 4;
end
else begin
end
end

(欢迎加FPGA交流学习qun 37378637)本回答被提问者和网友采纳
第2个回答  2012-04-25
首先,verilog是硬件编程语言,所以要从硬件的角度来看问题!
--> 硬件的角度,这个always语句合成出来是寄存器,4个寄存器
--> 从寄存器来说,a,b,c,d是在同一个clock的上升沿同时执行的,只是a和b的enable一致;c和d的enable一致,所以说是同时赋值的
(了解一下寄存器的结构吧)
相似回答