參考資料:
(1).公眾號-芯片學堂;
(2) system verilog綠皮書;
(3) 公眾號-jerryIC驗證;
(4) 硅芯思見:【108】聊點$display的一點事情 (qq.com)
(5) Verilog系列:【53】動態數組 (qq.com)
(6) 硅芯思見:【128】動態數組的創建不一定非要new[] (qq.com)
1.定長數組(靜態數組)與動態數組
1.1定長數組(一維&多維)
(1)定長數組在聲明時,必須指定數組的長度或者上下邊界;在仿真編譯完成后,系統需要為分配的內存空間大小就是已知的、確定的;
(2)定長數組示例(聲明&初始化):
注:如果代碼試圖從一個越界的地址中讀取數據,sv將返回數組元素類型的缺省值;
(3)數組的基本操作(for & foreach);
1.2動態數組
注1:靜態數組的大小在編譯的時候就確定了;但存在一種情況,當定義數組時,指定了數組的大小,而實際使用時可能並不一定要使用定義時指定的那么大的數組,這時會造成存儲空間的浪費,於是引入了靜態數組;
(1)動態數組在聲明時,不需要指定數組長度;在仿真運行時,動態指定; 聲明時,使用[];
(2)動態數組在使用前,需要使用構造函數new[]指定其數組長度或者通過將已經分配空間大小的數組復制給未指定空間大小的數組,從而間接的實現並指定空間大小數組的構造或者直接使用具體的數值對數組進行賦值;
(3)size()用於獲取當前數組的大小,其返回的是數組的大小,但是實際數組有效索引的最大值為size()-1;
(4)訪問有效索引值之外的索引對應的元素,仿真器不會報錯,只會得到相應數據類型的默認值;
(5)為有效索引值之外的索引所對應的元素賦值是沒有意義的;賦值后,讀取該索引對應的值,依然為相應數據類型的默認值;
(6)動態數組在使用完后,可以通過delete()刪除數組占用的空間,刪除后的數組大小為0;
(7)使用new_array_name=new[number](array_name)對新的數組進行初始化分配空間時,需要注意指定的數組空間的大小number與將要復制的數組的大小 array_name.size(),以免數據丟失;
注1:如果number>array_name.size(),多出來的索引對應的值為相應數據類型的默認值;
注2:如果number<array_name.size(),只會對array_name的部分元素進行復制;
(8)動態數組聲明與使用示例:
1.3定長數組與動態數組的區別
(1)定長數組在仿真程序編譯時,長度就已經指定;而動態數組在仿真運行時,再根據上下文確定長度然后實例化;
2.關聯數組
2.1關聯數組的特點
(1)關聯數組的元素在被使用之前不會消耗內存資源;
(2)關聯數組的索引可以是任何數據類型;
(3)關聯數組類似於python中的字典與perl中的哈希;
2.2關聯數組的使用
(1)關聯數組的聲明語法: data_type array_id[index_type](data_type為數組元素的類型, array_id為數組名字, index_type是索引的類型);
(2)關聯數組的使用方法: foreach循環遍歷, first, next, exists, delete函數;
(3)注意事項:當通過一個不存在的索引去訪問關聯數組時,會返回數組類型的默認值,而不是邊界溢出然后報錯;
(4)關聯數組聲明,初始化和使用示例
3.合並數組與非合並數組
(1)合並數組與非合並數組和前面提到的數組類型不在一個維度上;任何數組類型都可以合並,包括動態數組,隊列和關聯數組(目前不支持通過$display直接顯示unpacked array, unpacked struct, unpacked union等數據;但是對於packed類型,可以通過$display直接輸出顯示);
(2)合並和非合並實際上是多維向量為了方便不同的訪問場景而衍生出來的切片分段的組織方式;合並數組是連續比特存放的,非合並的不一定;本質上而言,合並和非合並是數據集合的一種組織方式,方便存儲管理;
(3)合並和非合並在聲明時的差異:如果將數組維度寫到數組名的前面,表示這部分合並;如果將數組維度寫到數組名后面,表示這部分非合並;
(4)合並和非合並數組的選擇:當需要和標量進行相互轉換時,使用合並數組會非常方便;當需要等待數組中的變化時,則必須使用合並數組(@操作符只能用於標量或者合並數組);
(5)合並和非合並示例:
logic[31:0] mem[1024]; 數組名mem,寫在其前面的維度是[31:0],這一部分是合並的,即每32bit連續存放在一起;寫在其后面的維度是1024,與寫成[0:1023]相同,這部分是非合並的;
bit[6:0][7:0] data; //一個由7個(即[6:0]) 8bit(即[7:0])寬度的數拼出的合並數組;
bit[9:0][3:0]data;//一個由10個4bit寬度的數拼出的合並數組;