本文所有源碼可通過後臺回復 “結構體”獲得
結構體由關鍵字 struct 聲明,且結構體中的成員可以是任何數據類型
如下定義壹個結構體:
結構體就如同壹個集合,集合中包含各種變量和常量,並且這些變量和常量可以用結構體名進行引用,引用方式為 <結構體名>.<變量名>
如果要用到上面定義的結構體中的變量c,可以這樣引用 Instruction_Word.c
結構體也可以整體顯示聲明為變量整體或者線網整體
結構體整體可以聲明為線網類型,但結構體內部不能使用線網類型
像上面這個例子,我們把結構體名定義的比較長,每次引用結構體內的變量,會顯得冗長,這裏可以利用 typedef 將結構體聲明為用戶自定義類型
這裏有兩點需要說明
可以在實例化結構體時對內部的變量進行初始化,方法是用 '{} ,大括號裏的 數值個數及次序必須與成員個數及次數壹致
看個例子
運行結果如下
註意:大括號前的符號是 英文的單撇號
剛開始以為是Esc鍵下面的那個按鍵,結果就運行失敗了
嘗試壹下在實例化的時候刪除壹個賦值
看看編譯會出現什麽情況
看來賦值時的個數確實要與結構體內部變量的個數壹致
如果我們壹時間只想改變結構體中某個成員的值,可以單獨給這個成員賦值
就像上面這個例子,在初始化後,我們只想改變變量 flag 的值,可以這樣
從運行結果中可以看到,初始化時flag為0,通過單獨給flag賦值後,變為1
結構體表達式賦值與初始化類似
有兩種形式
我們試試兩種方式賦值是否都可行
可見兩種方式都可行!
那麽這兩種方式能不能混合使用呢?
我們在顯示後面再加兩句
運行結果顯示 不能混合使用
結構體表達式的方式是不是類似於Verilog中module的調用,分為按位置調用和按名稱調用,只不過不能有缺省
關鍵字 default 可以將結構體的所有成員指定為默認值,像這樣 '{default:0}
可以看到運行結果均為對應位寬的默認數值
優先級排序:default賦值 < 數據類型賦值 < 成員名稱賦值
優先級高的賦值會覆蓋掉優先級低的賦值
用壹個例子測試壹下
可以看到,最終輸出的結果是 成員名賦值 的結果,因為按成員名稱賦值的優先級最高
壓縮結構體就像壹個向量,所有的成員都是向量中的元素,成員按照在結構體中的順序,依次是向量的高位和低位
比如下面這個壓縮結構體:
按照壓縮變量的說法, title, middle, endle 會組成壹個向量,其順序如下
為了驗證這壹點,同樣做壹個小測試
從結果中可以看到, title 是高四位, middle 是中間位, endle 是低兩位,與上述吻合
有壹點需要註意,這裏是 packed 不是定義包的那個 package ,並且順序不能搞錯,壹定是 struct packed ,而不是 packed struct
像上面例子中定義的結構體,可以改為 struct packed singed 便是有符號的壓縮結構體
本文主要參考《SystemVerilog硬件設計及建模》