在 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@(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 HDL语言中的阻塞赋值和非阻塞赋值究竟有啥不同?同一变量在不同的过程块中(同时触发)又是如
Verilog 阻塞赋值与非阻塞赋值 Blocking assignment和NonBlocking assignment