电子书:《模拟对话》,共50卷,数百篇精品文章,下载即奖励400信元!
返回列表 发帖

[原创] verilog重点解析

[原创] verilog重点解析

本帖最后由 iNostory 于 2019-2-8 12:15 编辑

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


1、连续赋值和过程赋值之间有什么区别?

  

连续赋值

  
  

过程赋值

  
  

主要赋值给 nets

  
  

主要赋值给 reg变量

  
  

用来生成组合逻辑

  
  

用来生成存储单元,触发器、锁存器和组合逻辑

  
  

用于assign语句

  
  

用于alwaysinitialtaskfunction语句

  
  

示例:

  

wire out1 = in1 & in2 ;

  

assign out1 = in1 & in2

  
  

示例:

  

always @(posedge clk)

  


reg1 <= in1 ;

  

always@(a or b or s)

  


y = (s == 1) ? a : b ;

  

2initialalways中的赋值有什么区别?

initialalways中的赋值都是过程赋值。

  

initial

  
  

always

  
  

initial语句块中赋值是在仿真时间0按特定顺序执行,并且只会执行一次

  
  

从仿真时间0开始,敏感列表变化时重复执行

  
  

不可综合

  
  

可综合

  
  

示例:

  

reg [1:0] out1 , out2 ;

  

initial begin

  


out1 = 2’b10 ;

  

#5 out2 = 2’b01 ;

  

end

  
  

示例:

  

reg [1:0] out1 , out2 ;

  

always@(posedge clk) begin

  


out1 <= int1 ;

  

out2 <= out1 & in2 ;

  

end

  

3、阻塞和非阻塞赋值之间有什么区别?

阻塞和非阻塞赋值都是过程赋值。

  

阻塞赋值

  
  

非阻塞赋值

  
  

阻塞赋值中,右边表达式自动更新到左边表达式(如果不指定delay

  
  

非阻塞赋值中,右边表达式在下一个周期才会更新到左边表达式

  
  

在一个进程中存在多个阻塞赋值时,当前阻塞赋值会阻塞下一个阻塞赋值

  
  

在一个进程中存在多个非阻塞赋值时,多个非阻塞赋值会同时进行

  
  

建议在组合always语句块中使用阻塞赋值

  
  

建议在时序always语句块中使用非阻塞赋值

  
  

能在连续赋值语句assign和过程赋值initialalways语句中使用

  
  

只能在过程赋值initialalways语句中使用

  
  


=
表示

  
  

<= 表示

  
  

示例:

  

initial begin

  


reg1 = #10 2’b10 ;

  

reg2 = # 5 2’b01 ;

  

end

  

reg110个时间单位赋值,reg215个时间单位赋值。

  

reg2赋值发生在reg1赋值完成之后

  
  

示例:

  

initial begin

  


reg1 <= #10 2’b10 ;

  

reg2 <= #5 2’b01 ;

  

end

  

reg110个时间单位赋值,reg25个时间单位赋值。

  

reg2赋值发生在reg1赋值之前

  
  

  
  

  


4、如何使用连续赋值建模双向nets

assign语句构成一个连续赋值。 RHS变化立即影响LHS
然而,LHS的任何变化都不会影响RHS

例如,在以下声明,rhsnet的更改将更新到lhsnet,但反之不会。

wire   rhs,1hs ;

assign  lhs = rhs ;


System Verilog引入了一个关键字alias,能定义双向nets

例如,在以下代码中,rhs的任何变化都会更新到lhs,反之亦然。


module test_alias ;

       wire[3:0] lhs ,rhs ;

       aliaslhs = rhs ;   

initial begin

       forcerhs = 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任何一侧的更改都会更新到另一侧。


持续更新~

回复 1# iNostory

alias是双向net?这个理解不准确。

alias就是别名的意思,两个名字(lhs, rhs)是同一根线。
如同给王五起个外号叫小王。那王五吃饱了,小王也就吃饱了;反之亦然。
jchdl

TOP

TOP

回复 1# iNostory

thanks

TOP

返回列表

站长推荐 关闭


2018 ADI 最火爆的六本电子书合订本!下载即奖励400信元!

2018 ADI 最火爆的六本电子书合订本!下载即奖励400信元!


查看