一、本质
1.wire和reg的本质是什么
wire的本质是一条没有逻辑的连线,也就是说输入时什么输出也就是什么。wire型数据常用来表示以assign关键字指定的组合逻辑。输入输出端口类型都默认为wire型,wire相当于物理连线,默认初始值是z(高组态)。
如果你把wire定义的变量用在时序逻辑的语句中就会出现综合错误:
例如:
在always语句中使用wire型定义的变量赋值,综合器就会报错。
reg型表示的寄存器类型,用于always模块内被赋值的信号,必须定义为reg型。
reg表示一定要有触发,输出才会反映输入的状态。根据触发条件的不同,模块可以建模不同的硬件结构:如果这个条件是时钟的上升沿或下降沿,那么这个硬件模型就是一个触发器(时序逻辑);如果这个条件是某一信号的高电平或低电平,那么这个硬件模型就是一个锁存器(组合逻辑);如果这个条件是赋值语句右侧任意操作数的变化,那么这个硬件模型就是一个组合逻辑。
reg型相对复杂些,其综合后的输出主要还看具体使用的场景:当在组合电路中使用reg,合成后的仍然是net网络;当在时序电路中使用reg合成后的才是register。
二、从仿真来看
从仿真分析角度来说
wire对应于连续赋值,如assign
reg对应于过程赋值,如always,initial
三、什么时候使用wire型
(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
四、什么时候用reg型
(1)变量放在begin……end之内必须使用reg变量
(2)在initial语句中使用