ET创芯网论坛(EETOP)

找回密码

  登录   注册  

电动/混动汽车、48V系统、汽车功能安全等技术资料合集
查看: 588|回复: 10

[原创] verilog重点解析

[复制链接]
发表于 2019-2-7 21:38:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 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任何一侧的更改都会更新到另一侧。


持续更新~
发表于 2019-2-9 19:48:11 | 显示全部楼层
回复 1# iNostory

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

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

使用道具 举报

发表于 2019-2-10 19:15:21 | 显示全部楼层
dingygiexian
回复 支持 反对

使用道具 举报

发表于 2019-2-11 10:26:20 | 显示全部楼层
回复 1# iNostory

thanks
回复 支持 反对

使用道具 举报

发表于 2019-2-20 19:32:27 | 显示全部楼层
学习下
回复 支持 反对

使用道具 举报

发表于 2019-2-21 00:08:14 | 显示全部楼层
thanks
回复 支持 反对

使用道具 举报

发表于 2019-2-21 00:13:07 | 显示全部楼层
thanks
回复 支持 反对

使用道具 举报

发表于 2019-2-21 07:21:33 | 显示全部楼层
thanks
回复 支持 反对

使用道具 举报

发表于 2019-2-23 12:09:04 | 显示全部楼层
不错不错不错不错。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-23 13:48:27 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /2 下一条

关闭

关于我们|联系我们|ET创芯网 ( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2019-8-19 22:23 , Processed in 0.072865 second(s), 14 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表