SV -- Array 數組


SV -- Array

整理下system verilog中數組的用法,備忘。

1.定寬數組

int array1 [6];            //fixed size single dimension array
int array2 [5:0];          //fixed size single dimension array
int array3 [3:0][2:0];     //fixed size multi dimension array
bit array4[2:0];           //unpacked array declaration
bit [2:0][7:0] array5;     //packed array declaration
bit [2:0][7:0] array6 [3]; //mixed packed and unpacked array
  • 只在array名字之前定義位寬的是packed array,packed array的元素是單獨的位
  • array名字之后定義數組大小的是unpacked array;
  • 名字前后都有定義的是混合array
  • array3是多維數組

array賦初值

array1 = '{0,1,2,3,4,5};
array2 = '{0,1,2,3,4,5};
array3 = '{ '{0,1,2,3},'{4,5,6,7},'{8,9,10,11}};

1.1 Packed array

  • 封裝的數組(packed array)可以是單位數據類型(reg、logic、bit)、枚舉類型以及遞歸封裝的數組和封裝結構
  • 一維的packed array也被稱為Vector
  • 一個packed array被表示為一個連續的位集合。
    例如:
    bit [2:0] [7:0] array5;
    在存儲時是連續的:

1.2 Unpacked array

  • 可以是任意數據類型
  • 定義數組大小在名字之后
  • 在存儲上bit組是不連續的

例如:
bit [7:0] array4[2:0];
在存儲時:

2. 動態數組(new)

定義:data_type array_name [ ];
function:

  • new[ ] –> allocates the storage.
  • size( ) –> returns the current size of a dynamic array.
  • delete( ) –> empties the array, resulting in a zero-sized array.

例子:

//declaration
bit [7:0] d_array1[ ];
int d_array2[ ];
 
//memory allocation
d_array1 = new[4]; //dynamic array of 4 elements
d_array2 = new[6]; //dynamic array of 6 elements
 
//array initialization
d_array1 = {0,1,2,3};
foreach(d_array2[j]) d_array2[j] = j;

2.1 重新定義動態數組大小

主要有兩種方法:

  1. d_array1 = new[10];
  2. d_array1 = new[10](d_array2);

對於第一種,會將數組清空,然后重新分配為大小為10的數組。
對於第二種,會保留原來的4個數據,然后分配新的6個元素的空間。

刪除動態數組:d_array1.delete;,沒有括號。

Example:

module dynamic_array;
   
  //dynamic array declaration
  bit [7:0] d_array1[];
  int       d_array2[];
 
  initial begin
    //memory allocation
    d_array1 = new[2];
    d_array2 = new[3];
         
    //array initialization
    d_array1 = {2,3};
    foreach(d_array2[j])  d_array2[j] = j;
 
    $display("----- d_array1 Values are -----");
    foreach(d_array1[i])   $display("\td_aaray1[%0d] = %0d",i, d_array1[i]);
 
    $display("----- d_array2 Values are -----");
    foreach(d_array2[i])   $display("\td_aaray2[%0d] = %0d",i, d_array2[i]);
     
    //Increasing the size by overriding the old values
    d_array1 = new[4]; //Create dynamic array of 4 elements
    $display("Size of Array d_array1 %0d",d_array1.size());
    $display("----- d_array1 Values are -----");
    foreach(d_array1[i])   $display("\td_aaray1[%0d] = %0d",i, d_array1[i]);
 
    //Increasing the size by retaining the old values
    d_array2 = new[5](d_array2); //Create dynamic array of 5 elements, retaining old values
    $display("Size of Array d_array2 %0d",d_array2.size());
    $display("----- d_array2 Values are -----");
    foreach(d_array2[i])   $display("\td_aaray2[%0d] = %0d",i, d_array2[i]);
$display("---------------------------------");
    //delete array
    d_array1.delete;
    d_array2.delete;
     
    $display("After Array Delete");
    $display("\tSize of d_array1 %0d",d_array1.size());
    $display("\tSize of d_array2 %0d",d_array2.size());
  end
endmodule

仿真結果:

----- d_array1 Values are -----
d_aaray1[0] = 2
d_aaray1[1] = 3
----- d_array2 Values are -----
d_aaray2[0] = 0
d_aaray2[1] = 1
d_aaray2[2] = 2
Size of Array d_array1 4
----- d_array1 Values are -----
d_aaray1[0] = 0
d_aaray1[1] = 0
d_aaray1[2] = 0
d_aaray1[3] = 0
Size of Array d_array2 5
----- d_array2 Values are -----
d_aaray2[0] = 0
d_aaray2[1] = 1
d_aaray2[2] = 2
d_aaray2[3] = 0
d_aaray2[4] = 0
---------------------------------
After Array Delete
Size of d_array1 0
Size of d_array2 0

3. 關聯數組(字典)

語法:data_type array_name [ index_type ];

  • 將內容存儲在稀疏矩陣中
  • 關聯數組只在被使用時才分配存儲空間
  • 在關聯數組中,索引表達式不限於整數表達式,但可以是任何類型
  • 關聯數組為數組元素分配一個查找表,其中索引作為鍵
  • 類似於字典

例如:

int a_array1[*] ;            // associative array of integer (unspecified index)
bit [31:0] a_array2[string]; // associative array of 32-bit, indexed by string
ev_array [myClass];          //associative array of event,indexed by class

Methods:

Method Description
.num() 返回元素個數
.delete(index) 刪除index索引的鍵和值,如果不加index則刪除所有鍵和值
.exists(index) 檢查index鍵是否在數組中
.first(var) 將第一個鍵賦給var
.last(var) 將最后一個鍵賦給var
.next(var) 將下一個鍵賦給var,如果后面沒有鍵,則返回最后一個鍵
.prev(var) 將上一個鍵賦給var,如果前面沒有鍵,則返回第一個鍵
module associative_array;
  //array declaration
  int a_array[*];  
  int index;
  
  initial begin
    //allocating array and assigning value to it 
    repeat(3) begin
      a_array[index] = index*2;
      index=index+4;
    end
    
    //prev()-Associative array method
    a_array.prev(index);
    $display("entry is a_array[%0d] = %0d",index,a_array[index]);
    
    //next()-Associative array method
    a_array.next(index);
    $display("entry is a_array[%0d] = %0d",index,a_array[index]);
    a_array.next(index);
    $display("entry is a_array[%0d] = %0d",index,a_array[index]);
     a_array.prev(index);
    $display("entry is a_array[%0d] = %0d",index,a_array[index]);
  end
endmodule

結果:

entry is a_array[0] = 0
entry is a_array[4] = 8
entry is a_array[8] = 16
entry is a_array[4] = 8

4. 隊列(Queue,$)

使用與unpacked數組相同的語法聲明,但是在定義時使用$符號作為數組大小。在隊列中,0表示第一個條目,$表示最后一個條目。
寫法:data_type queue_name[$];
分為兩種:第一種是bounded queue,定義了上界的queue;而第二種是unbounded,沒有定義上界的。例如:

bit    queue_1[$];     // queue of bits  (unbound queue)
int    queue_2[$];     // queue of int 
byte   queue_3[$:255]; // queue of byte (bounded queue with 256 entries)
string queue_4[$];     // queue of strings

初始化方法:queue = {7,3,1,0,8};
Methods:

其中insert(index,var),將var插入到index這個位置,后面的往后挪。
push和pop的幾個函數的功能如下:


此外,對於定容的隊列,push_back將不起作用,而push_front則會將第一個值替換。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM