在使用SystemVerilog或者UVM進(jìn)行編碼的過程中,經(jīng)常會用到數(shù)組(包括隊(duì)列等),經(jīng)常需要對這些數(shù)組進(jìn)行遍歷,有時候我們?yōu)榱吮闅v這些數(shù)組需要獲取這些數(shù)組有多少個元素之后才會使用for循環(huán)對數(shù)組進(jìn)行遍歷,為了獲取到數(shù)組中元素的個數(shù),經(jīng)常會用到“$size(數(shù)組名)”和“數(shù)組名.size”兩種方式,那么同樣是獲取數(shù)組元素個數(shù)會存在兩種方式呢?這兩種方式有什么樣的區(qū)別呢?下面我們通過示例進(jìn)行說明。
1 $size()
$size()函數(shù)是用來查詢指定數(shù)組指定維的元素數(shù),函數(shù)返回值為integer型,該函數(shù)有兩個參數(shù),第一個參數(shù)數(shù)組名,第二個參數(shù)為要查詢的數(shù)組的維數(shù)表達(dá)式,其中第二個參數(shù)為可選,默認(rèn)缺省值為1.
【示例】

【仿真結(jié)果】

示例中,“num=$size(arr)”沒有指定要查詢數(shù)組的哪一維,則此時默認(rèn)是查詢arr第一維共有2個元素,與“num1=$size(arr,1)”相同,即如果使用$size()時僅指定了數(shù)組名,則默認(rèn)查詢的是數(shù)組第一維的元素數(shù)目;
“num0=$size(arr,0)”中,因?yàn)閿?shù)組arr并沒有第0維,所以此時$size()返回為0;
“num2=$size(arr,2)”中,指定查詢數(shù)組第2維,示例中第2維索引為“[0:2]”,所以此時查詢返回值為3;
“num3=$size(arr,3)”中,指定查詢數(shù)組第3維,示例中第3維索引為“[3:0]”,所以此時查詢返回值為4;
“num4=$size(arr,4)”中,指定查詢數(shù)組第4維,示例中第4維索引為“[4:0]”,所以此時查詢返回值為5;
可見,$size()可以通過指定函數(shù)的第二個參數(shù)查詢數(shù)組指定維中包含的元素數(shù)目;雖然$size()可以返回數(shù)組對應(yīng)維數(shù)的元素個數(shù),但是前提是該維數(shù)要有對應(yīng)的存儲空間分配,否則將會出現(xiàn)一些不期望的問題。如下例。
【示例】

【仿真結(jié)果】

示例中,“num1=$size(arr,2)”獲取數(shù)組第2維元素個數(shù),但是此時第二維并沒有完全分配空間,所以此時在編譯階段就報錯了。雖然代碼第6行“arr[2]=new[4]”,但這只是給了數(shù)組arr第1維中第2個元素對應(yīng)的動態(tài)數(shù)組分配了4個存儲空間,并沒有給arr數(shù)組第2維所有的元素分配空間,所以此時如果訪問數(shù)組第1維第2個元素中包含多少個元素是可以查詢到的。如下例。
【示例】

【仿真結(jié)果】

示例中,在查詢時需要注意此時$size()函數(shù)的第一個參數(shù)要指定為數(shù)組arr第1維中第2個元素,此時編譯沒有問題主要就是因?yàn)閷τ赼rr第1維中第2個元素中對應(yīng)的動態(tài)數(shù)組進(jìn)行空間的分配。所以在使用$size()函數(shù)時,一定要注意要訪問的維度對應(yīng)的數(shù)組元素的空間是否已經(jīng)分配存在。
2數(shù)組名.size()
方法原型如下:
function int size();
該函數(shù)的調(diào)用方式是通過“數(shù)組名.size()”的方式調(diào)用,不能在size()函數(shù)中指定參數(shù)列表。
【示例】

【仿真結(jié)果】

示例中,定義了一個定寬數(shù)組arr,然后通過“數(shù)組名.size()”的方式獲取數(shù)組中元素的個數(shù),但是這是編譯報錯,這是因?yàn)?strong>在SystemVerilog中已經(jīng)不支持對于定寬數(shù)組通過“數(shù)組名.size()”的方式獲取數(shù)組中元素的個數(shù)。但是對于動態(tài)數(shù)組、關(guān)聯(lián)數(shù)組、隊(duì)列還是可以使用的。如下例。
【示例】

【仿真結(jié)果】

示例中,分別聲明了動態(tài)數(shù)組、隊(duì)列和關(guān)聯(lián)數(shù)組這些非定寬數(shù)組,對這些非定寬數(shù)組通過“數(shù)組名.size()”的方式獲取到了數(shù)組中元素的個數(shù)分別為4,5,6,可見“數(shù)組名.size()”的使用僅限于非定寬類數(shù)組。那么對于這類數(shù)組可不可以使用$size()方法呢?請看下例。
【示例】

【仿真結(jié)果】

示例中,通過$size()方法可以獲得動態(tài)數(shù)組、隊(duì)列和關(guān)聯(lián)數(shù)組這些非定寬數(shù)組所包含的元素的個數(shù),但是在使用時,一定要注意對于元素空間的開辟。
從上數(shù)這幾個示例可以看到,對于非定款數(shù)組獲取數(shù)組元素個數(shù)時可以使用size()方法和$size,但是對于定寬數(shù)組各維元素個數(shù)的獲取只能通過$size()方法,同時在使用這些方法時,需要注意數(shù)組元素空間的開辟。
審核編輯:劉清
-
Verilog
+關(guān)注
關(guān)注
30文章
1374瀏覽量
114529 -
UVM
+關(guān)注
關(guān)注
0文章
183瀏覽量
20018
原文標(biāo)題:size()和$size到底用哪個
文章出處:【微信號:處芯積律,微信公眾號:處芯積律】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
按這兩種讀法有什么區(qū)別,可以達(dá)到相同的效果嗎?求助
請問C6748下的兩種DSP開發(fā)方式有什么區(qū)別
在DCDC芯片規(guī)格書中遇到電源的整流方式,有的是異步整流有的是同步整流。這兩種整流方式有什么不同呢?
電源保護(hù)電路的兩種PCB Layout方式有區(qū)別嗎?
請問小車轉(zhuǎn)向兩種方式有什么優(yōu)缺點(diǎn)?
請問TPS74201和TPS74301這兩種LDO的主要區(qū)別是什么?
兩種芯片的區(qū)別
ROM和RAM這兩種寄存器的區(qū)別是什么呢
常見的ARM架構(gòu)分為兩種一種是M系列另外一種是A系列,這兩種有什么區(qū)別啊?
為什么嵌入式C語言中的size不等于所有成員size之和
單片機(jī)的兩種清0方式有什么區(qū)別
異步感應(yīng)和永磁同步電機(jī)這兩種有什么優(yōu)缺點(diǎn)呢?
這兩種TVS有啥不同?
size()和$size這兩種方式有什么樣的區(qū)別呢?
評論