System Verilog中的各种数据结构总结,automatic/static的用法

发布时间 2023-08-30 00:59:29作者: Juremy-420-bling

想到什么说什么

首先先总结System Verilog一些约定俗成的规定:

  1. 硬件中的端口用logic来表示,而在软件中就可以使用二值变量int

在验证平台中常用的数据结构分为这以下四种

  1. 定宽数组,也就是数组的长度是确定的。

    • 遍历时,最好用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数据组成
    
    • 关于数组还有一些接口函数可以使用(如元素的定位,排序,缩减)
      这里总结了很多
  2. 动态数组,类似于C++中的Vector

    • 使用前需要用new()来实例化
    • 调用接口函数,来操作数组 size()
  3. 关联数组

    • 类似于哈希表中的key-value,在定义时就要声明key, value的类型
      int data[bit[31:0]]; //表示key是32bit的二进制数, value是int型变量
    
      data = '{1:20,2:21,3:22}; //赋值
    
  4. 队列

    • 具有先进先出的特点
    • 命名时,名称后面加个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。