精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

SystemVerilog動態數組的大小更改展示

芯片驗證工程師 ? 來源:芯片驗證工程師 ? 作者:驗證哥布林 ? 2022-10-21 09:43 ? 次閱讀

動態數組是一個unpacked數組,其大小可以在運行時更改。

需要使用" new "操作符實例化一個動態數組,使用[]表示。在實例化過程中,會設置動態數組的大小。動態數組聲明的語法如下:

data_type array_name [ ];

下面是簡單的動態數組示例:

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[]”的動態數組,其中數據項的類型為integer。

Dynamic Arrays– Resizing

下面的示例展示了SystemVerilog動態數組的大小更改。

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

聲明一個動態數組d_array1.

分配2個數據項大小

 d_array1 = new[2];
 $display($stime,,, "d_array1 size = %0d",d_array1.size);
 
 0 d_array1 size = 2

初始化數組,增加了一個數據項,表明動態數組的數據項是可以動態更改的:

//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個數據項的值,然后打印所有的動態數組值。

 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數據項賦值,結果是什么都不會發生,下面的賦值會被忽略:

 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會打印:

 0 d_array1 size = 3
 0 d_array1='{'h2, 'h3, 'h5}

結果是什么都不會發生,上面的賦值會被忽略。

總結來說動態數組的大小只能通過重新初始化來更改。

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

可以將一個動態數組復制到另一個動態數組。

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

我們聲明了兩個動態數組,即“oarray”和“carray”。我們初始化“oarray”,然后復制到“carray”。然后我們增加carray的大小,將它復制回“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

初始化數組oarray并初始化大小為5。然后復制
“oarray”到“carray。”

carray = '{1, 2, 3, 4, 5}

重新初始化“carray”,動態數組大小增加1。所以,現在新創建的carray的大小將是6:

carray size = 6

然后我們給第6個數據項賦值6,然后打印整個數組:

carray [5] = 6
carray = '{1,2,3,4,5,6}

現在,復制“carray”回“oarray”并打印整個數組“oarray”。

oarray = '{1,2,3,4,5,6}

最后,我們顯示原始的“oarray”和復制的“carray”的大小。它們應該是一樣的。

oarray.size( ) = 6, carray.size( ) = 6

總結來說,oarray和carray操作的實際上是同一個數組,只是通過不同的指針而已。

Dynamic Array ofArrays

動態數組也可以多維,即動態數組中每一個數據項都是一個另外的動態數組。

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”的二維動態數組。然后我們分配內存,讓它有三個元素(abc = new[3])。注意,此時只有第一維動態數組完成了初始化,第二維動態數組仍然沒有進行初始化,所以都為空數組。

abc = '{'{}, '{}, '{}}

接下來,使用for循環為每個第二維數組初始化(int類型的默認值為0)

abc[0] = '{0, 0, 0, 0}
abc[1] = '{0, 0, 0, 0}
abc[2] = '{0, 0, 0, 0}

然后就可以再次使用foreach語法遍歷賦值和打印每個數據項了。注意所使用的語法。

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} }




審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 動態數組
    +關注

    關注

    0

    文章

    3

    瀏覽量

    5948

原文標題:SystemVerilog中的動態數組

文章出處:【微信號:芯片驗證工程師,微信公眾號:芯片驗證工程師】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    labview能否對動態數組的元素每循環一次就比較一次大小

    labview能否對一個動態數組,每進行一次循環,就比較一下本次元素值和上次元素值的大小,若大于上次循環元素,則記錄,不大于,則不記錄
    發表于 11-16 17:11

    轉一篇Systemverilog的一個牛人總結

    Systemverilog數據類型l 合并數組和非合并數組1)合并數組:存儲方式是連續的,中間沒有閑置空間。例如,32bit的寄存器,可以看成是4個8bit的數據,或者也可以看成是1個
    發表于 08-27 14:50

    更新數組元素同時可更改數組大小

    大神們,求助,在我的程序中需要輸入一個2維數組作為數據輸入,但是當第一次寫入數據后,就確定了該數組的維度和大小,當我再次更改數據時,就不能改變數組
    發表于 05-10 16:24

    emOsprey動態數組的特性

    來源:公眾號【魚鷹談單片機】作者:魚鷹OspreyID :emOsprey動態數組???不知道你是否聽說過 C99 有一個動態數組的特性,也就是說,
    發表于 01-11 06:28

    變長數組動態數組區別

    動態數組是指在聲明時,沒有確定數組大小數組,它可以隨程序需要而重新指定大小
    的頭像 發表于 09-28 15:20 ?1877次閱讀

    SystemVerilog數組的賦值、索引和切片

    數組可以作為參數傳遞給子程序,當數組作為值傳遞給子程序時,會將這個數組復制一份傳遞給子程序。
    的頭像 發表于 10-20 10:13 ?5200次閱讀

    SystemVerilog中的操作方法

    SystemVerilog提供了幾個內置方法來支持數組搜索、排序等功能。
    的頭像 發表于 10-31 10:10 ?2689次閱讀

    SystemVerilog中可以嵌套的數據結構

    SystemVerilog中除了數組、隊列和關聯數組等數據結構,這些數據結構還可以嵌套。
    的頭像 發表于 11-03 09:59 ?1562次閱讀

    網絡和變量的未壓縮數組

    SystemVerilog有兩種類型的數組:壓縮數組和非壓縮數組。壓縮數組是連續存儲的位的集合,通常稱為向量。非壓縮
    的頭像 發表于 02-09 14:50 ?682次閱讀
    網絡和變量的未壓縮<b class='flag-5'>數組</b>

    C語言中的數組空間動態開辟

    C語言中的數組空間動態開辟 在C語言中,必不可少的需要使用到數組,通常為了動態的開辟數組空間,可以使用 malloc 函數,在C++中可以使
    的頭像 發表于 02-10 12:42 ?2076次閱讀

    使用SystemVerilog解決數組問題

    數獨是一種非常流行的游戲,數獨本質上也是一個約束問題,所以我們可以讓SystemVerilog的約束求解器來幫助我們解決。 約束求解器的精妙之處就是,我們只描述約束限制,繁重的數值生成工作由工具來幫我們完成。 你只需“既要...又要...”,其他的讓下人干吧。
    的頭像 發表于 03-08 14:06 ?1519次閱讀

    一些有趣的數組相關的SystemVerilog約束

    我們在工作中常常會針對數組施加各式的約束,下面列舉一下有趣的Systemverilog數組約束示例。
    的頭像 發表于 03-08 13:12 ?920次閱讀

    一些有趣的數組相關的SystemVerilog約束

    我們在工作中常常會針對數組施加各式的約束,下面列舉一下有趣的**Systemverilog數組約束**示例
    的頭像 發表于 05-30 11:13 ?751次閱讀

    帶你了解SystemVerilog中的關聯數組

    SystemVerilog中,我們知道可以使用動態數組實現數組元素個數的動態分配,即隨用隨分
    的頭像 發表于 06-09 09:46 ?7299次閱讀
    帶你了解<b class='flag-5'>SystemVerilog</b>中的關聯<b class='flag-5'>數組</b>

    動態數組和C++ std::vector詳解

    std::vector是C++的默認動態數組,其與array最大的區別在于vector的數組動態的,即其大小可以在運行時
    的頭像 發表于 07-19 11:07 ?946次閱讀