数字IC设计学习笔记_阻塞赋值与非阻塞赋值

数字IC设计学习笔记

5. 阻塞赋值与非阻塞赋值

1 Verilog 代码
2 原理图
3 Modelsim仿真
  • 阻塞赋值(block): “=”,语句执行有先后顺序,串行执行
  • 非阻塞赋值(unblock):"<=",语句执行无先后顺序,并行执行
  • 注意:不要再同一个always块中混合使用阻塞赋值和非阻塞赋值

1 Verilog 代码

module block_unblock(
	input 		clk,
	input 		rst_n,
	input 		a,
	input 		b,
	input 		c,
	
	output reg  [1:0] out //out = a+b+c;
	
);
	
	reg [1:0] d; //d = a+ b; out = d+c;
	
	always@(posedge clk or negedge rst_n)
		if(!rst_n)
//			out = 2'd0;
         out <= 2'd0;
		else begin
//----blocked 1--------------
//		   d = a + b;
//			out = d + c;
//----blocked 2--------------
//			out = d + c;
//			d = a + b;
//----unblocked 1------------
//			out <= d + c;
//			d <= a + b;
//----unblocked 2------------
//         d <= a + b;
//			out <= d + c;
//----unblock 3--------------
			out <= a + b + c;
			
		end
endmodule


2. 原理图
(1). block1 原理图

在这里插入图片描述
(2). block 2 原理图
在这里插入图片描述
(3). unblock 1 原理图
在这里插入图片描述
(4). unblock 2 原理图
在这里插入图片描述
(5). unblock 3 原理图(推荐)
在这里插入图片描述

3 Modelsim仿真

block 2 仿真结果
// out = d + c;
// d = a + b;
先执行out = d + c; 此时的d值,为前一个时钟周期的值;后执行d = a + b;此时的d值,将在下一个时钟有效沿时被采集;由于多一级d寄存器,导致延时一拍,结果出现错误。
在这里插入图片描述
unblock 1, 2 由于多一级d寄存器,同样出现错误仿真结果
unblock 3 仿真结果(推荐)
在这里插入图片描述

【注】:个人学习笔记,如有错误,望不吝赐教,这厢有礼了~~~

猜你喜欢

转载自blog.csdn.net/weixin_50722839/article/details/109577903
今日推荐