色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

帶你了解SystemVerilog中的關聯數組

sanyue7758 ? 來源:硅芯思見 ? 2023-06-09 09:46 ? 次閱讀

在SystemVerilog中,我們知道可以使用動態數組實現數組元素個數的動態分配,即隨用隨分,其中元素在數組中的索引是連續的,但是如果要實現數組元素訪問時不采用連續索引的話,采用動態數組和定寬數組就不是很合適,容易造成空間的浪費,為此在SystemVerilog中引入了關聯數組(Associative Array),實現了一種查找表,該查找表的索引可以根據用戶需要指定,不限于整形,其內存空間直到使用時才會分配,即只針對寫入的元素分配存儲空間,其使用方式類似于Perl等其他語言中的哈希結構

關聯數組與其他數組表面上的不同主要體現在數組的索引上,非關聯數組的索引一般都是整型變量,而關聯數組的索引可以是任何的數據類型。

下面我們將通過示例說明關聯數組是如何定義和常用的方法如何使用。

1 關聯數組的聲明格式

關聯數組采用在方括號中放置數據類型的形式來進行聲明,其格式如下:

data_type array_name [index_type];

其中

data_type :指定的是數組成員數據類型,可以是定寬數組允許的任何類型;

array_name:指定關聯數組的名字,符合標識符命名規則,當然每個公司命名規范可能不一樣;

index_type:關聯數組索引的數據類型,如果指定了索引數據類型,那么對于數組元素訪問時索引就必須要匹配指定的索引數據類型。同時索引的類型也可以使用通配符,此時對于同一數組中元素索引時,索引的數據類型就可以不一樣;

下面主要針對不同的index_type和關聯數組中常用到的方法進行示例說明。

2 關聯數組不同的索引類型

2.1 index_type為string

【示例】

44f5ea0c-0610-11ee-962d-dac502259ad0.png

仿真結果】

451491c8-0610-11ee-962d-dac502259ad0.png

示例中定義了兩個數組,arr1數組的索引類型為string,數組中每個元素的類型為int,再給arr1初始化時,通過“鍵:值對”實現對應元素的初始化,arr1[First]的值為’hAB,arr2[Second]的值為’hCD,在訪問arr1中的元素時,也可以如示例中通過索引“First”和“Second”來訪問。通過該示例,對于關聯數組中特定索引元素的空間分配賦值可以通過{index:value} 方式實現。

2.2 index_type為class

【示例】

45250c1a-0610-11ee-962d-dac502259ad0.png

【仿真結果】

45425216-0610-11ee-962d-dac502259ad0.png

示例中,聲明的關聯數組arr的索引類型為packet(class),packet聲明了三個句柄,pkt1和pkt2都指向了創建的對象,pkt3為空句柄null,通過數組名.[句柄]的方式實現了對于特定句柄作為索引的數組元素的賦值操作。示例中,通過foreach遍歷數組中所有元素,通過仿真結果可以看到其中所有的賦值操作都賦值成功。這里有一點需要注意,盡管句柄pkt3為null,對其的賦值操作仍然是成功的,但是需要注意的是,如果再聲明一個pkt4空句柄,并且在“arr[pkt3] = ‘hC”之后給arr[pkt4]賦值為”’hD”,那么對arr[pkt3]中的值將會被覆蓋掉,這是因為pkt3和pkt4的值相同都是null,所以后續如果進行對數組的遍歷訪問操作,訪問的結果還是只能訪問到三個元素,而不是四個,即對于索引類型為class的關聯數組,關聯數組的索引句柄可以為null,且所有句柄值為null的數組元素指向同一個值。同時通過示例注意到,關聯數組中元素在使用foreach進行遍歷時,并不是按照數組元素初始化的順序進行輸出的,而是根據索引類型排列相對順序的。

2.3 index_type不能為4值邏輯變量

【示例】

455346c0-0610-11ee-962d-dac502259ad0.png

【仿真結果】

4568ddd2-0610-11ee-962d-dac502259ad0.png

