wire的本质是一条没有逻辑的连线,也就是说输入时什么输出也就是什么。wire型数据常用来表示以assign关键字指定的组合逻辑信号,模块的输入输出端口类型都默认为wire型,wire相当于物理连线,默认初始值是z(高组态)。
如果你把wire定义的变量用在有逻辑性的语句中就会出现综合错误:
例如:
在always语句中使用wire型定义的变量赋值,综合器就会报错。
reg型表示的寄存器类型,用于always模块内被赋值的信号,必须定义为reg型,代表触发器,常用于时序逻辑电路,reg相当于存储单元,默认初始值是x(未知状态)。reg型相对复杂些,其综合后的输出主要还看具体使用的场景:当在组合电路中使用reg,合成后的仍然是net网络;当在时序电路中使用reg合成后的才是register。
关于wire和reg在硬件描述语言中的释义一般需要分为以下两个部分来分析:
从电路综合角度来说
(1)wire型变量综合出来是一根导线
(2)reg型在always语句模块中又分为两种情况
(a) always后的敏感表中是(a or b or c)形式的,也就是不带时钟边沿的,综合出来还是组合逻辑
(b) always后的敏感表中是(posedge clk)形式的,也就是带边沿的,综合出来一般是时序逻辑,会包含触发器(Flip-Flop)
在设计中,输入信号一般来说你是不知道上一级是寄存器输出还是组合逻辑输出,那么对于本级来说就是一根导线,也就是wire型。而输出信号则由你自己来决定是组合逻辑输出还是寄存器输出,wire型、reg型都可以。但一般的,整个设计的外部输出(即最顶层模块的输出),要求是寄存器输出,较稳定、扇出能力也较好。
从仿真分析角度来说
wire对应于连续赋值,如assign
reg对应于过程赋值,如always,initial
(1)assign 语句中变量需要定义成wire型,使用wire必须搭配assign
例如:
reg a,b;
wire result;
…
assign result =a&&b;
你可以试试把wire定义成reg,综合器会报错。
(2)元件例化时候的输出必须用wire
例如:
wire dout;
ram u_ram
(
…
.out(dout)
…
);
(3)input、output和inout的预设值都是wire
(1)变量放在begin……end之内必须使用reg变量
(2)在initial语句中使用