verilog中reg和wire类型的区别

发布时间:2011-08-01 21:34:20

reg相当于存储单元,wire相当于物理连线

Verilog 中变量的物理数据分为线型和寄存器型。这两种类型的变量在定义时要设置位宽,缺省为1位。变量的每一位可以是01XZ。其中x代表一个未被预置初始状态的变量或者是由于由两个或多个驱动装置试图将之设定为不同的值而引起的冲突型线型变量。z代表高阻状态或浮空量。

线型数据包括wire,wand,wor等几种类型在被一个以上激励源驱动时,不同的线型数据有各自决定其最终值的分辨办法。

两者的区别是: 寄存器型数据保持最后一次的赋值,而线型数据需要持续的驱动

输入端口可以由net/reg驱动,但输入端口只能是net;输出端口可以使net/reg类型,输出端口只能驱动net;若输出端口在过程块中赋值则为reg型,若在过程块外赋值则为net
用关键词inout声明一个双向端口, inout端口不能声明为寄存器类型,只能是net类型。

**********************************************************************************************************************

    wire表示直通,即只要输入有变化,输出马上无条件地反映;reg表示一定要有触发,输出才会反映输入。

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

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

    输入端口可以由wire/reg驱动,但输入端口只能是wire;输出端口可以使wire/reg类型,输出端口只能驱动wire;若输出端口在过程块中赋值则为reg型,若在过程块外赋值则为net型。用关键词inout声明一个双向端口, inout端口不能声明为reg类型,只能是wire类型;输入和双向端口不能声明为寄存器类型。

   简单来说硬件描述语言有两种用途:1、仿真,2、综合。

对于wirereg,也要从这两个角度来考虑。


*********************************************************************************
从仿真的角度来说,HDL语言面对的是编译器(如Modelsim等),相当于软件思路。
这时:
wire对应于连续赋值,如assign
reg对应于过程赋值,如alwaysinitial

*********************************************************************************
从综合的角度来说,HDL语言面对的是综合器(如DC等),要从电路的角度来考虑。
这时:
1wire型的变量综合出来一般是一根导线;
2reg变量在always块中有两种情况:
(1)always后的敏感表中是(a or b or c)形式的,也就是不带时钟边沿的,综合出来还是组合逻辑
(2)always后的敏感表中是(posedge clk)形式的,也就是带边沿的,综合出来一般是时序逻辑,会包含触发器(FlipFlop

在设计中,输入信号一般来说你是不知道上一级是寄存器输出还是组合逻辑输出,那么对于本级来说就是一根导线,也就是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都是位宽为10wire型信号
        wire d;

2reg
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型则需要持续的驱动。

附:

verilog-2001的标准中对wirereg的定义如下:

wire

A wire net can be used for nets that are driven by a single gate or continuous assignment.

reg

Assignments to a reg are made by procedural assignments (see 6.2 and 9.2). Since the reg holds a value

between assignments, it can be used to model hardware registers. Edge-sensitive (i.e., flip-flops) and level

sensitive (i.e., RS and transparent latches) storage elements can be modeled. A reg needs not represent a

hardware storage element since it can also be used to represent combinatorial logic.

verilog中reg和wire类型的区别

相关推荐