SystemVerilog Arrays

SystemVerilog在通过不同类型的阵列构建复杂的数据结构方面提供了极大的灵活性。

Static Arrays

静态数组是在编译之前就知道大小的数组。在下面显示的示例中,声明了一个8位宽的静态数组,并为其分配了一些值,然后进行迭代以打印其值。

module tb;
  bit [7:0]   m_data;   // A vector or 1D packed array(向量或一维压缩数组)
 
  initial begin
    // 1. 给数组赋值
    m_data = 8'hA2; 
 
    // 2. 遍历数组的每一位并打印值
    for (int i = 0; i < $size(m_data); i++) begin
      $display ("m_data[%0d] = %b", i, m_data[i]);
    end
  end
endmodule

静态数组可进一步分为打包数组(packed)和未打包数组(unpacked)。

bit [2:0][7:0]   m_data;       // Packed(合并数组)
bit [15:0]     m_mem [10:0];     // Unpacked(非合并数组)

Dynamic Arrays动态数组

动态数组的大小在编译期间未知,而是在运行时根据需要定义和扩展的。动态数组可以通过其空方括号[]轻松识别。

 int     m_mem [];   // 动态数组,大小未知,但包含整数值

关联数组Associative Arrays

关联数组是一种使用特定键存储内容的数组。可以通过方括号[]中存在数据类型来轻松识别这一点。键显示在方括号内

  int     m_data [int];       //键是int类型的,数据也是int类型的
  int     m_name [string];     // 键是字符串类型,数据是int类型
 
  m_name ["Rachel"] = 30;
  m_name ["Orange"] = 2;
 
  m_data [32'h123] = 3333;

Queue列

队列是一种数据类型,其中数据可以被推入队列或从阵列中弹出。方括号[]中的$符号很容易识别它。

int   m_queue [$];     // Unbound queue, no size
 
 
  m_queue.push_back(23);     // Push into the queue
 
  int data = m_queue.pop_front(); // Pop from the queue

参考文献:
【1】https://www.chipverify.com/systemverilog/systemverilog-arrays#queues

发布了91 篇原创文章 · 获赞 7 · 访问量 5266

猜你喜欢

转载自blog.csdn.net/qq_43042339/article/details/104454798