verilog 阻塞和非阻塞啥区别啊?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了verilog 阻塞和非阻塞啥区别啊?相关的知识,希望对你有一定的参考价值。

硬件语言要和硬件联系上,阻塞就是相当于两个信号直接相连,非阻塞相当于两个信号通过一个寄存器相连。所以非阻塞方式赋值,被赋值的变量要到下一个时钟周期到来时才改变。 参考技术A 所谓阻塞就是赋值(也就是 ==)之后,原来的变量值马上会改变,
而 非阻塞就是赋值(也就是 << )之后,原来的值并没有改变。追问

CLK_DIV <= `UD CLK_DIV_N;
这条语句完事之后((!CLK_DIV) && (CLK_DIV_N))他还成立吗?

追答

这个语句是成立的,但是两种赋值方式所得到的结果是不一样的!

参考技术B 赋值的类型的选择取决于建模的逻辑类型
在时序块的 RTL 代码中使用非阻塞赋值。
非阻塞赋值在块结束后才完成赋值操作,此赋值方式可以避免在仿真出现冒险和竞争现象。
在组合的 RTL 代码中使用阻塞赋值。
使用阻塞方式对一个变量进行赋值时,此变量的值在在赋值语句执行完后就立即改变。
使用非阻塞赋值方式进行赋值时,各个赋值语句同步执行;因此,通常在一个时钟沿对临时变量进行赋值,而在另一个时钟沿对其进行采样。
下面的模块综合为触发器,
其中采用了阻塞赋值方式:
module bloc(clk,a,b);
input clk, a;
output b; reg b;
reg y;
always @(posedge clk)
begin
y=a;
b=y;
end
endmodule
下面的模块综合为两个触发器
,其中采用了非阻塞赋值方式:
module nonbloc(clk,a,b);
input clk, a;
output b; reg b;
reg y;
always @(posedge clk)
begin
y<=a;
b<=y;
end
endmodule
上面的两个例子的综合的结果不同,左边的例子使用了阻塞赋值方式,综合器将其综合为一个触发器。右边的例子使用了非阻塞赋值方式,综合器将其综合为两个触发器,y 将出现在综合列表中,作为第二个触发器的输入。

非阻塞过程赋值

module swap_vals;
reg a, b, clk;
initial begin 过程赋值有两类
a = 0; b = 1; clk = 0;
阻塞过程赋值
end
always #5 clk = ~clk; 非阻塞过程赋值
always @( posedge clk)
begin
a <= b; // 非阻塞过程赋值
b <= a; // 交换a和b值
end
endmodule

阻塞过程赋值执行完成后再执行在顺序块内下一条语句。
非阻塞赋值不阻塞过程流,仿真器读入一条赋值语句并对它进行调度之后,
就可以处理下一条赋值语句。
若过程块中的所有赋值都是非阻塞的,赋值按两步进行:
1. 仿真器计算所有RHS表达式的值,保存结果,并进行调度在时序控制指
定时间的赋值。
2. 在经过相应的延迟后,仿真器通过将保存的值赋给LHS表达式完成赋
值。
非阻塞过程赋值(续)

阻塞与非阻塞赋值语句行为差别举例1

module non_block1; 输出结果:
reg a, b, c, d, e, f;
initial begin // blocking assignments 0 a= x b= x c= x d= x e= x f = x
a = #10 1; // time 10
2 a= x b= x c= x d= x e= 0 f = x
b = #2 0; // time 12
c = #4 1; // time 16 4 a= x b= x c= x d= x e= 0 f = 1
end
initial begin // non- blocking assignments 10 a= 1 b= x c= x d= 1 e= 0 f = 1
d <= #10 1; // time 10
12 a= 1 b= 0 c= x d= 1 e= 0 f = 1
e <= #2 0; // time 2
f <= #4 1; // time 4 16 a= 1 b= 0 c= 1 d= 1 e= 0 f = 1
end
initial begin
$monitor($ time,," a= %b b= %b c= %b d= %b e= %b f= %b", a, b, c, d, e, f);
#100 $finish;
end
endmodule
非阻塞过程赋值(续)

阻塞与非阻塞赋值语句行为差别举例2

module pipeMult(product, mPlier, mCand, go, clock);
input go, clock;
input [7:0] mPlier, mCand;
output [15:0] product;
reg [15:0] product;
always @(posedge go)
product = repeat (4) @(posedge clock) mPlier * mCand;
endmodule

module pipeMult(product, mPlier, mCand, go, clock);
input go, clock;
input [7:0] mPlier, mCand;
output [15:0] product;
reg [15:0] product;
always @(posedge go)
product <= repeat (4) @(posedge clock) mPlier * mCand;
endmodule
参考技术C 。。。。

异步和非阻塞之间的区别

看了不少关于阻塞、非阻塞、同步和异步文章,我觉得这篇http://www.toxingwang.com/linux-unix/linux-basic/1712.html是讲得不错的。

以下是这篇文章对于阻塞、非阻塞、同步异步的解释

阻塞和非阻塞指的是执行一个操作是等操作结束再返回,还是马上返回。

比如餐馆的服务员为用户点菜,当有用户点完菜后,服务员将菜单给后台厨师,此时有两种方式:

  • 第一种:就在出菜窗口等待,直到厨师炒完菜后将菜送到窗口,然后服务员再将菜送到用户手中;
  • 第二种:等一会再到窗口来问厨师,某个菜好了没?如果没有先处理其他事情,等会再去问一次;

第一种就是阻塞方式,第二种则是非阻塞的。

  同步和异步又是另外一个概念,它是事件本身的一个属性。还拿前面点菜为例,服务员直接跟厨师打交道,菜出来没出来,服务员直接指导,但只有当厨师将菜送到服务员手上,这个过程才算正常完成,这就是同步的事件。同样是点菜,有些餐馆有专门的传菜人员,当厨师炒好菜后,传菜员将菜送到传菜窗口,并通知服务员,这就变成异步的了。其实异步还可以分为两种:带通知的和不带通知的。前面说的那种属于带通知的。有些传菜员干活可能主动性不是很够,不会主动通知你,你就需要时不时的去关注一下状态。这种就是不带通知的异步。

对于同步的事件,你只能以阻塞的方式去做。而对于异步的事件,阻塞和非阻塞都是可以的。非阻塞又有两种方式:主动查询和被动接收消息。被动不意味着一定不好,在这里它恰恰是效率更高的,因为在主动查询里绝大部分的查询是在做无用功。对于带通知的异步事件,两者皆可。而对于不带通知的,则只能用主动查询。

  但是对于非阻塞和异步的概念有点混淆,非阻塞只是意味着方法调用不阻塞,就是说作为服务员的你不用一直在窗口等,非阻塞的逻辑是"等可以读(写)了告诉你",但是完成读(写)工作的还是调用者(线程)服务员的你等菜到窗口了还是要你亲自去拿。而异步意味这你可以不用亲自去做读(写)这件事,你的工作让别人(别的线程)来做,你只需要发起调用,别人把工作做完以后,或许再通知你,它的逻辑是“我做完了 告诉/不告诉 你”,他和非阻塞的区别在于一个是"已经做完"另一个是"可以去做"。

再举一个例子:

  去书店借一本书,同步就是我要亲自到书店,问老板有没有这本书,阻塞就是老板查询的时候(读写)我只能在那等着,老板找到书后把书交给我,这就是同步阻塞。

  我亲自到书店借书,老板在找这本书的时候,我可以去干别的,然后每隔一段时间去问老板书找到了没有,也可以等老板找到书以后通知我,这就是同步非阻塞。

  我想借本书,找个人帮我去借,借到书以后再通知我,这就是异步,我只发起调用,但是本身并不参与这个事件,而是让别的线程去做这个事。

  同步与异步是对应的,它们是线程之间的关系,两个线程之间要么是同步的,要么是异步的。

  阻塞与非阻塞是对同一个线程来说的,在某个时刻,线程要么处于阻塞,要么处于非阻塞。

  帮我借书的那个人有没有借到书,我可以打电话问他(轮询),也可以等他通知我,这是异步的通知;在借书的过程中借书的那个人可以轮询的方式查看书是否已经找到(缓冲区有没有数据),找到了你可以把它拿走,也可以等老板找到书后通知我,这是非阻塞的通知与轮询。

 

  

以上是关于verilog 阻塞和非阻塞啥区别啊?的主要内容,如果未能解决你的问题,请参考以下文章

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

verilog中时序逻辑和非阻塞赋值的内在联系是啥? 都说时序逻辑用非阻塞赋值,这是啥决定的?

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

verilog中为啥非阻塞赋值要用绝对时延

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

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