Verilog 数据类型
Verilog中,数据类型主要分为两类:物理数据类型(主要包括连线型和寄存器型)和抽象数据类型(主要包括:整型、时间型、实型和参数型)
物理数据类型与实际硬件电路的硬件关系比较明显,抽象程度比较低
抽象数据类型是进行辅助设计和验证的数据类型
1 物理数据类型
Verilog中主要的物理数据类型是:连线型、寄存器型、存储器型
使用四种逻辑电平(0,1,x,z)和八种信号强度(strength)对实际的电路进行建模
四种逻辑电平是对信号的抽象
信号强度表示数字电路中不同强度的驱动源,用来解决不同驱动强度下的赋值冲突,八种强度如下,自上往下,强度递减
标记符号 | 名称 | 类型 |
---|---|---|
supply | 电源级驱动 | 驱动 |
strong | 强驱动 | 驱动 |
pull | 上拉级驱动 | 驱动 |
large | 大容性 | 存储 |
weak | 弱驱动 | 驱动 |
medium | 中性驱动 | 存储 |
small | 小容性 | 存储 |
highz | 高容性 | 高祖 |
1.1 连线型
连线表示逻辑单元的物理连接,可以对应电路中的物理信号连线,这种变量不能保持电荷(trireg除外)
连线型变量必须要有驱动源,一种是连接到一个门或者模块的输出端,另一种是用assign对它进行赋值,若没有驱动源,将保持高阻态z
连线型有如下几种:
连线型数据类型 | 功能说明 |
---|---|
wire,tri | 标准连线(缺省为该类型) |
wor,trior | 多重驱动时,具有线或特性的连线型 |
trireg | 具有电荷保持特性的连线型数据 |
tri1 | 上拉电阻 |
tri0 | 下拉电阻 |
supply0 | 电源线,用于对“地”建模,为低电平0 |
supply1 | 电源线,用于对电源线建模,为高电平1 |
wand, trand | 多重驱动时,具有线与特性的连线型 |
1.1.1 wire和tri
wire(连线)和tri(三态线)是最常见的,语法和语义是一致的。
不同之处如下:
wire型变量通常用来表示单个驱动门或assign赋值语句的连线
-
tri型变量用来表示多驱动器驱动的连线型数据,主要用于定义三态的线网
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 上述真值表是:同时有两个驱动强度相同的驱动源来驱动wire或tri变量时的输出结果
注意:这里并非是与逻辑,可以理解为都想给线赋值,因此当出现0和1同时赋值时,由于驱动强度相同,因此最终结果是不定值x
1.1.2 wor和trior
wor/trior | 0 | 1 | x | z |
---|---|---|---|---|
0 | 0 | 1 | x | 0 |
1 | 1 | 1 | 1 | 1 |
x | x | 1 | 1 | 1 |
z | 0 | 1 | x | z |
1.1.3 wand和triand
wand/triand | 0 | 1 | x | z |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
1 | 0 | 1 | x | 1 |
x | 0 | x | x | x |
z | 0 | 1 | x | z |
wand和triand便是与逻辑,因此当0和1同时出现时,结果是0&1
的结果
1.1.4 tri0和tri1
tri的特征是,若无驱动源,其值为紧跟的数字
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 |
1.1.5 supply0和supply1
supply0表示GND,supply1表示VCC
1.1.6 trireg线网
trireg线网型可以存储数值,类似于寄存器数据类型,用于电容节点的建模。
当三态寄存器(trireg)的所有驱动源都处于高阻态z
时,trireg保持作用在线网的最后一个逻辑值。
trireg的缺省初始值为x
存储电荷强度有如下几个关键字控制:
small、medium、large,默认电荷强度为medium
对于trireg型数据,仿真时其电荷衰减时间应制定为延迟时间
1.2 寄存器型
reg型变量对应的硬件电路元件具有状态保持作用,能够存储数据
reg型变量常用于行为级描述,由过程赋值语句对其进行赋值
reg和wire的区别:
- reg保持最后一次的赋值,wire需要持续的驱动
- reg默认初始值为不定值
x
,wire默认初始值为不定值z
reg型变量一般是无符号的,若将负数赋值给reg型变量,会自动转成其补码形式
1.3 连线型和寄存器型数据声明对比
1.3.1 连线型数据声明
语法为<net_declaration><drive_strength><range><delay><list_of_variables>
drive_strength、range、delay是可选项目,list_of_variables为必选项
- net_declaration:数据的类型,可以是wire、tri、tri0、tri1、wand、triand、trior、wor、trireg中的任意一个
- drive_strength:驱动强度
- range:用来指定数据位标量或矢量。默认表示数据类型为1bit的标量,超过1bit就为矢量形式
- delay:指定仿真延迟时间
- list_of_variables:变量名称
1.3.2 寄存器型数据声明
语法为:reg <range><list_of_variables>
- range:可选项,确定变量位宽
- list_of_variables:变量名称
1.4 存储器型
存储器型本质上是寄存器型变量的阵列,所以用reg型变量建立寄存器组实现存储器功能。
存储器变量声明格式:reg<range1><name_of_list><range2>
其中,range1和range2是可选项,缺省是都为1
说明:
- range1:表示存储器中寄存器的位宽
- range2:表示寄存器的个数
例如:reg [7:0] mem [255:0]
表示由256个位宽为8bit的寄存器组成的存储器
2 抽象型数据类型
抽象型数据类型有:整型(integer)、时间型(time)、实型(real)和参数型(parameter)
2.1 整型
整型数据常用于对循环控制变量的说明,在算术运算中被视为二进制补码形式的有符号数
整型数据默认为32bit有符号数
2.2 时间型
时间型与整型数据类似,不过时间型是64bit无符号数
时间型数据主要用于对模拟时间的存储与计算处理,常与系统函数$time
一起使用
2.3 实型
Verilog支持实型常量与变量,实型数据在机器码表示法中是浮点型数据,可用于对延迟时间的计算
2.4 参数型
参数型数据属于常量,在仿真开始之前就被赋值,并在仿真过程中保持不变
参数定义方法可以提高程序可可读性和可维护性,常用来定义延迟时间和变量的位宽