System Verilog中的各种数据结构总结,automatic/static的用法
想到什么说什么
首先先总结System Verilog一些约定俗成的规定:
- 硬件中的端口用logic来表示,而在软件中就可以使用二值变量int
在验证平台中常用的数据结构分为这以下四种
-
定宽数组,也就是数组的长度是确定的。
- 遍历时,最好用foreach,这样阅读性很高,但也可以用for
- 相同维度的数组,可以直接用“=”进行赋值,也可以直接比较大小
- 数组的初始化和赋值,记得有个顿号
int a[2] = '{0, 1}; // ‘{}
- 合并数组,相当于python中的slice切片
bit [2:0][7:0] a; //定义3个8bit的数组a bit [2:0][7:0] b [2:0]; //定义长度为3的数组b,每个元素由3个8bit数据组成
- 关于数组还有一些接口函数可以使用(如元素的定位,排序,缩减)
这里总结了很多
-
动态数组,类似于C++中的Vector
- 使用前需要用new()来实例化
- 调用接口函数,来操作数组 size()
-
关联数组
- 类似于哈希表中的key-value,在定义时就要声明key, value的类型
int data[bit[31:0]]; //表示key是32bit的二进制数, value是int型变量 data = '{1:20,2:21,3:22}; //赋值
-
队列
- 具有先进先出的特点
- 命名时,名称后面加个q后缀,还有美元符号
int data_q[$]; data_q.push_back(1); data_q.pop_front();
- 还有其他接口函数
函数 作用 insert(i,j) 在第i个位置插入j元素 delete(i) 删除第i个位置的元素 pop_back() pop出队尾的元素 push_front(j) 向队头push元素j
关于static/automatic,静态/动态
* static和automatic可以用于描述function/task,和变量。
* 但考虑得最多的是变量,static变量不需要实例化,而且只有一个实体,automatic变量需要实例化,存放在堆栈中,随生命周期结束而结束
* 默认情况下,class中的变量是automatic,在module中是static。