在使用SystemVerilog或者UVM進行編碼的過程中,經常會用到數組(包括隊列等),經常需要對這些數組進行遍歷,有時候我們為了遍歷這些數組需要獲取這些數組有多少個元素之后才會使用for循環對數組進行遍歷,為了獲取到數組中元素的個數,經常會用到“$size(數組名)”和“數組名.size”兩種方式,那么同樣是獲取數組元素個數會存在兩種方式呢?這兩種方式有什么樣的區別呢?下面我們通過示例進行說明。
1 $size()
$size()函數是用來查詢指定數組指定維的元素數,函數返回值為integer型,該函數有兩個參數,第一個參數數組名,第二個參數為要查詢的數組的維數表達式,其中第二個參數為可選,默認缺省值為1.
【示例】
【仿真結果】
示例中,“num=$size(arr)”沒有指定要查詢數組的哪一維,則此時默認是查詢arr第一維共有2個元素,與“num1=$size(arr,1)”相同,即如果使用$size()時僅指定了數組名,則默認查詢的是數組第一維的元素數目;
“num0=$size(arr,0)”中,因為數組arr并沒有第0維,所以此時$size()返回為0;
“num2=$size(arr,2)”中,指定查詢數組第2維,示例中第2維索引為“[0:2]”,所以此時查詢返回值為3;
“num3=$size(arr,3)”中,指定查詢數組第3維,示例中第3維索引為“[3:0]”,所以此時查詢返回值為4;
“num4=$size(arr,4)”中,指定查詢數組第4維,示例中第4維索引為“[4:0]”,所以此時查詢返回值為5;
可見,$size()可以通過指定函數的第二個參數查詢數組指定維中包含的元素數目;雖然$size()可以返回數組對應維數的元素個數,但是前提是該維數要有對應的存儲空間分配,否則將會出現一些不期望的問題。如下例。
【示例】
【仿真結果】
示例中,“num1=$size(arr,2)”獲取數組第2維元素個數,但是此時第二維并沒有完全分配空間,所以此時在編譯階段就報錯了。雖然代碼第6行“arr[2]=new[4]”,但這只是給了數組arr第1維中第2個元素對應的動態數組分配了4個存儲空間,并沒有給arr數組第2維所有的元素分配空間,所以此時如果訪問數組第1維第2個元素中包含多少個元素是可以查詢到的。如下例。
【示例】
【仿真結果】
示例中,在查詢時需要注意此時$size()函數的第一個參數要指定為數組arr第1維中第2個元素,此時編譯沒有問題主要就是因為對于arr第1維中第2個元素中對應的動態數組進行空間的分配。所以在使用$size()函數時,一定要注意要訪問的維度對應的數組元素的空間是否已經分配存在。
2數組名.size()
方法原型如下:
function int size();
該函數的調用方式是通過“數組名.size()”的方式調用,不能在size()函數中指定參數列表。
【示例】
【仿真結果】
示例中,定義了一個定寬數組arr,然后通過“數組名.size()”的方式獲取數組中元素的個數,但是這是編譯報錯,這是因為在SystemVerilog中已經不支持對于定寬數組通過“數組名.size()”的方式獲取數組中元素的個數。但是對于動態數組、關聯數組、隊列還是可以使用的。如下例。
【示例】
【仿真結果】
示例中,分別聲明了動態數組、隊列和關聯數組這些非定寬數組,對這些非定寬數組通過“數組名.size()”的方式獲取到了數組中元素的個數分別為4,5,6,可見“數組名.size()”的使用僅限于非定寬類數組。那么對于這類數組可不可以使用$size()方法呢?請看下例。
【示例】
【仿真結果】
示例中,通過$size()方法可以獲得動態數組、隊列和關聯數組這些非定寬數組所包含的元素的個數,但是在使用時,一定要注意對于元素空間的開辟。
從上數這幾個示例可以看到,對于非定款數組獲取數組元素個數時可以使用size()方法和$size,但是對于定寬數組各維元素個數的獲取只能通過$size()方法,同時在使用這些方法時,需要注意數組元素空間的開辟。
審核編輯:劉清
-
Verilog
+關注
關注
28文章
1343瀏覽量
109986 -
UVM
+關注
關注
0文章
181瀏覽量
19139
原文標題:size()和$size到底用哪個
文章出處:【微信號:處芯積律,微信公眾號:處芯積律】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論