System Verilog — 数据类型

一、内建数据类型

四值逻辑类型二值逻辑类型
logic integer reg net-typebyte int longint shortint bit
有符号类型无符号类型
byte integer int longint shortintlogic bit reg net-type

Tips:
(1)四值状态返回的缺省值为x,二值状态返回的缺省值为0。
(2)logic类型只能有一个驱动。
(3)线网在没有驱动的时候输出是z。

二、数组

1.定宽数组

定宽数组的声明

int array_lo_hi[0:15];//16个整数[0]...[15]
int array_c_style[16];//16个整数[0]...[15]

多维数组的声明

int array1 [0:7][0:3];//完整的声明
int array2 [8][4];//紧凑的声明
array1[7][3] = 1;//设置最后一个元素

常量数组的初始化

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

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

基本的数组操作
<1> foreach
多维数组遍历的语法格式

int md[2][3] = '{ '{0, 1, 2}, '{3, 4, 5}};
foreach(md[i, j])
	$display("md[%0d][%0d]=%0d", i, j, md[i, j]);

对于数组f[0:4]来说,foreach(f[i])等同于

for(int i=0;i<=4;i++)

对于数组rev[6:2]来说,foreach(rev[i])等同于

for(int i=6;i>=2; i--)

<2>复制和比较

dst == src;//把src的所有元素复制给dst

使用“?:”操作符进行比较,
如A?B:C, 判断A,A为真执行B,否则执行C。

<3>合并数组与非合并数组的使用

合并/非合并混合数组的声明

bit[3:0][7:0]barray[3];//一个具有三个合并元素的非合并数组,3x32比特
bit[31:0]lw = 32'h0123_4567;//一个字
bit[7:0][3:0]nibbles;//合并数组

barray[0] = lw;//使用一个下标,可以得到一个字的数据
barray[0][3] = 8'h01;//使用两个下标,可以得到一个字节的数据
barray[0][1][6] = 1'b1;//使用三个下标,可以访问到单个比特位
nibbles = barray[0];//复制合并数组的元素值

Tips:
(1)声明合并数组时,合并的位和数组大小作为数据类型的一部分必须在变量名前面指定。数组大小定义的格式必须是[msb:lsb],而不是[size]。
(2)数组声明中在变量名后面指定了数组的大小barray[3],这个维度是非合并的,所以在使用该数组的时候至少要有一个下标。

2.动态数组

(1)动态数组的宽度不像定宽数组一样在编译时给出,而是在程序运行时再指定。
(2)数组在最开始是空的,需要调用new[ ]来分配空间,同时在方括号中传递数组宽度。
(3)只要基本数据类型相同,例如都是int,定宽数组和动态数组之间就可以相互赋值,在元素数目相同的情况下,可以把动态数组的值复制到定宽数组。

int d1[],d2[];//声明动态数组

initial begin
	d1 = new[5];//分配给d1五个元素
	foreach(d1[i])	d1[i] = i;//对元素进行初始化
	d2 = d1;//复制一个动态数组
	d2[0] = 5;//修改复制值
	$display(d1[0], d2[0]);//显示数值(0和5)
	d1 = new[20](d1);//分配20个整数值并把原来的d1数组复制给开始的五个元素
	d1 = new[100];//分配100个新的整数值,旧值不复存在
	d1.delete();//删除所有元素
end

3.关联数组

关联数组可以用来保存稀疏矩阵的元素,当你对一个非常大的地址空间寻址时,该数组只为实际写入的元素分配空间,使得所占用的空间极小。

initial begin
	bit[63:0]assoc[bit[63:0]], idx = 1;
	//对稀疏分布的元素进行初始化
	repeat(64) begin
		assoc[idx] = idx;
		idx = idx<<1;
	end
	//使用foreach遍历数组
	foreach(assoc[i])
		$display("assoc[%h] = %h", i, assoc[i]);
end
	

