動態(tài)數(shù)組是一個unpacked數(shù)組,其大小可以在運(yùn)行時(shí)更改。
需要使用" new "操作符實(shí)例化一個動態(tài)數(shù)組,使用[]表示。在實(shí)例化過程中,會設(shè)置動態(tài)數(shù)組的大小。動態(tài)數(shù)組聲明的語法如下:
data_type array_name [ ];
下面是簡單的動態(tài)數(shù)組示例:
module darray; integer da [ ]; //dynamic array ‘da’ of type integer initial begin da = new[4]; //construct and allocate a size of 4 elements $display($stime,,, "da size = %0d",da.size); da.delete( ); //delete elements of an array $display($stime,,, "da size = %0d",da.size); da = '{1,2,3,4}; //array initialization $display($stime,,, "da = ",da); end endmodule
仿真log:
0 da size = 4 0 da size = 0 0 da = '{1, 2, 3, 4} V C S S i m u l a t i o n R e p o r t
上面的module聲明了一個名為“da[]”的動態(tài)數(shù)組,其中數(shù)據(jù)項(xiàng)的類型為integer。
Dynamic Arrays– Resizing
下面的示例展示了SystemVerilog動態(tài)數(shù)組的大小更改。
module darray; bit [7:0] d_array1[ ]; initial begin //memory allocation d_array1 = new[2]; $display($stime,,, "d_array1 size = %0d",d_array1.size); $display(" "); //array assignment - changes the size of the array d_array1 = {2,3,4}; //add 1 more element to the array $display($stime,,, "d_array1 size = %0d",d_array1.size); $display($stime,,, "d_array1=",d_array1); $display(" "); d_array1[2]=5; $display($stime,,, "d_array1[0]=",d_array1[0]); $display($stime,,, "d_array1[1]=",d_array1[1]); $display($stime,,, "d_array1[2]=",d_array1[2]); $display($stime,,, "d_array1=",d_array1); $display(" "); d_array1[3]=6; //will not change the size of the array or //add a new element - Warning $display($stime,,, "d_array1 size = %0d",d_array1.size); $display($stime,,, "d_array1=",d_array1); $display(" "); d_array1 = {2,3,4,6}; $display($stime,,, "d_array1 size = %0d",d_array1.size); $display($stime,,, "d_array1=",d_array1); $display(" "); //increase the size of d_array1 d_array1 = new [d_array1.size( ) + 1] (d_array1) ; $display($stime,,, "d_array1 size = %0d",d_array1.size); $display($stime,,,"d_array1=",d_array1); end endmodule
仿真log:
0 d_array1 size = 2 0 d_array1 size = 3 0 d_array1='{'h2, 'h3, 'h4} 0 d_array1[0]= 2 0 d_array1[1]= 3 0 d_array1[2]= 5 0 d_array1='{'h2, 'h3, 'h5} 0 d_array1 size = 3 0 d_array1='{'h2, 'h3, 'h5} 0 d_array1 size = 4 0 d_array1='{'h2, 'h3, 'h4, 'h6} 0 d_array1 size = 5 0 d_array1='{'h2, 'h3, 'h4, 'h6, 'h0} V C S S i m u l a t i o n R e p o r t
聲明一個動態(tài)數(shù)組d_array1.
分配2個數(shù)據(jù)項(xiàng)大小
d_array1 = new[2]; $display($stime,,, "d_array1 size = %0d",d_array1.size); 0 d_array1 size = 2
初始化數(shù)組,增加了一個數(shù)據(jù)項(xiàng),表明動態(tài)數(shù)組的數(shù)據(jù)項(xiàng)是可以動態(tài)更改的:
//array assignment - changes the size of the array d_array1 = {2,3,4}; //add 1 more element to the array $display($stime,,, "d_array1 size = %0d",d_array1.size); $display($stime,,, "d_array1=",d_array1);
仿真log打印:
0 d_array1 size = 3 0 d_array1='{'h2, 'h3, 'h4}
改變第2個數(shù)據(jù)項(xiàng)的值,然后打印所有的動態(tài)數(shù)組值。
d_array1[2]=5; //Change the value of 2nd element $display($stime,,, "d_array1[0]=",d_array1[0]); $display($stime,,, "d_array1[1]=",d_array1[1]); $display($stime,,, "d_array1[2]=",d_array1[2]); $display($stime,,, "d_array1=",d_array1);
仿真log打印:
0 d_array1[0]= 2 0 d_array1[1]= 3 0 d_array1[2]= 5 0 d_array1='{'h2, 'h3, 'h5}
給不存在的index 3數(shù)據(jù)項(xiàng)賦值,結(jié)果是什么都不會發(fā)生,下面的賦值會被忽略:
d_array1[3]=6; //will not change the size of the array –//Warning $display($stime,,, "d_array1 size = %0d",d_array1.size); $display($stime,,, "d_array1=",d_array1);
仿真log會打?。?/p>
0 d_array1 size = 3 0 d_array1='{'h2, 'h3, 'h5}
結(jié)果是什么都不會發(fā)生,上面的賦值會被忽略。
總結(jié)來說動態(tài)數(shù)組的大小只能通過重新初始化來更改。
d_array1 = {2,3,4,6}; $display($stime,,, "d_array1 size = %0d",d_array1.size); $display($stime,,, "d_array1=",d_array1); ------------------------- 0 d_array1 size = 4 0 d_array1='{'h2, 'h3, 'h4, 'h6}
以及
d_array1 = new [d_array1.size( ) + 1] (d_array1); //increase the size of d_array1 $display($stime,,, "d_array1 size = %0d",d_array1.size); $display($stime,,, "d_array1=",d_array1); --------------------------- 0 d_array1 size = 5 0 d_array1='{'h2, 'h3, 'h4, 'h6, 'h0}
Copying ofDynamic Arrays
可以將一個動態(tài)數(shù)組復(fù)制到另一個動態(tài)數(shù)組。
module darray; //copying of arrays int oarray [ ]; int carray [ ]; initial begin // Allocate 5 memory locations to "oarray" and // initialize with values oarray = new [5]; oarray = '{1, 2, 3, 4, 5}; carray = oarray; // copy "oarray" to "carray" $display ("carray = %p", carray); // Grow size by 1 and copy existing elements to the "carray" carray = new [carray.size( ) + 1] (carray); $display("carray size = %0d",carray.size); // Assign value 6 to the newly added location [index 5] carray [carray.size( ) - 1] = 6; $display("carray[5]=%0d",carray[5]); // Display contents of new "carray" $display ("carray = %p", carray); oarray = carray; //copy carray to oarray $display ("oarray = %p", oarray); // Display size of both arrays $display ("oarray.size( ) = %0d, carray.size( ) = %0d", oarray.size( ), carray.size( )); end endmodule
我們聲明了兩個動態(tài)數(shù)組,即“oarray”和“carray”。我們初始化“oarray”,然后復(fù)制到“carray”。然后我們增加carray的大小,將它復(fù)制回“oarray”中。
仿真log:
carray = '{1, 2, 3, 4, 5} carray size = 6 carray[5]=6 carray = '{1, 2, 3, 4, 5, 6} oarray = '{1, 2, 3, 4, 5, 6} oarray.size( ) = 6, carray.size( ) = 6 V C S S i m u l a t i o n R e p o r t
初始化數(shù)組oarray并初始化大小為5。然后復(fù)制
“oarray”到“carray?!?/p>
carray = '{1, 2, 3, 4, 5}
重新初始化“carray”,動態(tài)數(shù)組大小增加1。所以,現(xiàn)在新創(chuàng)建的carray的大小將是6:
carray size = 6
然后我們給第6個數(shù)據(jù)項(xiàng)賦值6,然后打印整個數(shù)組:
carray [5] = 6 carray = '{1,2,3,4,5,6}
現(xiàn)在,復(fù)制“carray”回“oarray”并打印整個數(shù)組“oarray”。
oarray = '{1,2,3,4,5,6}
最后,我們顯示原始的“oarray”和復(fù)制的“carray”的大小。它們應(yīng)該是一樣的。
oarray.size( ) = 6, carray.size( ) = 6
總結(jié)來說,oarray和carray操作的實(shí)際上是同一個數(shù)組,只是通過不同的指針而已。
Dynamic Array ofArrays
動態(tài)數(shù)組也可以多維,即動態(tài)數(shù)組中每一個數(shù)據(jù)項(xiàng)都是一個另外的動態(tài)數(shù)組。
module darray; int abc[ ][ ]; //array of arrays initial begin abc = new[3]; //sub array still not created $display("abc = ",abc); //Create sub-arrays foreach (abc[i]) begin abc[i] = new[4]; $display("abc[%0d] = %p", i, abc[i]); end $display("abc = ",abc); //assign values to array and sub-array foreach(abc[i , j]) begin abc[i][j] = (j+1)+i; end //display foreach (abc[i , j]) begin $display("abc[%0d][%0d] = %0d", i, j, abc[i][j]); end $display("abc = ",abc); end endmodule
仿真log:
abc = '{'{}, '{}, '{}} abc[0] = '{0, 0, 0, 0} abc[1] = '{0, 0, 0, 0} abc[2] = '{0, 0, 0, 0} abc = '{'{0, 0, 0, 0} , '{0, 0, 0, 0} , '{0, 0, 0, 0} } abc[0][0] = 1 abc[0][1] = 2 abc[0][2] = 3 abc[0][3] = 4 abc[1][0] = 2 abc[1][1] = 3 abc[1][2] = 4 abc[1][3] = 5 abc[2][0] = 3 abc[2][1] = 4 abc[2][2] = 5 abc[2][3] = 6 abc = '{'{1, 2, 3, 4} , '{2, 3, 4, 5} , '{3, 4, 5, 6} } V C S S i m u l a t i o n R e p o r t
我們聲明一個名為“abc”的二維動態(tài)數(shù)組。然后我們分配內(nèi)存,讓它有三個元素(abc = new[3])。注意,此時(shí)只有第一維動態(tài)數(shù)組完成了初始化,第二維動態(tài)數(shù)組仍然沒有進(jìn)行初始化,所以都為空數(shù)組。
abc = '{'{}, '{}, '{}}
接下來,使用for循環(huán)為每個第二維數(shù)組初始化(int類型的默認(rèn)值為0)
abc[0] = '{0, 0, 0, 0} abc[1] = '{0, 0, 0, 0} abc[2] = '{0, 0, 0, 0}
然后就可以再次使用foreach語法遍歷賦值和打印每個數(shù)據(jù)項(xiàng)了。注意所使用的語法。
foreach(abc[i , j])
abc[0][0] = 1 abc[0][1] = 2 abc[0][2] = 3 abc[0][3] = 4 abc[1][0] = 2 abc[1][1] = 3 abc[1][2] = 4 abc[1][3] = 5 abc[2][0] = 3 abc[2][1] = 4 abc[2][2] = 5 abc[2][3] = 6 abc = '{'{1, 2, 3, 4} , '{2, 3, 4, 5} , '{3, 4, 5, 6} }
審核編輯:劉清
-
動態(tài)數(shù)組
+關(guān)注
關(guān)注
0文章
3瀏覽量
6008
原文標(biāo)題:SystemVerilog中的動態(tài)數(shù)組
文章出處:【微信號:芯片驗(yàn)證工程師,微信公眾號:芯片驗(yàn)證工程師】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
labview能否對動態(tài)數(shù)組的元素每循環(huán)一次就比較一次大小
轉(zhuǎn)一篇Systemverilog的一個牛人總結(jié)
更新數(shù)組元素同時(shí)可更改數(shù)組大小
emOsprey動態(tài)數(shù)組的特性
變長數(shù)組和動態(tài)數(shù)組區(qū)別
SystemVerilog中數(shù)組的賦值、索引和切片
SystemVerilog中可以嵌套的數(shù)據(jù)結(jié)構(gòu)
網(wǎng)絡(luò)和變量的未壓縮數(shù)組

C語言中的數(shù)組空間動態(tài)開辟
使用SystemVerilog解決數(shù)組問題
一些有趣的數(shù)組相關(guān)的SystemVerilog約束
一些有趣的數(shù)組相關(guān)的SystemVerilog約束
帶你了解SystemVerilog中的關(guān)聯(lián)數(shù)組

評論