在上一篇文章《SystemVerilog中至關(guān)重要的的數(shù)據(jù)類型》中,介紹了枚舉類型的本質(zhì)和使用語(yǔ)法。本文接著介紹SV中同樣不可忽略的結(jié)構(gòu)體(structure)和自定義類型(typedef),最后也會(huì)給出一小段涵蓋絕大部分語(yǔ)法點(diǎn)的例程。個(gè)人覺(jué)得編程語(yǔ)言的熟練掌握更多在平時(shí)練習(xí)和思考,語(yǔ)法忘掉了隨時(shí)可以查閱。
認(rèn)識(shí)結(jié)構(gòu)體
結(jié)構(gòu)體(structure)是一種可以包含不同數(shù)據(jù)類型元素的集合類型。這一點(diǎn)跟數(shù)組、隊(duì)列等集合類型是不一樣的,數(shù)組和隊(duì)列只能包含相同數(shù)據(jù)類型的元素。結(jié)構(gòu)體在引用的時(shí)候,可以對(duì)這些元素進(jìn)行整體引用,也可以通過(guò)元素名稱來(lái)對(duì)元素進(jìn)行單獨(dú)引用。
基于這個(gè)特性,結(jié)構(gòu)體通??梢杂脕?lái)表征一個(gè)包含了諸多不同類型屬性的對(duì)象。比如,當(dāng)我們想要表征一個(gè)人的所有屬性的時(shí)候,名字元素可以用string類型,年齡元素可以用int類型,存款元素可以用real類型等等,最后可以通過(guò)對(duì)整體引用來(lái)獲得一個(gè)人的所有屬性,也可以通過(guò)元素名稱來(lái)獲得單個(gè)屬性。
另一個(gè)栗子,可以使用結(jié)構(gòu)體來(lái)定義某個(gè)寄存器的結(jié)構(gòu)。在結(jié)構(gòu)體類型定義的時(shí)候,我們可以在內(nèi)部使用logic [n:m]等基本數(shù)據(jù)類型來(lái)定義寄存器的不同域段。這樣一來(lái),我們不但可以對(duì)寄存器進(jìn)行整體引用,又可以使用元素名來(lái)很方便地讀寫(xiě)寄存器的各個(gè)域段。
講完結(jié)構(gòu)體的邏輯結(jié)構(gòu),下面來(lái)看看結(jié)構(gòu)體的物理結(jié)構(gòu)。
在內(nèi)存存儲(chǔ)一個(gè)結(jié)構(gòu)體的時(shí)候,SV提供了packed關(guān)鍵字用來(lái)區(qū)分合并(packed)和非合并(unpacked)存儲(chǔ)方式?!昂喜ⅰ边@個(gè)概念在另一篇文章中也有涉及。合并的結(jié)構(gòu)體,其元素會(huì)被無(wú)間隙的存放到一塊連續(xù)的內(nèi)存空間上。而非合并的結(jié)構(gòu)體,其物理結(jié)構(gòu)一般依賴于C編譯器。SV默認(rèn)是非合并的,這是為了提高內(nèi)存空間的利用率,如果用戶想要用合并的,需要在struct關(guān)鍵字后面加上packed。
合并的結(jié)構(gòu)體是有不少用處的。第一,合并結(jié)構(gòu)體的整體可以被當(dāng)成一個(gè)向量來(lái)看待,這樣一來(lái),合并結(jié)構(gòu)體的賦值、讀取和數(shù)值計(jì)算上多了靈活性;第二,合并結(jié)構(gòu)體可以通過(guò)在packed關(guān)鍵字后面加signed/unsigned來(lái)指定為有無(wú)符號(hào)類型,排在第一個(gè)位置的元素最高位為符號(hào)位,相比之下,非合并的結(jié)構(gòu)體是不能被指定為有符號(hào)類型的。
結(jié)構(gòu)體的使用
SV結(jié)構(gòu)體的特性跟C語(yǔ)言基本一致,但在語(yǔ)法上有差別。比如在C語(yǔ)言中,定義一個(gè)結(jié)構(gòu)體類型,是在struct關(guān)鍵字后面加上structure tag名來(lái)作為類型名稱;而在SV中,統(tǒng)一使用typedef來(lái)定義結(jié)構(gòu)體類型名稱。
這里穿插介紹一下typedef。typedef是SV中提供用來(lái)重定義類型名的關(guān)鍵字,一般也叫做用戶自定義類型。其最大的好處就是可以將一些“又臭又長(zhǎng)”的類型定義成簡(jiǎn)短的類型名,特別是在一些復(fù)雜的testbench中會(huì)經(jīng)常遇到。使用typedef可以提高編程效率,也可以通過(guò)新的類型名來(lái)提高代碼的可讀性。
看看代碼吧
下面代碼和注釋總結(jié)了結(jié)構(gòu)體的使用方法,個(gè)人覺(jué)得掌握例程中的內(nèi)容對(duì)工作來(lái)說(shuō)已經(jīng)完全足夠啦,但例程同樣沒(méi)有經(jīng)過(guò)編譯哈。
參考文獻(xiàn)
[1] IEEE Standard Association. "IEEE Standard for SystemVerilog-Unified Hardware Design, Specification, and Verification Language." (2013).
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7256瀏覽量
91912 -
Verilog
+關(guān)注
關(guān)注
29文章
1367瀏覽量
112310 -
代碼
+關(guān)注
關(guān)注
30文章
4900瀏覽量
70772
發(fā)布評(píng)論請(qǐng)先 登錄
LabVIEW自定義控件
LabVIEW自定義數(shù)據(jù)類型
用戶自定義結(jié)構(gòu)數(shù)據(jù)怎么存儲(chǔ)成VARIANT類型
請(qǐng)問(wèn)自定義結(jié)構(gòu)體中u16 RESERVEDi起什么作用?
嵌入式ARM開(kāi)發(fā)之自定義數(shù)據(jù)類型相關(guān)資料推薦
SOPC中自定義外設(shè)和自定義指令性能分析

C++程序設(shè)計(jì)教程之自定義數(shù)據(jù)類型的詳細(xì)資料說(shuō)明

淺析Zephyr應(yīng)用的代碼結(jié)構(gòu)中的自定義驅(qū)動(dòng)
自定義視圖組件教程案例
SystemVerilog中至關(guān)重要的的數(shù)據(jù)類型

博途PLC1200/1500PLC用戶自定義數(shù)據(jù)類型(UDT)

如何在Matlab中自定義Message

評(píng)論