4.数组的方法

  1. 数组缩减方法(把一个数组缩减成一个值)
    sum,对数组中的所有元素求和。
    此外,还有product(积),and(与),or(或),xor(异或)。
  2. 数组定位方法
//数组定位方法min, max, unique
int f[6] = '{1, 6, 2, 6, 8, 6};
int d[ ] = '{2, 4, 6, 8, 10};
int q[$] = '{1, 3, 5, 7}, tq[$];

tq = q.min();//{1}
tq = d.max();//{10}
tq = f.unique();//{1, 6, 2, 8}
//数组定位方法find
int d[ ] = '{9, 1, 8, 3, 4, 4}, tq[$];
//找出所有大于3的元素
tq = d.find with(item >3);//{9, 8, 4, 4}
//等效代码
foreach (d[i])
	if (d[i])
		tq.push_back(d[i]);

tq = d.find_index with(item >3);//{0, 2, 4, 5},(即9, 8, 4, 4的index)
tq = d.find_first with(item >99);//{ }没有找到
tq = d.find_first_index with(item == 8);//{2} d[2] = 8


//数组定位方法count和total
int count, total, d[ ] = '{9, 1, 8, 3, 4, 4};
count = d.sum with(item > 7);//2    {9, 8}
total = d.sum with((item > 7) * item);//17   1*9+1*8
count = d.sum with(item < 8);//4   {1, 3, 4, 4}
total = d.sum with(item < 8 ? item :0);//12   1+3+4+4
count = d.sum with(item == 4);//2     {4, 4}
  1. 数组的排序
int d[ ] = '{9, 1, 8, 3, 4, 4};
d.reverse();//反转  {4, 4, 3, 8, 1, 9}
d.sort();//正序    {1, 3, 4, 4, 8, 9}
d.rsort();//逆序    {9, 8, 4, 4, 3, 1}
d.shuffle();//洗牌     {9, 4, 3, 8, 1, 4}

三、队列

  1. 结合了链表和数组的优点,可以在其他任何地方添加或删除元素,并且通过索引实现对任一元素的访问。
  2. 队列的声明是使用下标[ $ ],队列元素的标号从0到$。(可以使用字下标串联,[ $:2 ]代表[0:2], [1 : $]代表[1:2]。)
  3. 队列不需要new[ ]去创建空间,只需要使用其方法增减元素,一开始其空间为0.
  4. 队列可以通过push_back()和pop_front()来实现FIFO。
int j = 1;
q2[$] = {3, 4};//队列的常量不需要使用"'"
q[$] = {0, 2, 5};//{0, 2, 5}
initial begin
	q.insert(1, j);//{0, 1, 2, 5} 在2之前插入1
	q.insert(3, q2);//{0, 1, 2, 3, 4, 5} 在q中插入一个队列
	q.delete(1);//{0, 2, 3, 4, 5 } 删除第一个元素
	q.push_front(6);//{6, 0, 2, 3, 4, 5} 在队列前面插入
	j = q.pop_back();//{6, 0, 2, 3, 4}  j = 5
	q.push_back(8);//{6, 0, 2, 3, 4, 8} 在队列末尾插入
	j = q.pop_front();//{0, 2, 3 ,4, 8}  j = 6
	foreach(q[i])
		$display(q[i]);//打印整个队列
	q.delete();//删除整个队列
end

四、字符串

字符串方法
getc(N):返回N位置上的字节。
toupper:返回一个所有字符大写的字符串。
tolower:返回一个所有字符小写的字符串。
{ }:用于串接字符串。
putc(M, C):把字节C写到字符串的M位置上。
substr(start, end):提取出从位置start到end之间的所有字符。

string s;
initial begin
	s = "IEEE ";
	$display(s.getc(0));//73('I')
	$display(s.tolower());//ieee
	s.putc(s.len()-1, "-");//将空格变为'-'
	s = {s, "P1800"};//“IEEE-P1800”
	$display(s.substr(2, 5));//EE-P
end
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值