verilog里面always 与reg分别代表啥意思,有啥功用?为啥只对输出用reg,对输入不用?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了verilog里面always 与reg分别代表啥意思,有啥功用?为啥只对输出用reg,对输入不用?相关的知识,希望对你有一定的参考价值。
首先搞清楚,verilog不是用来编程的软件语言,不要老想着与C/C++对比。其二,verilog是用来描述硬件的,也就是说你要做什么硬件,先要在脑筋里想好,做到胸有成竹以后,再用verilog描述出来。
有了以上概念,再来可以告诉你答案,你比较容易接受:
always是用来描述电平触发的组合逻辑电路或锁存器,还可以用来描述边沿触发的时序逻辑电路。
reg本来是用来描述寄存器输出的,但实际上与verilog本身的语法有关,这一点个人感觉verilog的语法并不严谨,至少让初学者无所适从。这个语法是:只要是always块内部的变量输出,都用reg型。但正如上面所说的,always块并不总是时序逻辑,有时是组合逻辑,所以reg型变量有时候可能实际上是线网。
由于输入信号是由模块外部决定的,与外部模块是通过线连接的,所以用wire,不用reg。 参考技术A 在always块中,如果要对某个端口赋值。需要把这个端口定义为reg格式。因为被赋值,所以为输出口。
Verilog中wire与reg类型的区别
这是事转载的一篇文章,觉得不错,虽然中间有点小错误。
wire与reg类型的区别:
wire型数据常用来表示以assign关键字指定的组合逻辑信号。模块的输入输出端口类型都默认为wire型。默认初始值是z。
reg型表示的寄存器类型。always模块内被赋值的信号,必须定义为reg型,代表触发器。
默认初始值是x。
reg相当于存储单元,wire相当于物理连线。
Verilog 中变量的物理数据分为线型和寄存器型。这两种类型的变量在定义时要设置位宽,缺省为1位。变量的每一位可以是0,1,X,Z。其中x代表一个未被预置初始状态的变量或者是由于由两个或多个驱动装置试图将之设定为不同的值而引起的冲突型线型变量。z代表高阻状态或浮空量。
线型数据包括wire,wand,wor等几种类型在被一个以上激励源驱动时,不同的线型数据有各自决定其最终值的分辨办法。
两者的区别是:寄存器型数据保持最后一次的赋值,而线型数据需要持续的驱动
输入端口可以由net/reg驱动,但输入端口只能是net,如a = b & c,输入端口a 只能是net型,但其驱动b,c可以是net/reg型;输出端口可以使net/reg类型,输出端口只能驱动net,如a = b & c,模块的输出端口b,c可以是net/reg型,但它们驱动的a必须是net型;若输出端口在过程块(always/initial)中赋值则为reg型,若在过程块外赋值则为net型。用关键词inout声明一个双向端口, inout端口不能声明为寄存器类型,只能是net类型。
wire表示直通,即只要输入有变化,输出马上无条件地反映;reg表示一定要有触发,输出才会反映输入。
不指定就默认为1位wire类型。专门指定出wire类型,可能是多位或为使程序易读。wire只能被assign连续赋值,reg只能在initial和always中赋值。wire使用在连续赋值语句中,而reg使用在过程赋值语句中。
在连续赋值语句中,表达式右侧的计算结果可以立即更新表达式的左侧。在理解上,相当于一个逻辑之后直接连了一条线,这个逻辑对应于表达式的右侧,而这条线就对应于wire。在过程赋值语句中,表达式右侧的计算结果在某种条件的触发下放到一个变量当中,而这个变量可以声明成reg类型的。根据触发条件的不同,过程赋值语句可以建模不同的硬件结构:如果这个条件是时钟的上升沿或下降沿,那么这个硬件模型就是一个触发器;如果这个条件是某一信号的高电平或低电平,那么这个硬件模型就是一个锁存器;如果这个条件是赋值语句右侧任意操作数的变化,那么这个硬件模型就是一个组合逻辑。
wire型的变量综合出来一般是一根导线;
reg变量在always块中有两种情况: always后的敏感表中是(a or b or c)形式的,也就是不带时钟边沿的,综合出来还是组合逻辑 always后的敏感表中是(posedge clk)形式的,也就是带边沿的,综合出来一般是时序逻辑,会包含触发器(Flip-Flop)
在设计中,输入信号一般来说你是不知道上一级是寄存器输出还是组合逻辑输出,那么对于本级来说就是一根导线,也就是wire型。而输出信号则由你自己来决定是寄存器输出还是组合逻辑输出,wire型、reg型都可以。但一般的,整个设计的外部输出(即最顶层模块的输出),要求是寄存器输出,较稳定、扇出能力也较好。
Notes:七七八八的也看不太懂,总之wire赋值用assign,reg在always内使用。
以上是关于verilog里面always 与reg分别代表啥意思,有啥功用?为啥只对输出用reg,对输入不用?的主要内容,如果未能解决你的问题,请参考以下文章