在上一篇文章《SystemVerilog中至關(guān)重要的的數(shù)據(jù)類型》中,介紹了枚舉類型的本質(zhì)和使用語法。本文接著介紹SV中同樣不可忽略的結(jié)構(gòu)體(structure)和自定義類型(typedef),最后也會給出一小段涵蓋絕大部分語法點的例程。個人覺得編程語言的熟練掌握更多在平時練習和思考,語法忘掉了隨時可以查閱。
認識結(jié)構(gòu)體
結(jié)構(gòu)體(structure)是一種可以包含不同數(shù)據(jù)類型元素的集合類型。這一點跟數(shù)組、隊列等集合類型是不一樣的,數(shù)組和隊列只能包含相同數(shù)據(jù)類型的元素。結(jié)構(gòu)體在引用的時候,可以對這些元素進行整體引用,也可以通過元素名稱來對元素進行單獨引用。
基于這個特性,結(jié)構(gòu)體通??梢杂脕肀碚饕粋€包含了諸多不同類型屬性的對象。比如,當我們想要表征一個人的所有屬性的時候,名字元素可以用string類型,年齡元素可以用int類型,存款元素可以用real類型等等,最后可以通過對整體引用來獲得一個人的所有屬性,也可以通過元素名稱來獲得單個屬性。
另一個栗子,可以使用結(jié)構(gòu)體來定義某個寄存器的結(jié)構(gòu)。在結(jié)構(gòu)體類型定義的時候,我們可以在內(nèi)部使用logic [n:m]等基本數(shù)據(jù)類型來定義寄存器的不同域段。這樣一來,我們不但可以對寄存器進行整體引用,又可以使用元素名來很方便地讀寫寄存器的各個域段。
講完結(jié)構(gòu)體的邏輯結(jié)構(gòu),下面來看看結(jié)構(gòu)體的物理結(jié)構(gòu)。
在內(nèi)存存儲一個結(jié)構(gòu)體的時候,SV提供了packed關(guān)鍵字用來區(qū)分合并(packed)和非合并(unpacked)存儲方式。“合并”這個概念在另一篇文章中也有涉及。合并的結(jié)構(gòu)體,其元素會被無間隙的存放到一塊連續(xù)的內(nèi)存空間上。而非合并的結(jié)構(gòu)體,其物理結(jié)構(gòu)一般依賴于C編譯器。SV默認是非合并的,這是為了提高內(nèi)存空間的利用率,如果用戶想要用合并的,需要在struct關(guān)鍵字后面加上packed。
合并的結(jié)構(gòu)體是有不少用處的。第一,合并結(jié)構(gòu)體的整體可以被當成一個向量來看待,這樣一來,合并結(jié)構(gòu)體的賦值、讀取和數(shù)值計算上多了靈活性;第二,合并結(jié)構(gòu)體可以通過在packed關(guān)鍵字后面加signed/unsigned來指定為有無符號類型,排在第一個位置的元素最高位為符號位,相比之下,非合并的結(jié)構(gòu)體是不能被指定為有符號類型的。
結(jié)構(gòu)體的使用
SV結(jié)構(gòu)體的特性跟C語言基本一致,但在語法上有差別。比如在C語言中,定義一個結(jié)構(gòu)體類型,是在struct關(guān)鍵字后面加上structure tag名來作為類型名稱;而在SV中,統(tǒng)一使用typedef來定義結(jié)構(gòu)體類型名稱。
這里穿插介紹一下typedef。typedef是SV中提供用來重定義類型名的關(guān)鍵字,一般也叫做用戶自定義類型。其最大的好處就是可以將一些“又臭又長”的類型定義成簡短的類型名,特別是在一些復雜的testbench中會經(jīng)常遇到。使用typedef可以提高編程效率,也可以通過新的類型名來提高代碼的可讀性。
看看代碼吧
下面代碼和注釋總結(jié)了結(jié)構(gòu)體的使用方法,個人覺得掌握例程中的內(nèi)容對工作來說已經(jīng)完全足夠啦,但例程同樣沒有經(jīng)過編譯哈。

參考文獻
[1] IEEE Standard Association. "IEEE Standard for SystemVerilog-Unified Hardware Design, Specification, and Verification Language." (2013).
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7339瀏覽量
94826 -
Verilog
+關(guān)注
關(guān)注
30文章
1374瀏覽量
114550 -
代碼
+關(guān)注
關(guān)注
30文章
4971瀏覽量
74027
發(fā)布評論請先 登錄
LabVIEW自定義控件
LabVIEW自定義數(shù)據(jù)類型
用戶自定義結(jié)構(gòu)數(shù)據(jù)怎么存儲成VARIANT類型
請問自定義結(jié)構(gòu)體中u16 RESERVEDi起什么作用?
嵌入式ARM開發(fā)之自定義數(shù)據(jù)類型相關(guān)資料推薦
SOPC中自定義外設(shè)和自定義指令性能分析
C++程序設(shè)計教程之自定義數(shù)據(jù)類型的詳細資料說明
淺析Zephyr應用的代碼結(jié)構(gòu)中的自定義驅(qū)動
自定義視圖組件教程案例
SystemVerilog中至關(guān)重要的的數(shù)據(jù)類型
博途PLC1200/1500PLC用戶自定義數(shù)據(jù)類型(UDT)
如何在Matlab中自定義Message
SystemVerilog中至關(guān)重要的結(jié)構(gòu)體和自定義類型
評論