示例中,L4_type為自定義的兩位logic類型,因為logic具有(0、1、x、z四種),數組arr的索引類型使用的就是L4_type,在給數組中元素進行初始化時,使用“2’hx”和“2’hz”作為索引,此時進行仿真時會產生提示信息(不同仿真工具產生的信息級別不同),通過foreach遍歷數組,數組中并不包含對于索引為“2’hx”和“2’hz”的數組元素,即關聯數組的數組索引不能為“x”和“z”

2.4 index_type為*

如果index_type沒有指定類型,而是使用通配符“*”時,雖然貌似通配符可以匹配任何類型,但是在SystemVerilog中,此時的“通配符*”只能匹配任何的integral數據類型(參見IEEE1800-2017 6.11),對于其他非integral類型不能用于匹配!

【示例】

457a2916-0610-11ee-962d-dac502259ad0.png

【仿真結果】

4595de54-0610-11ee-962d-dac502259ad0.png

示例中,關聯數組arr聲明索引類型時使用了“*”,在initial塊中,將句柄pkt作為數組的索引進行賦值操作。對上述代碼編譯時仿真器報錯,這主要是因為class不屬于SystemVerilog中定義的integral類型。那么index_type為“*”的關聯數組中索引的類型是不是必須要一致呢?看下例。

【示例】

45aa2f80-0610-11ee-962d-dac502259ad0.png

【仿真結果】

45b9e8da-0610-11ee-962d-dac502259ad0.png

示例中,關聯數組arr在聲明時index_type為“*”,并且在通過不同類型的索引對數組arr中相應元素進行了賦值操作,并且將這些元素通過不同類型的索引都打印了出了。雖然這些索引的類型不同,但是這些類型有一個共同點都屬于SystemVerilog中的integral類型,可見關聯數組的索引如果為“*”的話,在通過不同類型索引給數組元素賦值時,這些索引必須都是integral類型。

其實從一個側面可以體會到,SystemVerilog中所有的integral類型在某種程度上可以相互轉換,類似于C語言中的不同數據類型之間的自動轉換一樣。另外,可能有人會問,為什么對于這個數組打印消息是不使用foreach結構呢?請看下例。

【示例】不能使用foreach結構

45c96f4e-0610-11ee-962d-dac502259ad0.png

【仿真結果】

45dd6724-0610-11ee-962d-dac502259ad0.png

示例中,關聯數組arr聲明時其中index_type使用了“*”,然后給arr中相關元素通過不同的索引類型進行了賦值初始化操作,最后企圖使用foreach遍歷arr時報錯,正如報錯信息顯示,當關聯數組聲明時索引為“*”,那么該數組不能使用使用foreach對該數組進行遍歷

3 關聯數組常用方法

關聯數組中在使用時常會使用一些內建的方法,這些常用的方法如下表所示,

方法名 作用
num()/size() functionint num();
function int size();
返回當前數組元素個數
delete(index) function void delete([input index]);
刪除指定索引的數組元素
exists(index) function int exists(input index);
檢查指定索引的數組元素是否存在,如果存在返回1,否則為0
first(var) function int first(ref index);
將數組第一個元素的索引賦給變量var
last(var) function int last(ref index);
將數組最后一個元素的索引賦給變量var
next(var) function int next(ref index);
將數組當前元素的下一個元素的索引賦給變量var
prev(var) function int prev(ref index);
將數組當前元素的上一個元素的索引賦給變量var

那么,關聯數組的這些方法如何使用呢?下面通過示例了解下。

【示例】num(),exists(),delete(index)

45f7d6e0-0610-11ee-962d-dac502259ad0.png

【仿真結果】

461d17d4-0610-11ee-962d-dac502259ad0.png

示例中,通過“數組名.num()”的方式獲取到當前數組中元素的個數。然后通過foreach遍歷了數組中所有的元素。通過“數組名.exists(索引號)”的方式,可以檢測數組中是否存在指定索引的元素。

