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

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

淺析Zephyr應用的代碼結構中的自定義驅動
自定義視圖組件教程案例
SystemVerilog中至關重要的的數(shù)據(jù)類型

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

如何在Matlab中自定義Message

評論