数据类型
在Verilog HDL中共有19种数据类型。这19种数据类型可以划分为两大类:物理数据类型(主要包括连线型及寄存器型)和抽象数据类型(主要包括整形、时间型、实型及参数型)。
物理数据类型
对于实际数字电路,除了信号的逻辑值(低电平,高电平,不定态,高阻态)外,不同的信号还有强度的区别。在Verilog HDL中使用了四种逻辑值和八种信号强度对实际电路进行建模。信号强度的引入,可以解决不同驱动强度下的赋值冲突。
连线型
概述
下表给出了各种连线型变量类型及相应的含义。
连线型数据类型 | 功能说明 |
---|---|
wire,tri | 标准连线型 |
eor,trior | 多重驱动时,具有线或特性的连线型 |
wand,trand | 多重驱动时,具有线与特性的连线型 |
trireg | 具有电荷保持特性的连线型数据 |
tri1 | 上拉电阻 |
tri0 | 下拉电阻 |
supply1 | 电源线,用于对电源建模,为高电平1 |
supply0 | 电源线,用于对“地”建模,为低电平0 |
连线表示逻辑单元的物理连接,这种变量类型不能保持电荷(除trireg外)。连线型变量必须有驱动源(包括连接到一个门或一个模块的输出端以及用assign连续赋值语句对这一类型的变量进行赋值两种形式)。在没有驱动源时连线类型的变量将一直保持高阻态。
下面对以上几种连线型数据类型进行简单的说明:
- wire与tri的区别:wire(连线)类型和tri(三态线)类型的用法是完全相同的。只是当我们需要定义一个三态门驱动的硬件连线时,tri会更具可读性。
当两个驱动源同时对一个wire类型(或tri类型)的语句赋值时,wire会被赋值为驱动强度更高的信号。如果两个信号强度相同,输出结果见下表:
wire,tri | 0 | 1 | x | z |
---|---|---|---|---|
0 | 0 | x | x | 0 |
1 | x | 1 | x | 1 |
x | x | x | x | x |
z | 0 | 1 | x | z |
- wor和trior:wor与wire的区别主要在于当多个驱动源驱动同一个变量时的情况。当多个驱动源驱动一个wor类型变量时,相当于将多个wire类型的变量连接到一个或门上再输出。所以有多个驱动源同时驱动同一个wor类型的变量时会产生线或结构。与此相同,trior相当于多个tri类型的变量连接到一个或门上。
- wand和triand:参照wor和trior。
- tri0/tri1:在无驱动源时,其值为0/1;在多个驱动源的情况下,tri0/tri1的输出如下表:
tri0/tri1 | 0 | 1 | x | z |
---|---|---|---|---|
0 | 0 | x | x | 0 |
1 | x | 1 | x | 1 |
x | x | x | x | x |
z | 0 | 1 | x | 0/1 |
- supply0/supply1:supply0用于对“地”建模,即低电平0;supply1用于对电源建模,即高电平1.
- trireg线网:还没有涉及到,留待后续补充。
连线型变量的声明
<net_declaration> <drive_strength> <range> <delay> [list_of_variables];
net_delaration和list_of_variables是必选项,其他可选。当没有range时默认1位的。
寄存器型
概述
reg型变量时数据存储单元的抽象类型,其对应的硬件电路具有状态保持作用,能够存储数据,如触发器、锁存器等。reg型变量常用语行为级描述中,由过程赋值语句对其进行赋值。
reg型变量与wire型变量的区别在于,reg型变量保持最后一次赋值,而wire型变量必须需要有持续的驱动。一般,reg型变量的初始值为x。
reg型变量是无符号数,如果将一个赋值赋值给reg型变量,会自动转换成其对应的补码形式。
在过程块内被赋值的变量都必须定义为reg型,并且只能在initial或always过程块中赋值,大多数reg型信号常常是寄存器或触发器的输出。
寄存器型变量的声明
reg <range> <list_of_variables>;
存储器型
存储器型(memory)本质上还是寄存器型变量阵列。
声明格式:
reg <range1> <name_of_register> <range2>;
range1是memory的位宽;
range2是memory的深度;
name_of_register是memory的变量名。
抽象数据类型
整型
integer是有符号类型,保存的是整数的二进制补码。
声明格式:interger <list_of_register_variables>;
时间型
time类型与integer类型类似,只是它是64位无符号数。
声明格式: time <list_of_register_variables>;
实型
Verilog HDL支持实型常量与变量。实型数据在机器码表示中是浮点型数值,可用于对延时时间的计算。
声明格式:real <list_of_register_variables>;
参数型
参数型数据属于常量,在仿真开始前就被赋值,在仿真过程中保持不变。参数常用来定义延迟时间和变量的位宽。参数一旦被定义就不能通过其他语句对它重新赋值。改变参数的值是通过模块间的参数传递实现的。
声明格式:parameter 参数名1 = 表达式1, 参数名2=表达式2 , …