14.8-组合逻辑建模时应使用阻塞赋值

发布时间:2024年01月04日

原则3:用always块描述组合逻辑时,应采用阻塞赋值语句。

1,概念

在Verilog中可以使用多种方法来描述组合逻辑,但是当用always块来描述组合逻辑时,应该用阻塞赋值。
如果always块中只有一条赋值语句,使用阻塞赋值或非阻塞赋值语句都可以。但是为了养成良好的编程习惯,应该尽量使用阻塞赋值语句来描述组合逻辑

2 ,以4输入与或门逻辑为例,组合逻辑实现

2.1,使用非阻塞赋值语句来描述组合逻辑,但不建议使用这种风格

使用没有延时的非阻塞赋值可能导致仿真结果不对,有时需要在 always 块的入口附加敏感事件参数,才能使仿真正确,因而从仿真的时间效率角度看也不合算。

module	ao4(a, b, c, d, y);
output	y;
input	a, b, c, d;
reg		y, temp1, temp2;

always@(a or b or c or d)	begin
	temp1	<= a & b;
	temp2	<= c & d;
	y		<= temp1 | temp2;	
end
endmodule
2.2,使用非阻塞赋值来描述多层组合逻辑,虽可行、但效率不高
module	ao5(a, b, c, d, y);
output	y;
input	a, b, c, d;
reg		y, temp1, temp2;

always@(a or b or c or d or temp1 or temp2)		begin
	temp1	<= a & b;
	temp2	<= c & d;
	y		<= temp1 | temp2;

end

endmodule

2.2和2.1节相比,其唯一区别是:temp1和temp2加入了敏感列表中。如前所描述,当非阻塞赋值的LSH数值更新时,always块将自动触发并用最新计算出的temp1核temp2值更新输出y的值。
因此,将temp1和temp2加入到敏感列表后,现在输出y的值是正确的。
问题:
一个always块中有多次参数传递,由此降低了仿真器的性能,只有在没有其他合理方法的情况下才考虑这样做。

2.3,使用阻塞赋值实现组合逻辑,推荐使用
module	ao2(a, b, c, d, y);
output		y;
input		a, b, c, d;
reg			y, temp1, temp2;

always@(a or b or c or d)	begin
	temp1	= a & b;
	temp2	= c & d;
	y		= temp1 | temp2;
end

endmodule

2.3与2.1小节的唯一区别是:用阻塞赋值替代了非阻塞赋值。这样做,既保证了仿真时经一次数据传递输出y的值是正确的,又提高了仿真效率。

文章来源:https://blog.csdn.net/qq_21952195/article/details/135378004
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。