EDA verilog程序设计语言数据类型综述Word文件下载.docx
《EDA verilog程序设计语言数据类型综述Word文件下载.docx》由会员分享,可在线阅读,更多相关《EDA verilog程序设计语言数据类型综述Word文件下载.docx(9页珍藏版)》请在冰豆网上搜索。
一、概述
Verilog数据类型分为两大类:
线网类型和寄存器类型。
线网类型主要表示Verilog中结构化元件之间的物理连线,其数值由驱动元件决定。
如果没有驱动元件接到线网上,则其默认值为高阻z。
寄存器类型主要表示数据的存储单元,其默认值为不定x。
二者最大的区别在于:
寄存器类型数据保持最后一次的赋值,而线网类型数据则需要持续的驱动。
另外,还有一类参数,主要是运行时的常数。
wire:
标准连线(默认为该类型);
tri:
具备高阻状态的标准连线;
wor:
线或类型驱动;
trior:
三态线或特性的连线;
wand:
线与类型驱动;
triand:
三态线与特性的连线;
trireg:
具有电荷保持特性的连线;
tri1:
上拉电阻(pullup);
tri0:
下拉电阻(pulldown);
supply0:
地线,逻辑0;
supply1:
电源线,逻辑1。
注意,其中只有wire、tri、supply0和supply1是可综合的,其余都是不可综合的,只能用于仿真。
VerilogHDL程序模块中输入、输出信号类型默认为wire型。
线网数据类型的通用说明语法为:
net_kind[msb:
lsb]net1,net2,…;
线网类型变量的赋值(也就是驱动)只能通过数据流assign操作来完成,不能用于always语句中。
reg:
常用的寄存器型变量,用于行为描述中对寄存器类的说明,由过程赋值语句赋值;
integer:
32位带符号整型变量;
time:
64位无符号时间变量;
real:
64位浮点、双精度、带符号实型变量;
realtime:
其特征和real型一致;
reg的扩展类型--memory类型。
3、net、register和parameter的声明
①net声明
<
net_type>
[range][delay]<
net_name>
[,net_name];
net_type:
net类型
range:
矢量范围,以[MSB:
LSB]格式
delay:
定义与net相关的延时
net_name:
net名称,一次可定义多个net,用逗号分开。
举例:
wandw;
//一个标量wand类型net
tri[15:
0]bus;
//16位三态总线
wire[0:
31]w1,w2;
//两个32位wire,MSB为bit0
②register声明
reg_type>
[range]<
reg_name>
[,reg_name];
reg_type:
寄存器类型
range:
矢量范围,[MSB:
LSB]格式。
只对reg类型有效
reg_name:
register名称,一次可定义多个register,逗号分开
rega;
//一个标量register
reg[3:
0]v;
//从MSB到LSB的4位寄存器向量
reg[7:
0]m,n;
//两个8位register
③parameter声明
用参数声明一个可变常量,常用于定义延时及宽度等参数。
参数定义:
parameter<
list_of_assignment>
;
可一次定义多个参数,用逗号隔开。
参数的定义是局部的,只在当前模块中有效。
参数定义可使用以前定义的整数和实数参数
二、主要数据类型详细介绍
1、Wire型
wire属于net型数据类型,相当于硬件电路中的各种物理连接,其特点是输出值紧跟输入值的变化而变化,verilog里一般不声明输出类型的话默认是wire型的。
例如,
wirecout=cin;
//只要cin变化,cout就变化
reg属于variable型数据类型,必须放在过程语句中,通过过程赋值语句赋值;
在过程块内被赋值的信号也必须定义成variable型。
也就是说,要在always和initial中赋值的变量必须定义为variable型。
有几种情况变量需要定义成wire。
第一。
assign语句
例如:
rega,b;
wireand_result;
...
assignand_result=a&
&
b;
第二。
元件例化时候的输出必须用wire
wiredout;
ramu_ram
(
.out(dout)
);
2、reg
reg型寄存器是数据储存单元的抽象。
寄存器数据类型的关键字是reg.通过赋值语句可以改变寄存器储存的值,其作用与改变触发器储存的值相当。
VerilogHDL语言提供了功能强大的结构语句使设计者能有效地控制是否执行这些赋值语句。
这些控制结构用来描述硬件触发条件,例如时钟的上升沿和多路器的选通信号。
在行为模块介绍这一节中我们还要详细地介绍这些控制结构。
reg类型数据的缺省初始值为不定值,x。
reg型数据常用来表示用于“always”模块内的指定信号,常代表触发器。
通常,在设计中要由“always”块通过使用行为描述语句来表达逻辑关系。
在“always”块内被赋值的每一个信号都必须定义成reg型。
reg型数据的格式如下:
reg[n-1:
0]数据名1,数据名2,…数据名i;
或
reg[n:
1]数据名1,数据名2,…数据名i;
reg是reg型数据的确认标识符,[n-1:
0]和[n:
1]代表该数据的位宽,即该数据有几位(bit)。
最后跟着的是数据的名字。
如果一次定义多个数据,数据名之间用逗号隔开。
声明语句的最后要用分号表示语句结束。
看下面的几个例子:
regrega;
//定义了一个一位的名为rega的reg型数据
0]regb;
//定义了一个四位的名为regb的reg型数据
reg[4:
1]regc,regd;
//定义了两个四位的名为regc和regd的reg型数据
对于reg型数据,其赋值语句的作用就象改变一组触发器的存储单元的值。
在Verilog中有许多构造(construct)用来控制何时或是否执行这些赋值语句。
这些控制构造可用来描述硬件触发器的各种具体情况,如触发条件用时钟的上升沿等,或用来描述具体判断逻辑的细节,如各种多路选择器。
reg型数据的缺省初始值是不定值。
reg型数据可以赋正值,也可以赋负值。
但当一个reg型数据是一个表达式中的操作数时,它的值被当作是无符号值,即正值。
当一个四位的寄存器用作表达式中的操作数时,如果开始寄存器被赋以值-1,则在表达式中进行运算时,其值被认为是+15。
3、reg和wire的区别
reg相当于存储单元,wire相当于物理连线
Verilog中变量的物理数据分为线型和寄存器型。
这两种类型的变量在定义时要设置位宽,缺省为1位。
变量的每一位可以是0,1,X,Z。
其中x代表一个未被预置初始状态的变量或者是由于由两个或多个驱动装置试图将之设定为不同的值而引起的冲突型线型变量。
z代表高阻状态或浮空量。
线型数据包括wire,wand,wor等几种类型在被一个以上激励源驱动时,不同的线型数据有各自决定其最终值的分辨办法。
两者的区别是:
即存器型数据保持最后一次的赋值,而线型数据需要持续的驱动输入端口可以由net/reg驱动,但输入端口只能是net;
输出端口可以使net/reg类型,输出端口只能驱动net;
若输出端口在过程块中赋值则为reg型,若在过程块外赋值则为net型用关键词inout声明一个双向端口,inout端口不能声明为寄存器类型,只能是net类型。
wire表示直通,即只要输入有变化,输出马上无条件地反映;
reg表示一定要有触发,输出才会反映输入。
不指定就默认为1位wire类型。
专门指定出wire类型,可能是多位或为使程序易读。
wire只能被assign连续赋值,reg只能在initial和always中赋值。
wire使用在连续赋值语句中,而reg使用在过程赋值语句中。
在连续赋值语句中,表达式右侧的计算结果可以立即更新表达式的左侧。
在理解上,相当于一个逻辑之后直接连了一条线,这个逻辑对应于表达式的右侧,而这条线就对应于wire。
在过程赋值语句中,表达式右侧的计算结果在某种条件的触发下放到一个变量当中,而这个变量可以声明成reg类型的。
根据触发条件的不同,过程赋值语句可以建模不同的硬件结构:
如果这个条件是时钟的上升沿或下降沿,那么这个硬件模型就是一个触发器;
如果这个条件是某一信号的高电平或低电平,那么这个硬件模型就是一个锁存器;
如果这个条件是赋值语句右侧任意操作数的变化,那么这个硬件模型就是一个组合逻辑。
输入端口可以由wire/reg驱动,但输入端口只能是wire;
输出端口可以使wire/reg类型,输出端口只能驱动wire;
若输出端口在过程块中赋值则为reg型,若在过程块外赋值则为net型。
用关键词inout声明一个双向端口,inout端口不能声明为reg类型,只能是wire类型;
输入和双向端口不能声明为寄存器类型。
简单来说硬件描述语言有两种用途:
1、仿真,2、综合。
对于wire和reg,也要从这两个角度来考虑。
从仿真的角度来说:
HDL语言面对的是编译器(如Modelsim等),相当于软件思路。
这时:
wire对应于连续赋值,如assign
reg对应于过程赋值,如always,initial
从综合的角度来说:
HDL语言面对的是综合器(如DC等),要从电路的角度来考虑。
1、wire型的变量综合出来一般是一根导线;
2、reg变量在always块中有两种情况:
(1)、always后的敏感表中是(aorborc)形式的,也就是不带时钟边沿的,综合出来还是组合逻辑。
(2)、always后的敏感表中是(posedgeclk)形式的,也就是带边沿的综合出来一般是时序逻辑,会包含触发器(Flip-Flop)。
在设计中,输入信号一般来说你是不知道上一级是寄存器输出还是组合逻辑输出,那么对于本级来说就是一根导线,也就是wire型。
而输出信号则由你自己来决定是寄存器输出还是组合逻辑输出,wire型、reg型都可以。
但一般的,整个设计的外部输出(即最顶层模块的输出),要求是寄存器输出,较稳定、扇出能力也较好。
三、选择正确的数据类型
信号可以分为端口信号和内部信号。
出现在端口列表中的信号是端口信号,其它的信号为内部信号。
对于端口信号
输入端口、输入输出端口只能是net类型。
输出端口可以是net类型,也可以是register类型。
若输出端口在过程块中赋值则为register类型;
若在过程块外(包括实例化语句)赋值,则为net类型。
内部信号类型与输出端口相同,可以是net或register类型。
若在过程块中赋值,则为register类型;
若在过程块外赋值,则为net类型。
一些错误:
用过程语句给一个net类型(或忘记声明类型)的信号赋值。
将实例的输入连接到register类型的信号上。
将模块的输入信号声明为register类型。
举例
四、Verilog语言相关介绍
Verilog是一种硬件描述语言(HDL:
HardwareDiscriptionLanguage),是一种一文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。
VerilogHDL和VHDL是目前世界上最流行的两种硬件描述语言,都是在20世纪80年代中期开发出来的。
前者由GatewayDesignAutomation公司(该公司于1989年被Cadence公司收购)开发。
两种HDL均为IEEE标准。
设计人员通过计算机对HDL语言进行逻辑仿真和逻辑综合,方便高效地设计数字电路及其产品。
常用的VerilogHDL语言开发软件有Altera公司的MAX+PLUSII,QuartusII和Xilinx公司的FoundationISE。
VerlogHDL的发展历史
1、1981年GatewayAutomation(GDA)硬件描述语言公司成立。
2、1983年该公司的PhilipMoorby首创了VerilogHDL,Moorby后来成为VerrlogHDL-XL的主要设计者和Cadence公司的第一合伙人。
3、1984-1985年Moorby设计出第一个关于VerilogHDL的仿真器。
4、1986年Moorby对VerilogHDL的发展有做出另一个巨大的贡献,提出了用于快速门级仿真的XL算法。
5、随着VerilogHDL-XL的成功,VerilogHDL语言得到迅速发展。
6、1987年Synonsys公司开始使用VerilogHDL行为语言作为综合工具的输入。
7、1989年Cadence公司收购了Gateway公司,VerilogHDL成为Cadence公司的私有财产。
8、1990年初Cadence公司把VerilongHDL和VerilongHDL-XL分开,并公开发布了VerilogHDL.随后成立的OVI(OpenVerilogHDLInternational)组织负责VerilogHDL的发展,OVI由VerilogHDL的使用和CAE供应商组成,制定标准。
9、1993年,几乎所有ASIC厂商都开始支持VerilogHDL,并且认为VerilogHDL-XL是最好的仿真器。
同时,OVI推出2.0版本的VerilongHDL规范,IEEE接收将OVI的VerilongHDL2.0作为IEEE标准的提案。
10、1995年12月,IEEE制定了VerilongHDL的标准IEEE1364-1995