SV精通1-②动态数组、队列、关联数组、结构体、枚举、字符串

一、动态数组

  • 最大特点:在仿真运行时灵活调节数组的大小,即存储量。

  • 动态数组声明时,需要使用‘[]’来声明,此时数组是空的,即容量为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位至第五位。



版权声明:本文为changshengqiu原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。