數(shù)字硬件建模SystemVerilog-結(jié)構(gòu)體(二)
結(jié)構(gòu)體
結(jié)構(gòu)體用于將多個(gè)變量組合在一個(gè)通用名稱(chēng)下。設(shè)計(jì)通常具有邏輯信號(hào)組,例如總線(xiàn)協(xié)議的控制信號(hào),或狀態(tài)控制器內(nèi)使用的信號(hào)。結(jié)構(gòu)體提供了將這些相關(guān)變量捆綁在一起的方法。結(jié)構(gòu)體中的所有變量都可以單個(gè)賦值,或者每個(gè)變量都可以單獨(dú)賦值。結(jié)構(gòu)體包可以復(fù)制到具有相同定義的另一個(gè)結(jié)構(gòu)體,并通過(guò)模塊端口、任務(wù)或函數(shù)進(jìn)出。
結(jié)構(gòu)體復(fù)制
一個(gè)自定義結(jié)構(gòu)體可以復(fù)制到另一個(gè)自定義結(jié)構(gòu)體,只要這兩個(gè)結(jié)構(gòu)體是從同一個(gè)自定義結(jié)構(gòu)體定義聲明的。以下示例使用了上節(jié)中所示的結(jié)構(gòu)體定義和聲明。
匿名結(jié)構(gòu)體不能作為一個(gè)整體復(fù)制,但可以一次復(fù)制一個(gè)成員:
壓縮和非壓縮結(jié)構(gòu)體
默認(rèn)情況下,結(jié)構(gòu)體會(huì)被非壓縮的。這意味著結(jié)構(gòu)體的成員被視為獨(dú)立變量或常量,并以一個(gè)共同的名稱(chēng)分組在一起。SystemVerilog沒(méi)有指定軟件工具應(yīng)該如何存儲(chǔ)非壓縮結(jié)構(gòu)體的成員。不同的軟件工具具對(duì)于結(jié)構(gòu)體的存儲(chǔ)分布也是不同的。
通過(guò)使用關(guān)鍵字packed,將結(jié)構(gòu)體顯式聲明為壓縮結(jié)構(gòu)體。
壓縮結(jié)構(gòu)體以與向量相同的形式將結(jié)構(gòu)體的所有成員存儲(chǔ)為連續(xù)位。結(jié)構(gòu)體的第一個(gè)成員是向量最左邊的字段。結(jié)構(gòu)體中最后一個(gè)成員的最右邊的位是向量的最低有效位,編號(hào)為位0。如圖4-2所示。
圖4-2:壓縮結(jié)構(gòu)體存儲(chǔ)為向量
壓縮結(jié)構(gòu)體的所有成員都必須是整數(shù)值。整數(shù)值是可以表示為向量的值,例如byte、int和使用bit或logic類(lèi)型創(chuàng)建的向量。如果結(jié)構(gòu)體的任何成員不能表示為向量,則該結(jié)構(gòu)體不能被壓縮。這意味著壓縮結(jié)構(gòu)體不能包含實(shí)數(shù)或短實(shí)數(shù)變量、非壓縮結(jié)構(gòu)體、非壓縮聯(lián)合體體或非壓縮的數(shù)組。
引用壓縮結(jié)構(gòu)體和結(jié)構(gòu)體成員。壓縮結(jié)構(gòu)體可以復(fù)制,或分配一個(gè)結(jié)構(gòu)體表達(dá)式值列表,方法與非壓縮結(jié)構(gòu)體相同。壓縮結(jié)構(gòu)體的成員可以通過(guò)成員名稱(chēng)引用,方式與非壓縮結(jié)構(gòu)體相同。
壓縮結(jié)構(gòu)體也可以被視為一個(gè)向量。因此,除了結(jié)構(gòu)體分配,向量值還可以分配給壓縮結(jié)構(gòu)體
向量賦值是合法的,因?yàn)橘x值左邊的結(jié)構(gòu)體成員已壓縮在一起,形成一組連續(xù)的位,方式與向量相同。因?yàn)閴嚎s結(jié)構(gòu)體存儲(chǔ)為一組連續(xù)的位,所以對(duì)壓縮結(jié)構(gòu)體執(zhí)行向量操作也是合法的,包括位選擇和部分選擇。以下兩個(gè)賦值都將分配給data_word的tag成員:
可以在向量上執(zhí)行的數(shù)學(xué)運(yùn)算、邏輯運(yùn)算和任何其他運(yùn)算也可以在壓縮結(jié)構(gòu)體上執(zhí)行。
有符號(hào)壓縮結(jié)構(gòu)體。壓縮結(jié)構(gòu)體可以用signed和unsigned關(guān)鍵字聲明。當(dāng)在運(yùn)算或關(guān)系運(yùn)算中用作向量時(shí),這些修飾符會(huì)影響整個(gè)結(jié)構(gòu)體的識(shí)別方式。它們不會(huì)影響結(jié)構(gòu)體成員的識(shí)別方式。結(jié)構(gòu)體的每個(gè)成員都被視為有符號(hào)或無(wú)符號(hào),這取決于該成員的類(lèi)型聲明。壓縮結(jié)構(gòu)體的部分選擇是無(wú)符號(hào)的,與向量的部分選擇相同。
通過(guò)端口傳遞結(jié)構(gòu)體
自定義結(jié)構(gòu)體可以通過(guò)模塊和接口的端口傳遞,結(jié)構(gòu)體必須首先使用 typedef 定義為用戶(hù)自定義數(shù)據(jù)類(lèi)型,然后才允許將模塊或接口的端口聲明為結(jié)構(gòu)體類(lèi)型。
非壓縮的結(jié)構(gòu)體必須是自定義結(jié)構(gòu)體,才能通過(guò)端口傳遞該結(jié)構(gòu)體。與端口的連接必須是與端口類(lèi)型完全相同的結(jié)構(gòu)體。也就是說(shuō),端口和端口兩側(cè)的連接都必須從相同的typedef定義聲明。此限制僅適用于非壓縮結(jié)構(gòu)體。通過(guò)模塊端口的壓縮結(jié)構(gòu)體被視為向量。端口的外部連接可以是相同類(lèi)型的壓縮結(jié)構(gòu)體,也可以是任何類(lèi)型的向量。
通過(guò)將任務(wù)或函數(shù)參數(shù)聲明為結(jié)構(gòu)體類(lèi)型,自定義結(jié)構(gòu)體也可以作為參數(shù)傳遞給任務(wù)或函數(shù)。
當(dāng)調(diào)用一個(gè)任務(wù)或函數(shù)時(shí),如果該任務(wù)或函數(shù)有一個(gè)非壓縮的結(jié)構(gòu)體作為正式參數(shù)菜單,則必須將一個(gè)完全相同類(lèi)型的結(jié)構(gòu)體傳遞給該任務(wù)或函數(shù)。壓縮結(jié)構(gòu)體形式參數(shù)被視為向量,可以傳遞給任何類(lèi)型的向量。
傳統(tǒng)的Verilog與結(jié)構(gòu)體
最初的Verilog語(yǔ)言沒(méi)有一種方便的機(jī)制來(lái)將常見(jiàn)信號(hào)收集到一個(gè)組中。在傳統(tǒng)的Verilog樣式的模型中,工程師必須使用特殊的分組方法,例如命名約定,其中一組中的每個(gè)信號(hào)都以一組公共字符開(kāi)始或結(jié)束。最初的Verilog語(yǔ)言也無(wú)法通過(guò)模塊端口或任務(wù)和函數(shù)傳遞信號(hào)集合,每個(gè)信號(hào)都必須通過(guò)單獨(dú)的端口或參數(shù)傳遞。
在原始Verilog語(yǔ)言中添加結(jié)構(gòu)體是一種強(qiáng)大的RTL建模構(gòu)造,反之亦然。它提供了一種更簡(jiǎn)潔、更直觀(guān)、更可重用的復(fù)雜模型功能建模方法。包中定義的自定義結(jié)構(gòu)體可以在多個(gè)模塊中重復(fù)使用,也可以在用于驗(yàn)證RTL模型的驗(yàn)證測(cè)試臺(tái)中重復(fù)使用。
綜合指導(dǎo)
非壓縮結(jié)構(gòu)體和壓縮結(jié)構(gòu)體都是可綜合的。綜合工具支持結(jié)構(gòu)體通過(guò)模塊端口傳遞 , 也支持作為輸入或輸出傳遞給任務(wù)和函數(shù) , 也支持使用成員名和值的列表對(duì)結(jié)構(gòu)體進(jìn)行賦值。
綜合編譯器可能比壓縮結(jié)構(gòu)體更好地優(yōu)化非壓縮結(jié)構(gòu)體。非壓縮結(jié)構(gòu)體允許軟件工具確定存儲(chǔ)或?qū)崿F(xiàn)每個(gè)結(jié)構(gòu)體成員的最佳方式,而壓縮結(jié)構(gòu)體則決定如何組織每個(gè)成員。
-
控制器
+關(guān)注
關(guān)注
112文章
16389瀏覽量
178436 -
控制信號(hào)
+關(guān)注
關(guān)注
0文章
166瀏覽量
11990 -
結(jié)構(gòu)體
+關(guān)注
關(guān)注
1文章
130瀏覽量
10852
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論