一、动态数组
最大特点:在仿真运行时灵活调节数组的大小,即存储量。
动态数组声明时,需要使用‘[]’来声明,此时数组是空的,即容量为0。其后,需要使用‘new[]’来分配空间。
例子:
重新dyn=new[20],原本的物理空间被释放,没有了。
dyn=new[20](dyn);将0、1、2、3、4五个数复制到20个数值的最低五个元素,剩下的十五个元素为int的默认值,是0。
补充:integer的默认值为x。
二、队列
具备链表和数组的优点,可以在任何地方添加或删除元素,并且通过索引访问任一元素。
队列的声明使用:[$]。队列元素的标号从0到$。
不需要使用new[]去创建空间,只要使用队列的方法。
队列的简单使用是通过自带的方法push_back()和pop_front()的结合来实现FIFO的用法。
第一行错别字。队列赋值
三、关联数组
用来保存稀疏矩阵的元素,例如数组内标号不用按照顺序,更加的灵活。
需要对一个非常大的地址空间寻址时,该数组只为实际写入的元素分配空间,这种方法所需要的空间比定宽或动态数组所占空间要小的多
例子:
定义一个关联数组bit [63:0] assoc[int], idx=1;//存储64位无符号的数据,标号索引值类型为int。
idx左移,idx为索引值为1、2、4、8、....。
之后执行的foreach(assoc[i])来遍历数组,则会按照1、2、4、8、.....来遍历。
但是输出不一定会按照标号的从大到小或从小到大来排序,因此打印之前要先排序。
函数有如下:
pre为找到现在排序中,所给索引的前一个index;next为找到现在排序中的下一个index;last为找到现在排序中的最后一个index。
关联数组中如果输入英文单词,则会按照单词首字母的26个英文字母排序进行先后。
由代码可知,实际关联数组内的排序为:①apple、②guava、③orange、④plum—按照字母顺序A至Z来排序。
- 关联数组和动态数组的区别
四、结构体
弥补了Verilog中没有数据结构的缺陷,在SV中可以使用struct语句创建结构,跟C语言类似。
struct和typedef可以创建新的类型,并用新的类型来声明更多变量。
使用struct创建了一个没有名字的、含有r、g、b三个成员变量的结构体,pixel是由这个没有名字的结构体声明的变量。
通过typedef来给struct创建的一个pixel结构体来命名。名字为pixel_s。
不是非合并型数组, 数据不是紧挨着连续存放的,就要加单引号来表示
由截图中圈中的单引号,可知,r、g、b三个变量不是连续存储的,是分开存放的。
连续存放的则不用加单引号,比如队列是连续存储。
五、枚举类型
枚举类型enum和typedef搭配使用
练习:
答案:A
在case中,int=enum,int类型可以直接等于枚举类型。
如果是enum=int,则需要先类型转化,把int转化为枚举类型再赋值。
六、字符串
字符串格式转换函数,即形成一个我想要的字符串句子,使用$sformatf()。如果只需要打印输出,则使用$display()。
例子:
在SV中没有空字符这个概念,string s;声明s字符串没有赋值,则为“ ”。
s.get(0)——获取第零位的字符。
s.tolower()——转化为小写。
s.len()——字符串长度。
s.putc(s.len()-1,"_")——将空格变为下划线。s.putc(a,"b")——a为字符串位置,b为替换字符串中a位置的字符。
s.{s,"www"}——字符串的拼接。
$display(s.substr(2,5))——显示字符串第2位至第五位。