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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在 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赋值呢?
它应该有个原则性的赋值时刻,我的理解是在第一个时钟结束的时候,第二个时钟沿将要到来的时候,不知道这样理解对不对。

你说的例子中,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)
参考技术A 首先,verilog是硬件编程语言,所以要从硬件的角度来看问题!
--> 硬件的角度,这个always语句合成出来是寄存器,4个寄存器
--> 从寄存器来说,a,b,c,d是在同一个clock的上升沿同时执行的,只是a和b的enable一致;c和d的enable一致,所以说是同时赋值的
(了解一下寄存器的结构吧)
参考技术B 在时钟有效沿到来以后就结束了。

你的理解全完是错的,原因在于你把verilog当软件来用了。它实际上是硬件描述语言,不是C语言。
从你的问题补充来看,你根本不知道自己描述的是什么,建议你忘掉所学的软件所有的东西,从硬件的角度去理解verilog。

阻塞赋值和非阻塞赋值

2017-12-01

在Verilog语言中,赋值语句经常使用,阻塞赋值和非阻塞赋值经常带给我们很多困扰。在此讨论两种赋值方式的差异性。

       首先根据表面含义深刻理解阻塞和非阻塞:

       阻塞:在进程语句块中(initial或者always或者其他),当前赋值语句的执行阻塞了后面语句的执行。即后面语句的赋值需要等到当前赋值过程完成才能得以执行,即可认为执行过程是顺序执行(我们要明白Verilog中,大多数情况模块都是并发执行的)。

       非阻塞:当前赋值语句的执行不会阻塞后续语句的执行,即可以认为当前赋值语句的完成和后续的执行过程是并发执行的

       下面通过一个例子说明:

initial                       initial
begin                          begin
b=a;                            b<=a;
c=b;                            c<=b;
end                             end             

    上述左侧为阻塞赋值,右侧为非阻塞赋值;

     左侧代码中,当b=a执行完之后,即b的值已经变成了a;此时,c的值被赋给b的值,实际上,c的值就是a的值了,即c=b=a;

     而右侧代码,b被赋给a的值,c被赋给b的值同时发生,即c得到得到的b的值,并非是改变后的b的值,而是b没有改变之前的原来的值。    

 

以上是关于在 verilog中的非阻塞赋值在啥时候赋值时刻结束?的主要内容,如果未能解决你的问题,请参考以下文章

verilog阻塞赋值和非阻塞赋值的区别

verilog 关于阻塞与非阻塞赋值同时使用时的问题

阻塞赋值和非阻塞赋值有何区别

在verilog HDL语言中的阻塞赋值和非阻塞赋值究竟有啥不同?同一变量在不同的过程块中(同时触发)又是如

verilog中的赋值运算符<=具体是啥意思

Verilog 阻塞赋值与非阻塞赋值 Blocking assignment和NonBlocking assignment