一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

SystemVerilog動(dòng)態(tài)數(shù)組的大小更改展示

芯片驗(yàn)證工程師 ? 來源:芯片驗(yàn)證工程師 ? 作者:驗(yàn)證哥布林 ? 2022-10-21 09:43 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

動(dòng)態(tài)數(shù)組是一個(gè)unpacked數(shù)組,其大小可以在運(yùn)行時(shí)更改。

需要使用" new "操作符實(shí)例化一個(gè)動(dòng)態(tài)數(shù)組,使用[]表示。在實(shí)例化過程中,會(huì)設(shè)置動(dòng)態(tài)數(shù)組的大小。動(dòng)態(tài)數(shù)組聲明的語法如下:

data_type array_name [ ];

下面是簡單的動(dòng)態(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聲明了一個(gè)名為“da[]”的動(dòng)態(tài)數(shù)組,其中數(shù)據(jù)項(xiàng)的類型為integer。

Dynamic Arrays– Resizing

下面的示例展示了SystemVerilog動(dòng)態(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

聲明一個(gè)動(dòng)態(tài)數(shù)組d_array1.

分配2個(gè)數(shù)據(jù)項(xiàng)大小

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

初始化數(shù)組,增加了一個(gè)數(shù)據(jù)項(xiàng),表明動(dòng)態(tài)數(shù)組的數(shù)據(jù)項(xiàng)是可以動(dò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個(gè)數(shù)據(jù)項(xiàng)的值,然后打印所有的動(dò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é)果是什么都不會(huì)發(fā)生,下面的賦值會(huì)被忽略:

 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會(huì)打?。?/p>

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

結(jié)果是什么都不會(huì)發(fā)生,上面的賦值會(huì)被忽略。

總結(jié)來說動(dòng)態(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

可以將一個(gè)動(dòng)態(tài)數(shù)組復(fù)制到另一個(gè)動(dòng)態(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

我們聲明了兩個(gè)動(dòng)態(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。”

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

重新初始化“carray”,動(dòng)態(tài)數(shù)組大小增加1。所以,現(xiàn)在新創(chuàng)建的carray的大小將是6:

carray size = 6

然后我們給第6個(gè)數(shù)據(jù)項(xiàng)賦值6,然后打印整個(gè)數(shù)組:

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

現(xiàn)在,復(fù)制“carray”回“oarray”并打印整個(gè)數(shù)組“oarray”。

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

最后,我們顯示原始的“oarray”和復(fù)制的“carray”的大小。它們應(yīng)該是一樣的。

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

總結(jié)來說,oarray和carray操作的實(shí)際上是同一個(gè)數(shù)組,只是通過不同的指針而已。

Dynamic Array ofArrays

動(dòng)態(tài)數(shù)組也可以多維,即動(dòng)態(tài)數(shù)組中每一個(gè)數(shù)據(jù)項(xiàng)都是一個(gè)另外的動(dò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

我們聲明一個(gè)名為“abc”的二維動(dòng)態(tài)數(shù)組。然后我們分配內(nèi)存,讓它有三個(gè)元素(abc = new[3])。注意,此時(shí)只有第一維動(dòng)態(tài)數(shù)組完成了初始化,第二維動(dòng)態(tài)數(shù)組仍然沒有進(jìn)行初始化,所以都為空數(shù)組。

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

接下來,使用for循環(huán)為每個(gè)第二維數(shù)組初始化(int類型的默認(rèn)值為0)

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

然后就可以再次使用foreach語法遍歷賦值和打印每個(gè)數(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} }




審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴

原文標(biāo)題:SystemVerilog中的動(dòng)態(tài)數(shù)組

文章出處:【微信號(hào):芯片驗(yàn)證工程師,微信公眾號(hào):芯片驗(yàn)證工程師】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    labview能否對動(dòng)態(tài)數(shù)組的元素每循環(huán)一次就比較一次大小

    labview能否對一個(gè)動(dòng)態(tài)數(shù)組,每進(jìn)行一次循環(huán),就比較一下本次元素值和上次元素值的大小,若大于上次循環(huán)元素,則記錄,不大于,則不記錄
    發(fā)表于 11-16 17:11

    轉(zhuǎn)一篇Systemverilog的一個(gè)牛人總結(jié)

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

    更新數(shù)組元素同時(shí)可更改數(shù)組大小

    大神們,求助,在我的程序中需要輸入一個(gè)2維數(shù)組作為數(shù)據(jù)輸入,但是當(dāng)?shù)谝淮螌懭霐?shù)據(jù)后,就確定了該數(shù)組的維度和大小,當(dāng)我再次更改數(shù)據(jù)時(shí),就不能改變數(shù)組
    發(fā)表于 05-10 16:24

    emOsprey動(dòng)態(tài)數(shù)組的特性

    來源:公眾號(hào)【魚鷹談單片機(jī)】作者:魚鷹OspreyID :emOsprey動(dòng)態(tài)數(shù)組???不知道你是否聽說過 C99 有一個(gè)動(dòng)態(tài)數(shù)組的特性,也就是說,
    發(fā)表于 01-11 06:28

    變長數(shù)組動(dòng)態(tài)數(shù)組區(qū)別

    動(dòng)態(tài)數(shù)組是指在聲明時(shí),沒有確定數(shù)組大小數(shù)組,它可以隨程序需要而重新指定大小
    的頭像 發(fā)表于 09-28 15:20 ?2275次閱讀

    SystemVerilog數(shù)組的賦值、索引和切片

    數(shù)組可以作為參數(shù)傳遞給子程序,當(dāng)數(shù)組作為值傳遞給子程序時(shí),會(huì)將這個(gè)數(shù)組復(fù)制一份傳遞給子程序。
    的頭像 發(fā)表于 10-20 10:13 ?5913次閱讀

    SystemVerilog中的操作方法

    SystemVerilog提供了幾個(gè)內(nèi)置方法來支持數(shù)組搜索、排序等功能。
    的頭像 發(fā)表于 10-31 10:10 ?3533次閱讀

    SystemVerilog中可以嵌套的數(shù)據(jù)結(jié)構(gòu)

    SystemVerilog中除了數(shù)組、隊(duì)列和關(guān)聯(lián)數(shù)組等數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)還可以嵌套。
    的頭像 發(fā)表于 11-03 09:59 ?1992次閱讀

    網(wǎng)絡(luò)和變量的未壓縮數(shù)組

    SystemVerilog有兩種類型的數(shù)組:壓縮數(shù)組和非壓縮數(shù)組。壓縮數(shù)組是連續(xù)存儲(chǔ)的位的集合,通常稱為向量。非壓縮
    的頭像 發(fā)表于 02-09 14:50 ?956次閱讀
    網(wǎng)絡(luò)和變量的未壓縮<b class='flag-5'>數(shù)組</b>

    C語言中的數(shù)組空間動(dòng)態(tài)開辟

    C語言中的數(shù)組空間動(dòng)態(tài)開辟 在C語言中,必不可少的需要使用到數(shù)組,通常為了動(dòng)態(tài)的開辟數(shù)組空間,可以使用 malloc 函數(shù),在C++中可以使
    的頭像 發(fā)表于 02-10 12:42 ?2494次閱讀

    使用SystemVerilog解決數(shù)組問題

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

    一些有趣的數(shù)組相關(guān)的SystemVerilog約束

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

    一些有趣的數(shù)組相關(guān)的SystemVerilog約束

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

    帶你了解SystemVerilog中的關(guān)聯(lián)數(shù)組

    SystemVerilog中,我們知道可以使用動(dòng)態(tài)數(shù)組實(shí)現(xiàn)數(shù)組元素個(gè)數(shù)的動(dòng)態(tài)分配,即隨用隨分
    的頭像 發(fā)表于 06-09 09:46 ?8348次閱讀
    帶你了解<b class='flag-5'>SystemVerilog</b>中的關(guān)聯(lián)<b class='flag-5'>數(shù)組</b>

    動(dòng)態(tài)數(shù)組和C++ std::vector詳解

    std::vector是C++的默認(rèn)動(dòng)態(tài)數(shù)組,其與array最大的區(qū)別在于vector的數(shù)組動(dòng)態(tài)的,即其大小可以在運(yùn)行時(shí)
    的頭像 發(fā)表于 07-19 11:07 ?1399次閱讀