(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 代替單調乏味的宏。