源自 微信公众号 “数字芯片实验室”

1、连续赋值和过程赋值之间有什么区别?
Verilog重点解析
2、initial和always中的赋值有什么区别?
initial和always中的赋值都是过程赋值。
Verilog重点解析

3、阻塞和非阻塞赋值之间有什么区别?
阻塞和非阻塞赋值都是过程赋值。
Verilog重点解析

4、如何使用连续赋值建模双向nets?
assign语句构成一个连续赋值。 RHS变化立即影响LHS。 然而,LHS的任何变化都不会影响RHS。
例如,在以下声明,rhs net的更改将更新到lhs net,但反之不会。

wire   rhs,1hs ;
assign  lhs = rhs ;

System Verilog引入了一个关键字alias,能定义双向nets。
例如,在以下代码中,rhs的任何变化都会更新到lhs,反之亦然。

module test_alias ;
	wire [3:0] lhs ,rhs ;
	alias lhs = rhs ;   
initial begin
	force rhs = 4’h2 ;
	$display(“lhs = %0h , rhs = %0h”,lhs,rhs) ;
 release rhs ;

	force lhs = 4’hc ;
	$display(“lhs = %0h , rhs = %0h”,lhs,rhs) ;
	release lhs ;

end

endmodule  //test_alias

如果上述alias换成assign,则输出如下:

lhs = 2 , rhs = 2 
lhs = c , rhs = z 

然而,由于定义了alias,输出如下:

lhs = 2 , rhs = 2 
lhs = c, rhs = c 

在上面的示例中,对net任何一侧的更改都会更新到另一侧。

持续更新~

相关文章: