Verilog wire和reg分析2

原文地址:http://www.cnblogs.com/thymon/archive/2010/06/09/1754541.html

作者:thymon

版权申明:版权属于原作者,此处转载仅用于学习


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

对于wire和reg,也要从这两个角度来考虑。
*********************************************************************************
从仿真的角度来说,HDL语言面对的是编译器(如Modelsim等),相当于软件思路。
这时:
1,wire对应于连续赋值,如assign

2,reg对应于过程赋值,如always,initial

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

从综合的角度来说,HDL语言面对的是综合器(如DC等),要从电路的角度来考虑。
这时:
1、wire型的变量综合出来一般是一根导线;

2、reg变量在always块中有两种情况:
      (1)、always后的敏感表中是(a or b or c)形式的,也就是不带时钟边沿的,综合出来还是组合逻辑
      (2)、always后的敏感表中是(posedge clk)形式的,也就是带边沿的,综合出来一般是时序逻辑,会包含触发器(Flip-Flop)

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

为什么在verilog中要定义wire?

有几种情况变量需要定义成wire。
第一。assign 语句
例如:
reg a,b;
wire and_result;
...
assign and_result =a&&b;
你可以试试把wire定义成reg。综合器会报错。

第二。元件例化时候的输出必须用wire
例如:
wire dout;

ram u_ram
(
...
.out(dout)
...
);

wire按照国外的教材上面的定义:
         wire为无逻辑连线。只做连线,wire本身是不带逻辑性的,所以输入什么输出就是什么。所以你尝试着用always语句对wire变量赋值。综合器就会报错。
那么你可能会问。assign c =a&&b不是就是对wire的赋值吗?
        其实并非如此。综合器综合时将a&&b综合成ab经过一个与门。而c只是连接到与门输出的线。正真综合出与门的是&&。而不是c。

 

Abstract
Verilog初学者常见问题:什么时候用reg,什么时候用wire?

Introduction
1,一般情况下,reg放在begin...end內,wire放在begin...end之外

2,另外给wire赋值时,必须搭配assign;reg则不必。

3,input,ouput,inout默认类型都是wire。若wire和reg用错地方,compiler都会提醒,所以不必太担心。

4,特别注意,在Verilog中使用reg,並不总是表示综成后就是寄存器(register)或者触发器。若在組合电路中使用reg,综合后仍只是net,唯有在时序电路中使用reg,综合后才会以flip-flop形式表示成register。


你可能感兴趣的:(FPGA,Verilog,wire和reg分析2)