其他分享
首页 > 其他分享> > 阻塞和非阻塞

阻塞和非阻塞

作者:互联网

为了具体非抽样的理解verilog 语言中的阻塞和非阻塞问题及现象,通过仿真结果说明。

从下图可以看出,4种情况中,非阻塞两表达式调换顺序后结果是一样的,因为表达式左端输出均取决于表达式右端变量之前一个时钟的的数值,调换顺序后并不会影响表达式的数值计算。

而阻塞的两个表达式中,两表达式调换顺序结果是不一样的,因为表达式右端的数值变化其计算结果会立马赋值到左端,使得下一个表达式的左端表达式受上一个表达式的计算结果影响直接得到最新的赋值。

从下图可以看出,只有q2是通过两个加法器,再通过一个触发器直接得到计算结果,即q的输出相当于q2=a+b+c;而其他的q的计算均是a+b出来后经过d触发器,然后再+c,再经过触发器生成q,因此q的计算结果是由q的上一个时钟的结果计算而成的。

 

代码如下:

module test(
   input clk,rst_n,
	input [3:0]a,b,
	input [3:0]c,
	output reg [5:0]d,q,
	output reg [5:0]d1,q1,
	output reg [5:0]d2,q2,
	output reg [5:0]d3,q3);
	

always @(posedge clk or negedge rst_n) begin
		if(~rst_n) begin
			d<=0;
			q<=0;
			end
		else begin
			d<=a+b;
			q<=d+c;
			end
		end
		
always @(posedge clk or negedge rst_n) begin
		if(~rst_n) begin
			d1<=0;
			q1<=0;
			end
		else begin
			q1<=d1+c;
			d1<=a+b;
			end
		end
		
always @(posedge clk or negedge rst_n) begin
		if(~rst_n) begin
			d2=0;
			q2=0;
			end
		else begin
			d2=a+b;
			q2=d2+c;
			end
		end
		
always @(posedge clk or negedge rst_n) begin
		if(~rst_n) begin
			d3=0;
			q3=0;
			end
		else begin
			q3=d3+c;
			d3=a+b;
			end
		end		
endmodule
	

 

标签:阻塞,计算结果,output,reg,表达式,左端
来源: https://blog.csdn.net/weixin_41155462/article/details/117441151