當通過“數組名.delete(索引號)”的方式可以刪除數組中指定索引號的數組元素,示例中通過arr.delete(1)刪除了數組中索引號為“1”的元素后,再次調用arr.exists(1)檢查數組中是否還存在索引號為“1”的元素,通過仿真結果可以看到,數組中索引號為“1”的元素已經被刪除。

這里需要注意,示例中使用的三個方法的格式分別是:“數組名.num()”、“數組名.exists(索引號)”和“數組名.delete(索引序號)”,其中delete后也可以不帶索引號,此時將會將整個數組“清空”!另外,在使用時一定要注意,關聯數組如果不對其進行任何有效寫入時,數組的大小時為0。、,即關聯數組在使用之前是不會耗費存儲空間的。

【示例】first(),next()

4629e662-0610-11ee-962d-dac502259ad0.png

【仿真結果】

464b8452-0610-11ee-962d-dac502259ad0.png

示例中,在initial過程塊中,首先通過“數組名.first(變量名)”的方式將數組arr中第一個(最小)索引的值賦給給定的索引變量temp(注意變量類型與數組索引類型一致),但是此時arr中沒有任何元素,所以此時通過數組名調用“arr.first(temp)”方法返回0,即輸出“1st entry does not exist!”。

通過for循環對數組進行初始化,之后再次“arr.first(temp)”,因為數組中有元素,所以first()方法返回非零,同時將初始化后數組中第一個(最小)索引賦值給temp。

然后通過“arr.next(temp)”獲取比給定的索引值(temp)大的最小索引值,如果存在下一項,則將下一項的索引賦給索引變量temp,因為給定的temp此時值為0,所以next()方法調用后,將數組下一個元素的索引賦給了變量temp,所以仿真結果此時輸出temp值變為了1.示例的最后do...while()循環將first()和next()配合使用,有效地遍歷數組。

這里需要注意,示例中使用的方法的格式分別是:“數組名.first(索引變量)”和“數組名.next(索引變量)”。

【示例】

465dbba4-0610-11ee-962d-dac502259ad0.png

【仿真結果】

467c2396-0610-11ee-962d-dac502259ad0.png

示例中,在initial過程塊中,首先通過for循環對數組進行初始化,之后執行“arr.last(temp)”,因為數組中有元素,所以last()方法返回非零,同時將初始化后數組中最后(最大)索引賦值給temp。

然后通過“arr.prev(temp)”獲取比給定的索引值(temp)小的最大索引值,如果存在上一項,則將上一項的索引賦給索引變量temp,因為調用last(temp)方法后給temp的值為3,所以prev()方法調用后,將數組上一個元素的索引賦給了變量temp,所以仿真結果此時輸出索引為temp的數組元素的值輸出.示例的最后將last()和prev()配合使用可以有效地遍歷數組

這里需要注意,示例中使用的方法的格式分別是:“數組名.last(索引變量)”和“數組名.prev(索引變量)”。

上述first()、next()、last()和prev()這些方法在使用的時候一定要注意,如果關聯數組索引類型為“*”的話,這些方法不能使用。





審核編輯:劉清

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

    關注

    14

    文章

    1019

    瀏覽量

    83880
  • Verilog
    +關注

    關注

    28

    文章

    1351

    瀏覽量

    110250
  • C語言
    +關注

    關注

    180

    文章

    7614

    瀏覽量

    137409

原文標題:敲黑板,帶你了解SystemVerilog中的關聯數組

