Verilog HDL语法-数据类型

数据类型

在Verilog HDL中共有19种数据类型。这19种数据类型可以划分为两大类:物理数据类型(主要包括连线型及寄存器型)和抽象数据类型(主要包括整形、时间型、实型及参数型)。

物理数据类型

对于实际数字电路,除了信号的逻辑值(低电平,高电平,不定态,高阻态)外,不同的信号还有强度的区别。在Verilog HDL中使用了四种逻辑值和八种信号强度对实际电路进行建模。信号强度的引入,可以解决不同驱动强度下的赋值冲突。

连线型

概述

下表给出了各种连线型变量类型及相应的含义。

连线型数据类型功能说明
wire,tri标准连线型
eor,trior多重驱动时,具有线或特性的连线型
wand,trand多重驱动时,具有线与特性的连线型
trireg具有电荷保持特性的连线型数据
tri1上拉电阻
tri0下拉电阻
supply1电源线,用于对电源建模,为高电平1
supply0电源线,用于对“地”建模,为低电平0

连线表示逻辑单元的物理连接,这种变量类型不能保持电荷(除trireg外)。连线型变量必须有驱动源(包括连接到一个门或一个模块的输出端以及用assign连续赋值语句对这一类型的变量进行赋值两种形式)。在没有驱动源时连线类型的变量将一直保持高阻态。

下面对以上几种连线型数据类型进行简单的说明:

  1. wire与tri的区别:wire(连线)类型和tri(三态线)类型的用法是完全相同的。只是当我们需要定义一个三态门驱动的硬件连线时,tri会更具可读性。
    当两个驱动源同时对一个wire类型(或tri类型)的语句赋值时,wire会被赋值为驱动强度更高的信号。如果两个信号强度相同,输出结果见下表:
wire,tri01xz
00xx0
1x1x1
xxxxx
z01xz
  1. wor和trior:wor与wire的区别主要在于当多个驱动源驱动同一个变量时的情况。当多个驱动源驱动一个wor类型变量时,相当于将多个wire类型的变量连接到一个或门上再输出。所以有多个驱动源同时驱动同一个wor类型的变量时会产生线或结构。与此相同,trior相当于多个tri类型的变量连接到一个或门上。
  2. wand和triand:参照wor和trior。
  3. tri0/tri1:在无驱动源时,其值为0/1;在多个驱动源的情况下,tri0/tri1的输出如下表:
tri0/tri101xz
00xx0
1x1x1
xxxxx
z01x0/1
  1. supply0/supply1:supply0用于对“地”建模,即低电平0;supply1用于对电源建模,即高电平1.
  2. 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 , …

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值