SystemVerilog——第2章 数据类型

文章详细介绍了Verilog中的数据类型,包括逻辑类型、状态数据类型如bit、int等,以及定宽数组、动态数组、队列、关联数组的声明、初始化和操作方法。还提到了数组的比较、复制、排序功能,以及typedef和用户自定义结构的创建。此外,文章强调了根据需求选择合适数据结构的重要性。
摘要由CSDN通过智能技术生成

1 内建数据类型

1.1 逻辑(logic)类型

logic类型是四状态数据类型,不能有多个结构性的驱动,即只能有一个驱动

1.2 状态数据类型

bit b;              //双状态,单比特
bit [31:0] b32;     //双状态,32比特无符号整数
int unsigned ui;    //双状态,32比特无符号整数
int i;              //双状态,32比特有符号整数
byte b8;            //双状态,8比特有符号整数
shortint s;         //双状态,16比特有符号整数
longint l;          //双状态,64比特有符号整数
integer i4;         //四状态,32比特有符号整数
time t;             //四状态,64比特无符号整数
real r;             //双状态,双精度浮点数

2 定宽数组

2.1 定宽数组的声明和初始化

定宽数组的声明有两种方法,可以采用数组上下界的方式(完整的声明),也可以采用指定维度的方式(紧凑的声明)。

//定宽数组的声明
int lo_hi[0:15];   //16个整数[0]……[15]
int c_style[16];   //16个整数[0]……[15]

//声明并使用多维数组
int array2[0:7][0:3];     //完整的声明
int array3[8][4];         //紧凑的声明
array2[7][3]=1;           //设置最后一个元素

如果代码从越界的地址中读取数据,将会返回数组元素类型的缺省值,四状态类型返回X,双状态类型返回0;线网在没有驱动的时候输出是高阻态Z。

2.2 常量数组

使用单引号加大括号来初始化数组:

//初始化一个数组
int ascend[4]='{0,1,2,3};   //对4个元素进行初始化
int descend[5];

descend='{4,3,2,1,0};       //为5个元素赋值
descend[0:2]='{5,6,7};      //为前3个元素赋值
ascend='{4{8}};             //四个值全部为8
descend='{9,8,default:1};   //{9,8,1,1,1}

2.3 for和foreach

foreach循环中,只需要指定数组名并在其后面的方括号中给出索引变量,便会自动遍历数组中的元素;索引变量自动声明,并只在循环内有效;多维数组使用时,采用[i,j]的方式

//for循环的使用
for(int i=0;i<$size(src);i++)

//foreach循环的使用
foreach(md[i,j])

foreach循环会遍历原始声明中的数组范围

//数组f[5] == f[0:4]
foreach(f[i])   //等同于下式
for(int i;i<=4;i++) 

//数组rev[6:2]
foreach(rev[i])   //等同于下式
for(int i=6;i>=2;i--) 

2.4 数组操作——复制和比较

聚合比较和复制,其中比较只限于等于比较和不等于比较

2.5 同时使用位下标和数组下标

这里要了解$display$displayb$displayh$displayo的使用。

2.6 合并数组

合并数组既可以用作数组,也可以当成单独的数据,它的存放方式是连续的比特集合,中间没有任何闲置的空间。

2.7 合并数组的例子

声明合并数组时,合并的位和数组大小作为数据类型的一部分必须在变量名前面指定。数组大小定义的格式必须是[msb:lsb],而不是[size]
合并和非合并数组可以混合使用。

3 动态数组

定宽数组的宽度在编译时就确定了,可以会造成存储空间的浪费;动态数组可以在仿真时分配空间或调整宽度,可以使用最小的存储量。
动态数组在声明时使用空的下标[],其宽度不在编译时给出,而在程序运行时再指定。
数组在最开始时是空的,所以要调用new[]操作符来分配空间,同时在方括号中传递数组宽度。
可以把数组名传给new[]构造符,并把已有数组的值复制到新数组里。

4 队列

队列的声明是使用带有美元符号的下标:[$]。队列元素的编号从0到$。注意队列的常量只有大括号而没有数组常量中开头的单引号;不要对队列使用构造函数new[]

q.insert(i,j);    //在队列q的i位置处插入j
q.delete(i);      //删除队列q的第i个元素
q.delete();      //删除整个队列q

j=q.pop_back;     //取出队列q最后一个元素并赋值给j
q.push_back(j);   //在队列q的最后插入一个元素j
j=q.pop_front;    //取出队列q的第一个元素并赋值给j
q.push_front(j);  //在队列q的前面插入一个元素j

$放在一个范围表达式的左边,那么$将代表最小值,例如[$:2]就代表[0:2]。如果$放在一个范围表达式的右边,则代表最大值。

5 关联数组

关联数组采用在方括号中放置数据类型的形式进行声明

6 链表

应该避免使用链表。

7 数组的方法

7.1 数组缩减方法

sum、product、and、or、xor……

7.2 数组定位方法

min()、max()、unique()、find with……

7.3 数组的排序

reverse()、sort()、rsort()、shuffle()……

8 选择存储类型

根据灵活性、储存器用量、速度、排序来选择最优的数据结构。

9 使用typedef创建新的类型

10 创建用户自定义结构

11 类型转换

12 枚举类型

13 常量

14 字符串

15 表达式的位宽

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值