System Verilog (4) 數組 Arrays


(3)Arrays

SV的數組類型: 合並數組,非合並數組,動態數組,聯合數組,隊列

根據數組大小是否固定,可分為固定數組(靜態數組)和動態數組

1. 合並數組 packed arrays

存儲方式是連續的,中間沒有閑置空間

例如,32bit的寄存器,可以看成是4個8bit的數據,或者也可以看成是1個32bit的數據。

表示方法: 數組大小和位,必須在變量名前指定,數組大小必須是【msb:lsb】(從大到小)

  • bit [7:0] array1;
  • bit [3:0] [7:0] array2;

查看代碼

module array_declaration;
bit [7:0] array1;
bit [3:0][7:0] array2;	
initial begin
$display("default size array1=%0d array2=%0d", $size(array1),$size(array2));
array1=8'ha2;

for(int i=0; i<$size(array1); i++) begin
$display("array1[%0d]=%b", i , array1[i]);
end
end
initial begin
for(int j=0; j<$size(array2); j++) begin
$display("array2[%0d]=%b", j , array2[j]);
end
end
endmodule

 

編譯結果

# Loading sv_std.std
# Loading work.array(fast)
# 
# vsim -voptargs=+acc=npr
# run -all
# array1 size is 8 array2 size is 4
# array1[7]=0
# array1[6]=1
# array1[5]=0
# array1[4]=0
# array1[3]=1
# array1[2]=0
# array1[1]=1
# array1[0]=0
# array2[3]=11111010
# array2[2]=11001110
# array2[1]=10111100
# array2[0]=11011010
# exit
# End time: 04:03:49 on Mar 30,2022, Elapsed time: 0:00:00
# Errors: 0, Warnings: 0
Done

2. 非合並數組 unpacked arrays

一般仿真器存放數組元素時使用32bit的字邊界,byte、shortint、int都放在一個字中。

非合並數組:字的低位存放變量,高位不用。

表示方法:數組大小和位,必須在變量名后指定,數組大小【msb:lsb】【lsb: msb】都可以

  • bit  unpacked_array [7:0] ; 
  • bit unpacked [0:7] [0:3] ;

二維數組和合並數組識別:

合並數組:  bit [3:0] [7:0] arrys;   大小在變量名前面放得,且降序

二維數組:  int arrays[0:7] [0:3] ;  大小在變量名后面放得,可降序可升序

位寬在變量名前面,用於識別合並和非合並數組,位寬在后面,用於識別數組中元素個數。

 

3)非合並數組

 

      4)合並數組和非合並數組的選擇

       (1)當需要以字節或字為單位對存儲單元操作。

       (2)當需要等待數組中變化的,則必須使用合並數組。例如測試平台需要通過存儲器數據的變化來喚醒,需要用到@,@只能用於標量或者合並數組。

     Bit[3:0] [7:0] barray[3]  ; 表示合並數組,合並數組中有3個元素,每個元素時8bit,4個元素可以組成合並數組

    可以使用barry[0]作敏感信號。

 

l      動態數組

隨機事物不確定大小。

使用方法:數組在開始是空的,同時使用new[]來分配空間,在new[n]指定元素的個數。

Int dyn[];

  Dyn = new[5];    //分配5個元素空間

         Dyn.delete() ;    //釋放空間

l      隊列

在隊列中增加或刪除元素比較方便。

l      關聯數組

當你需要建立一個超大容量的數組。關聯數組,存放稀疏矩陣中的值。

表示方法:

采用在方括號中放置數據類型的形式聲明:

Bit[63:0] assoc[bit[63:0]];

 

l      常量:

1)Verilog 推薦使用文本宏。

好處:全局作用范圍,且可以用於位段或類型定義

缺點:當需要局部常量時,可能引起沖突。

2)Parameter

  作用范圍僅限於單個module

3)Systemverilog:

  參數可以在多個模塊里共同使用,可以用typedef 代替單調乏味的宏。


免責聲明!

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



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