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