一文搞懂阻塞赋值和非阻塞赋值

微信公众号获取更多FPGA相关源码:
在这里插入图片描述# 1.阻塞赋值和非阻塞赋值的区别:
(1)阻塞赋值"=",必须是阻塞赋值完成后,才进行下一条语句的执行;赋值一旦完成,等号左边的变量值立即变化。在同一个块中,非阻塞赋值表达式的书写顺序不影响赋值的结果。硬件没有对应的电路。
(要点为串行,从上到下顺序执行,立即生效)

(2)非阻塞赋值"<=",在赋值开始时计算表达式右边的值,在本次仿真周期时钟的下降沿时才更新被赋值变量,即赋值不是立即生效的;非阻塞赋值允许块中其他语句同时执行。在同一个块中,阻塞赋值表达式的书写顺序会影响赋值的结果。硬件有对应的电路。
(要点:并行,不是立即生效,同时执行)

2.非阻塞赋值举例

相信刚入门的读者,看完上面的理论是一脸懵逼,实践出真知,来看下面一个简单的例子:

module test(
	input 	clk,
	input	din,
	output	dout
    );
	reg r1,r2,r3;
	always @(posedge clk) begin
		r1 <= din;
		r2 <= r1;
		r3 <= r2;										
	end												
	assign dout = r3;
endmodule

非阻塞赋值RTL视图

话不多说,写个简单的仿真来看结果,设置输入din为0,1,2,3一直循环。

`timescale 1ns / 1ps

module test_tb;
parameter 		T = 20	;
reg				clk		;	
reg		[1:0]	din		;
wire	[1:0]	dout	;

always #(T/2) clk = ~clk;

test u_test(
.clk	(clk	),
.din	(din	),
.dout   (dout	)
);

initial begin
	clk = 1'b0;
	din = 2'b0;
	for(;;) begin
		#T
		din = din + 1'b1;
	end
end

endmodule

非阻塞赋值仿真

可以看到第一个时钟周期,r1被赋值为din的’0’,但是由于上个周期r1为未知,此时r2的值为未知;同理r3的值也应该被赋予的是上个周期的值,也是未知。从第三个周期开始,dout才开始输出din的值,相当于din被延迟了三个周期输出。由于非阻塞赋值"<="的特性,常常用来对信号打拍,在消除亚稳态和边沿检测时经常用到。

3.阻塞赋值举例

还是使用上面的例子,只是把"<=“改为”="。

`timescale 1ns / 1ps

module test(
	input 			clk		,
	input	[1:0]	din		,
	output	[1:0]	dout
    );
	
	reg [1:0]	r1,r2,r3;
	
	always @(posedge clk) begin
		r1 = din;
		r2 = r1;
		r3 = r2;
	end	
	assign dout = r3;
	
endmodule

阻塞赋值RTL视图

还是仿真看下结果:

阻塞赋值仿真

可以看到,r1,r2,r3在一个时钟上升沿,都赋值为输入din的值。

4.总结

阻塞赋值对应的电路结构往往与触发沿没有关系,只与输入的电平变化有关系;非阻塞赋值对应的电路结构往往与触发沿有关系,只有在触发沿时才有可能发生赋值的情况。

8个要点:

  1. 时序电路建模时,用非阻塞赋值(<=)。
  2. 锁存器电路建模时,用非阻塞赋值(<=)。
  3. 用always块建立组合逻辑时,用阻塞赋值(=)。
  4. 在同一个always块中建立时序和组合逻辑电路时,用非阻塞赋值。
  5. 在同一个always块中不要既用非阻塞赋值又用阻塞赋值。
  6. 不要在一个以上的always块中为同一个变量赋值。
  7. 用$strobe系统任务来显示用非阻塞赋值的变量值。
  8. 在赋值时不要使用#0延迟。

微信公众号获取更多FPGA相关源码:
在这里插入图片描述

相关推荐

  1. Verilog 14: 阻塞阻塞赋值的异同

    2024-06-15 11:58:03       26 阅读
  2. 14.9-时序组合的混合逻辑——使用阻塞赋值

    2024-06-15 11:58:03       36 阅读
  3. TCP Server工具类,BIO阻塞阻塞NIO

    2024-06-15 11:58:03       25 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-15 11:58:03       14 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-15 11:58:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-15 11:58:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-15 11:58:03       18 阅读

热门阅读

  1. springMVC入门案例

    2024-06-15 11:58:03       6 阅读
  2. Node.js环境安装与管理指南

    2024-06-15 11:58:03       10 阅读
  3. 圆锥曲线的分类

    2024-06-15 11:58:03       8 阅读
  4. 深度解析服务发布策略之蓝绿发布

    2024-06-15 11:58:03       7 阅读
  5. 缓存缓存缓存

    2024-06-15 11:58:03       9 阅读
  6. Sklearn基础教程

    2024-06-15 11:58:03       8 阅读
  7. 网络安全突发事件应急预案

    2024-06-15 11:58:03       9 阅读
  8. 智能合约中权限管理不当

    2024-06-15 11:58:03       7 阅读
  9. Git教程II

    2024-06-15 11:58:03       9 阅读