數(shù)字硬件建模SystemVerilog-結(jié)構(gòu)體(一)
![poYBAGPkn2GALZ3EAAThsbJ2QM4493.png](https://file.elecfans.com/web2/M00/8F/87/poYBAGPkn2GALZ3EAAThsbJ2QM4493.png)
![pYYBAGPkn26AfnHsAAG4PgudtCo769.png](https://file.elecfans.com/web2/M00/90/0A/pYYBAGPkn26AfnHsAAG4PgudtCo769.png)
結(jié)構(gòu)體
結(jié)構(gòu)體用于將多個變量組合在一個通用名稱下。設計通常具有邏輯信號組,例如總線協(xié)議的控制信號,或狀態(tài)控制器內(nèi)使用的信號。結(jié)構(gòu)體提供了將這些相關變量捆綁在一起的方法。結(jié)構(gòu)體中的所有變量都可以單個賦值,或者每個變量都可以單獨賦值。結(jié)構(gòu)體包可以復制到具有相同定義的另一個結(jié)構(gòu)體,并通過模塊端口、任務或函數(shù)進出。
結(jié)構(gòu)體聲明
結(jié)構(gòu)體是使用struct關鍵字聲明的,類似于C語言。struct關鍵字后面跟著一個開始的大括號( { )變量聲明列表,結(jié)束的大括號(}),然后是結(jié)構(gòu)體的名稱。
![poYBAGPkn3qAP5SDAADbXLheCUk319.png](https://file.elecfans.com/web2/M00/8F/87/poYBAGPkn3qAP5SDAADbXLheCUk319.png)
一個結(jié)構(gòu)體可以將任意數(shù)量的變量數(shù)據(jù)類型捆綁在一起,用戶自定義類型、Parameter和localparam常量也可以包含在一個結(jié)構(gòu)體中,結(jié)構(gòu)體中的Parameter不能像模塊中的Parameter那樣重新定義,結(jié)構(gòu)體中的參數(shù)被視為localparam。
結(jié)構(gòu)體成員賦值
結(jié)構(gòu)體中的變量稱為結(jié)構(gòu)體成員。每個成員都有一個名稱,可用于從結(jié)構(gòu)體中選擇該成員。使用結(jié)構(gòu)體的名稱引用結(jié)構(gòu)體成員,后跟句點(.)然后是成員的名字。這與C中的語法相同。例如,要為前面結(jié)構(gòu)體的address成員賦值,引用為:
![pYYBAGPkn4WAXfXxAABYbLMYmVk544.png](https://file.elecfans.com/web2/M00/90/0A/pYYBAGPkn4WAXfXxAABYbLMYmVk544.png)
結(jié)構(gòu)體不同于數(shù)組,因為數(shù)組是所有類型和大小相同的元素的集合,而結(jié)構(gòu)體是不同類型和大小的變量和常量的集合。另一個區(qū)別是,數(shù)組的元素是通過在數(shù)組中使用索引來引用的;結(jié)構(gòu)體的成員是通過使用成員名稱來引用的。
整個結(jié)構(gòu)體賦值
可以為整個結(jié)構(gòu)體指定一個結(jié)構(gòu)體表達式。結(jié)構(gòu)體表達式是使用逗號分隔的值列表形成的,這些值包含在標記’{}之間,這與將一組值分配給數(shù)組的方式相同,大括號必須包含結(jié)構(gòu)體中每個成員的值。例如:
![poYBAGPkn4-AU3dEAAC3H_R3VVc987.png](https://file.elecfans.com/web2/M00/8F/87/poYBAGPkn4-AU3dEAAC3H_R3VVc987.png)
結(jié)構(gòu)體表達式中的值必須按照在結(jié)構(gòu)體中定義的順序列出,如前一示例所示?;蛘?,結(jié)構(gòu)體表達式可以指定要為其賦值的結(jié)構(gòu)體成員的名稱,其中成員名稱和值用冒號(:)分隔。結(jié)構(gòu)體表達式中的成員名稱稱為tags。指定成員名稱后,表達式列表可以是任意順序。
![pYYBAGPkn5iAJ6Z_AAA5CM4b_sI096.png](https://file.elecfans.com/web2/M00/90/0B/pYYBAGPkn5iAJ6Z_AAA5CM4b_sI096.png)
在同一個結(jié)構(gòu)體表達式中混合按名稱和按順序賦值是非法的。
結(jié)構(gòu)體表達式中的默認值。結(jié)構(gòu)體表達式可以通過指定默認值為一個結(jié)構(gòu)體的多個成員指定值,默認值是使用default關鍵字指定的。
![poYBAGPkn6SAVwPZAAAwNpLtlmA137.png](https://file.elecfans.com/web2/M00/8F/87/poYBAGPkn6SAVwPZAAAwNpLtlmA137.png)
結(jié)構(gòu)體表達式還可以包含對特定結(jié)構(gòu)體成員的混合賦值,以及對所有其他成員指定默認值。
![pYYBAGPkn7eALnUUAAAleJsWGV0098.png](https://file.elecfans.com/web2/M00/90/0B/pYYBAGPkn7eALnUUAAAleJsWGV0098.png)
結(jié)構(gòu)體中的枚舉數(shù)據(jù)類型。前兩個帶有默認值的示例存在語義錯誤,分配給結(jié)構(gòu)體成員的默認值必須與成員的數(shù)據(jù)類型兼容。由于大多數(shù)SystemVerilog變量都是弱類型的,因此幾乎所有默認值都是兼容的。然而,枚舉數(shù)據(jù)類型變量的類型更強。對枚舉數(shù)據(jù)類型變量的賦值必須是其枚舉列表中的標簽,或者是同一枚舉數(shù)據(jù)類型定義的另一個枚舉變量。
上述instruction_word 的兩個賦值語句試圖將opcode的默認值賦值為0。這是opcode的非法值,它是一個opcode_t枚舉數(shù)據(jù)類型變量(opcode_t的typedef定義是之前枚舉變量章節(jié))。當結(jié)構(gòu)體的成員是枚舉數(shù)據(jù)類型變量時,結(jié)構(gòu)體表達式必須為該成員指定合法的顯式值??梢詾樗衅渌蓡T指定默認值。例如:
![pYYBAGPkn8WAWKOQAABcJUyV-5w537.png](https://file.elecfans.com/web2/M00/90/0B/pYYBAGPkn8WAWKOQAABcJUyV-5w537.png)
自定義和匿名結(jié)構(gòu)體
用戶自定義類型可以使用typedef關鍵字從結(jié)構(gòu)體中創(chuàng)建。將結(jié)構(gòu)體聲明為用戶自定義類型不會分配任何存儲空間。在使用該結(jié)構(gòu)體之前,必須聲明該用戶自定義類型的網(wǎng)絡或變量。
![pYYBAGPkn9CAP72vAADS_DFarQA142.png](https://file.elecfans.com/web2/M00/90/0B/pYYBAGPkn9CAP72vAADS_DFarQA142.png)
不使用typedef的結(jié)構(gòu)體被定義為匿名結(jié)構(gòu)體。使用typedef聲明的結(jié)構(gòu)體被視為自定義結(jié)構(gòu)體。匿名結(jié)構(gòu)體和自定義結(jié)構(gòu)體都可以在模塊中定義,但這些本地(局部)定義只能在該模塊中使用。自定義結(jié)構(gòu)體也可以在包中定義,并導入到需要結(jié)構(gòu)體定義的設計塊中。包中定義的自定義結(jié)構(gòu)體可用于多個模塊和驗證測試臺。
結(jié)構(gòu)體復制
一個自定義結(jié)構(gòu)體可以復制到另一個自定義結(jié)構(gòu)體,只要這兩個結(jié)構(gòu)體是從同一個自定義結(jié)構(gòu)體定義聲明的。以下示例使用了上節(jié)中所示的結(jié)構(gòu)體定義和聲明。
匿名結(jié)構(gòu)體不能作為一個整體復制,但可以一次復制一個成員:
![pYYBAGPkn96AJ-PpAABvGEwBA2I389.png](https://file.elecfans.com/web2/M00/90/0B/pYYBAGPkn96AJ-PpAABvGEwBA2I389.png)
-
總線協(xié)議
+關注
關注
0文章
117瀏覽量
14906 -
控制信號
+關注
關注
0文章
169瀏覽量
12045 -
結(jié)構(gòu)體
+關注
關注
1文章
130瀏覽量
10873
發(fā)布評論請先 登錄
相關推薦
漫談C語言結(jié)構(gòu)體
GPIO結(jié)構(gòu)體定義
使用結(jié)構(gòu)體的主要作用
結(jié)構(gòu)體變量的定義與使用變量訪問結(jié)構(gòu)體成員
消息隊列傳遞結(jié)構(gòu)體指針和結(jié)構(gòu)體異同
SystemVerilog Assertion Handbo
SystemVerilog的斷言手冊
基于事件結(jié)構(gòu)的SystemVerilog指稱語義
共用體和結(jié)構(gòu)體的區(qū)別
數(shù)字硬件建模SystemVerilog-結(jié)構(gòu)體
SystemVerilog中可以嵌套的數(shù)據(jù)結(jié)構(gòu)
FPGA學習-SystemVerilog語言簡介
SystemVerilog中至關重要的結(jié)構(gòu)體和自定義類型
![<b class='flag-5'>SystemVerilog</b>中至關重要的<b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>和自定義類型](https://file.elecfans.com/web2/M00/89/B4/pYYBAGO35QqAHZ9gAAbWQS5GGmY652.jpg)
SystemVerilog的結(jié)構(gòu)體-2
![<b class='flag-5'>SystemVerilog</b>的<b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>-2](https://file.elecfans.com/web2/M00/8F/87/poYBAGPkoG6AH_JoAATLr5UXX3c768.png)
評論