文章出處:【微信號:處芯積律,微信公眾號:處芯積律】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    轉一篇Systemverilog的一個牛人總結

    () ;//釋放空間l 隊列在隊列增加或刪除元素比較方便。l 關聯數組當你需要建立一個超大容量的數組關聯數組,存放稀疏矩陣的值。表示方
    發表于 08-27 14:50

    求職寶典:寒武紀2019筆試題

    。(2)動態數組:可以在仿真時分配空間或者調整寬度,這樣在仿真中就可以使用最小的存儲量。在聲明時,其下標為空[ ],使用new[ ]操作符來分配空間。(3)關聯數組SystemVerilog提供
    發表于 12-24 11:55

    PHP數組排序

    數組排序(6個) sort() - 以升序對數組排序rsort() - 以降序對數組排序 reversal sort)asort() - 根據值,以升序對關聯數組進行排序(associ
    發表于 11-04 07:48

    基于社交網絡和關聯數據的服務網絡構建方法

    網絡可用服務的急劇增加對面向服務計算技術的發展起到了極大的推動作用。針對服務的規模和利用率遠沒有達到預期,以及服務之間交互關系的復雜性問題,提出基于社交網絡和關聯數據的服務網絡構建方法。首先,結合
    發表于 12-06 13:50 ?0次下載
    基于社交網絡和<b class='flag-5'>關聯數</b>據的服務網絡構建方法

    基于本體的軟件工程關聯數據的自動構建

    針對目前在分布異構的大規模軟件開發難以高效地知曉信息和發現知識的問題,將語義網引入軟件工程領域,對多源異構數據進行細粒度語義關聯,提出本體構建、關聯抽取和發現的方法,實現基于本體的軟件工程
    發表于 12-22 17:03 ?0次下載
    基于本體的軟件工程<b class='flag-5'>關聯數</b>據的自動構建

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

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

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

    需要使用" new "操作符實例化一個動態數組,使用[]表示。在實例化過程,會設置動態數組的大小。
    的頭像 發表于 10-21 09:43 ?1499次閱讀

    SystemVerilog的操作方法

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

    SystemVerilog關聯數組

    關聯數組實際上是一種查找表,內存空間直到被使用時才會分配,每個數據項都會有一個特定的“鍵(索引)”,索引的類型不局限于整型。
    的頭像 發表于 10-31 10:12 ?3702次閱讀

    SystemVerilog可以嵌套的數據結構

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

    網絡和變量的未壓縮數組

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

    使用SystemVerilog解決數組問題

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

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

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

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

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

    隨機抽取SV數組的一個元素方法實現

    如果想從一個關聯數組隨機選取一個元素,需要逐個訪問它之前的元素,原因是沒辦法能夠直接訪問到第N個元素。上面的程序示范了如何從一個以整數值作為索引**的關聯數組隨機選取一個元素。
    的頭像 發表于 03-21 10:11 ?1087次閱讀
    隨機抽取SV<b class='flag-5'>數組</b><b class='flag-5'>中</b>的一個元素方法實現
    主站蜘蛛池模板: 欧美日韩看看2015永久免费| 中国人泡妞www免费| 亚洲 天堂 国产在线播放| 亚洲欧美一区二区三区久久| 曰本少妇高潮久久久久久| china年轻小帅脸直播飞机| 国产精品久久久久久久伊一| 久久久精品免费视频| 欧美性黑吊xxx| 亚洲a免费| av无码在线日本天堂| 国产啪视频在线播放观看| 麻豆国产成人AV在线| 少妇邻居内射在线| 伊人久久综合影院| 第一福利视频网站在线| 久久精品国产亚洲AV久五月天 | 俄罗斯大肥BBXX| 精品高潮呻吟99AV无码| 欧美另类老女人| 亚洲精品午夜VA久久成人| JEALOUSVUE成熟老师APP| 好硬好湿好大再深一点动态图| 欧美精品高清在线观看| 亚洲精品永久免费| 成人午夜剧场| 久久久久久久久人体| 十分钟在线观看免费视频高清WWW| 欲乱艳荡少寡妇全文免费| 国产AV无码一二三区视频| 久久永久影院免费| 无限资源在线完整高清观看1| 97伦理97伦理2018最新| 国产亚洲人成网站在线观看播放| 欧美三级在线完整版免费| 一个人的视频全免费在线观看www 一个人的免费完整在线观看HD | 亚洲免费人成 久久| 出轨的妻子在线观看| 久久日本精品国产精品| 星空无限传媒视频在线观看视频| 99久久99久久久99精品齐|