verilog HDL中wire和reg的区别 下载本文

wire表示直通,即只要输入有变化,输出马上无条件地反映(如与、非门等简单的连接);reg表示一定要有触发,输出才会反映输入。

不指定就默认为1位wire类型。专门指定出wire类型,可能是多位或为使程序易读。wire只能被assign连续赋值,reg只能在initial和always中赋值。wire使用在连续赋值语句中,而reg使用在过程赋值语句中。

wire若无驱动连接,其值为z,reg默认初始值为不定值x。

reg表示一定要有触发,没有输入的时候可以保持原来的值,但不直接与实际的硬件电路对应。

在连续赋值语句中,表达式右侧的计算结果可以立即更新表达式的左侧。在理解上,相当于一个逻辑之后直接连了一条线,这个逻辑对应于表达式的右侧,而这条线就对应于wire。在过程赋值语句中,表达式右侧的计算结果在某种条件的触发下放到一个变量当中,而这个变量可以声明成reg类型的。根据触发条件的不同,过程赋值语句可以建模不同的硬件结构:如果这个条件是时钟的上升沿或下降沿,那么这个硬件模型就是一个触发器;如果这个条件是某一信号的高电平或低电平,那么这个硬件模型就是一个锁存器;如果这个条件是赋值语句右侧任意操作数的变化,那么这个硬件模型就是一个组合逻辑。 简单来说硬件描述语言有两种用途:1、仿真,2、综合。 对于wire和reg,也要从这两个角度来考虑。

从仿真的角度来说,HDL语言面对的是编译器(如Modelsim等),相当于软件思路。 这时:

wire对应于连续赋值,如assign reg对应于过程赋值,如always,initial

从综合的角度来说,HDL语言面对的是综合器(如DC等),要从电路的角度来考虑。 这时:

1、wire型的变量综合出来一般是一根导线; 2、reg变量在always块中有两种情况:

(1)、always后的敏感表中是(a or b or c)形式的,也就是不带时钟边沿的,综合出来还是组合逻辑

(2)、always后的敏感表中是(posedge clk)形式的,也就是带边沿的,综合出来一般是时序逻辑,会包含触发器(Flip-Flop)

在设计中,输入信号一般来说你是不知道上一级是寄存器输出还是组合逻辑输出,那么对于本级来说就是一根导线,也就是wire型。而输出信号则由你自己来决定是寄存器输出还是组合逻辑输出,wire型、reg型都可以。但一般的,整个设计的外部输出(即最顶层模块的输出),要求是寄存器输出,较稳定、扇出能力也较好。 1.wire型

wire型数据常用来表示以assign关键字指定的组合逻辑信号。Verilog程序模块中输入、输出信号类型默认为wire型。wire型信号可以用做方程式的输入,也可以用做“assign”语句或者实例元件的输出。

wire型信号的定义格式如下:

wire [n-1:0] 数据名1,数据名2,……数据名N;

这里,总共定义了N条线,每条线的位宽为n。下面给出几个例子: wire [9:0] a, b, c; // a, b, c都是位宽为10的wire型信号 wire d; 2.reg型

reg是寄存器数据类型的关键字。寄存器是数据存储单元的抽象,通过赋值语句可以改变寄存器存储的值,其作用相当于改变触发器存储器的值。reg型数据常用来表示always模块内的指定信号,代表触发器。通常在设计中要由always模块通过使用行为描述语句来表达逻辑关系。在always块内被赋值的每一个信号都必须定义为reg型,即赋值操作符的右端变量必须是reg型。

reg型信号的定义格式如下:

reg [n-1:0] 数据名1,数据名2,……数据名N;

这里,总共定义了N个寄存器变量,每条线的位宽为n。下面给出几个例子: reg [9:0] a, b, c; // a, b, c都是位宽为10的寄存器 reg d;

reg型数据的缺省值是未知的。reg型数据可以为正值或负值。但当一个reg型数据是一个表达式中的操作数时,它的值被当作无符号值,即正值。如果一个4位的reg型数据被写入-1,在表达式中运算时,其值被认为是+15。

reg型和wire型的区别在于:reg型保持最后一次的赋值,而wire型则需要持续的驱动.