每次写verilog代码时都会考虑把一个变量是设置为wire类型仍是reg类型,所以把网上找到的一些关于这方面的资料整理了一下,方便之后查找。spa
wire表示直通,即只要输入有变化,输出立刻无条件地反映;reg表示必定要有触发,输出才会反映输入。设计
不指定就默认为1位wire类型。专门指定出wire类型,多是多位或为使程序易读。wire只能被assign连续赋值,reg只能在initial和always中赋值。wire使用在连续赋值语句中,而reg使用在过程赋值语句中。orm
在连续赋值语句中,表达式右侧的计算结果能够当即更新表达式的左侧。在理解上,至关于一个逻辑以后直接连了一条线,这个逻辑对应于表达式的右侧,而这条线就对应于wire。在过程赋值语句中,表达式右侧的计算结果在某种条件的触发下放到一个变量当中,而这个变量能够声明成reg类型的。根据触发条件的不一样,过程赋值语句能够建模不一样的硬件结构:若是这个条件是时钟的上升沿或降低沿,那么这个硬件模型就是一个触发器;若是这个条件是某一信号的高电平或低电平,那么这个硬件模型就是一个锁存器;若是这个条件是赋值语句右侧任意操做数的变化,那么这个硬件模型就是一个组合逻辑。ip
输入端口能够由wire/reg驱动,但输入端口只能是wire;输出端口可使wire/reg类型,输出端口只能驱动wire;若输出端口在过程块中赋值则为reg型,若在过程块外赋值则为net型。用关键词inout声明一个双向端口, inout端口不能声明为reg类型,只能是wire类型;输入和双向端口不能声明为寄存器类型。it
简单来讲硬件描述语言有两种用途:一、仿真,二、综合。
对于wire和reg,也要从这两个角度来考虑。
*********************************************************************************
从仿真的角度来讲,HDL语言面对的是编译器(如Modelsim等),至关于软件思路。
这时:
wire对应于连续赋值,如assign
reg对应于过程赋值,如always,initial
*********************************************************************************
从综合的角度来讲,HDL语言面对的是综合器(如DC等),要从电路的角度来考虑。
这时:
一、wire型的变量综合出来通常是一根导线;
二、reg变量在always块中有两种状况:
(1)、always后的敏感表中是(a or b or c)形式的,也就是不带时钟边沿的,综合出来仍是组合逻辑
(2)、always后的敏感表中是(posedge clk)形式的,也就是带边沿的,综合出来通常是时序逻辑,会包含触发器(Flip-Flop)
在设计中,输入信号通常来讲你是不知道上一级是寄存器输出仍是组合逻辑输出,那么对于本级来讲就是一根导线,也就是wire型。而输出信号则由你本身来决定是寄存器输出仍是组合逻辑输出,wire型、reg型均可以。但通常的,整个设计的外部输出(即最顶层模块的输出),要求是寄存器输出,较稳定、扇出能力也较好。编译