verilog中区分wire、reg、always、assign

在初学verilog语言时,常常对各种模块中的语句块、变量声明的使用条件不清楚,其中最典型的就是对reg型和wire型数据类型的区分,以及对always语句和assign语句使用条件的理解,在这篇文章中我将分享我的一些学习总结。

区分wire与reg,从二者的归属讲起

wire是verilog的默认数据类型,即未指定类型的变量都是wire型。wire是net型数据变量,net型数据相当于硬件电路中的各种物理连接(如导线),特点是输出值紧跟输入值变化而变化。

reg型是variable型数据变量,variable型数据在verilog-1995标准中被称为register型,这很好的说明了此数据类型可以映射为存储元件(如寄存器),之所以在现在类名更改,是为了突出在具体情况下,variable类型的变量也可以映射为连线。

介绍完两种类型归属上的不同特点,就能很好的区分两种类型

wire型适用于连续赋值,常通过assign赋值语句赋值。而reg型适用于过程语句赋值,在always过程块中要求被赋值变量必须为reg型。

在上面对wire和reg的区分中便已出现了assign与always,这两者的区分其实很简单。

always是一个过程块,与inital类似,二者的区别在于可综合性方面。

inital块不能被综合,在模型运行时只执行一次,往往用作对激励向量的描述或逻辑器件变量赋值,是面向模型仿真的过程语句。

而always块内语句可综合,所谓可综合,即是在块内语句最终会被综合成逻辑器件。always的另一个特点就是并发性,模型中所有always是并发进行的。

相较于过程语句always,assign只是一个赋值语句,其特点是可持续赋值。在实际应用中,assign不能出现在always过程块中,因为使用assign是对wire型变量赋值,这与always过程块赋值左值必须为reg型冲突。

此外,时序语句必须在always过程块中,时序与组合部分不能同时出现在一个always中。在实际应用中常将时序逻辑与组合逻辑分别写在两个always语句块中,或是将组合逻辑写在always块外的assign语句中。

  • 8
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值