Systemverilog for design 筆記(四)
數組、結構體和聯合體
1. 結構體(struct)
1.1. 結構體聲明
結構體默認是變量,也可以聲明為線網
var struct { // 通過var進行結構體變量聲明
logic [31:0] a, b;
logic [ 7:0] opcode;} Instruction_Word_var;
wire struct { //結構體線網聲明,定義為線網類型時,結構體的所有成員必須都是四態類型的 logic [31:0] a, b;
logic [ 7:0] opcode;} Instruction_Word_net;
Point:結構體內不能使用線網類型。多個線網可以用SV接口打包成一個組。
Eg:自定義結構體
typedef struct { //結構體定義,不分配存儲器
logic [31:0] a, b;
logic [ 7:0] opcode;
logic [23:0] address;
} instruction_word_t;
instruction_word_t IW; // 結構體實例化時分配存儲區
自定義結構體可以在模塊,接口或者包中定義。
1.2. 結構體賦值
u 使用值列表 初始化
結構體在實例化的時候可以對其成員初始化using ’{<value>}
instruction_word_t IW = ’{100, 3, 8’hFF, 0}; //賦值a=100 b=3 opcode=FF address=0
u 結構體成員賦值
IW.a = 100; //引用結構體成員的名稱對成員進行賦值
u 將結構體表達式賦給結構體
if (!resetN) IW = ’{100, 5, 8’hFF, 0}; //同初始化的時候類似,但這是在過程塊中進行的
u 結構體表達式的默認值
IW = ’{ real:1.0, default:0, r1:3.1415 };//r1=3.1415 其他real成員=1.0 其他成員=0 (precedence:顯性成員名賦值>指定數據類型賦值>default)
1.3. 壓縮(packed)和非壓縮(unpacked)結構體(均可綜合)
默認情況下,結構體是非壓縮的。結構體成員是獨立的變量或常量。
使用packed顯示的聲明一個壓縮結構體。壓縮結構體按照指定的順序以相鄰的位來存儲結構體成員。壓縮結構體被當做一個向量存儲,結構體的第一個成員在向量的最左邊。向量的最低位是結構體最後一個成員最低位,其位編號為bit 0。如圖所示(類似小端模式):
struct packed {
logic valid; logic [ 7:0] tag; logic [31:0] data;
} data_word;
packed structure的成員可以通過成員名引用(<struct_name>.<mem_name>)也可以使用結構體向量的相應位來引用(<struct_name>[M:N])。
壓縮結構體只能包含整數。
(題外話:real和shortreal分別對應C語言的雙精度和單精度,不可被綜合,但是在抽象硬件模型和tb中有用,因此不算做整數範疇)
壓縮結構體可被看作是向量來操作。(除了’{}賦值操作是當做unpacked以外)
1.4. 通過端口傳遞結構體
要想使用結構體類型的端口,要先使用typedef定義為用戶自定義數據類型的結構體。
Unpacked struct通過模塊port傳遞時,端口兩邊連接必須是同一種類型的結構體。
在兩個不同模塊聲明的匿名結構體即便成員類型相同也不能看作同一類型結構體。
1.5. 將結構體作為自變量傳遞至task和function
要想傳遞結構體類型的自變量,要先使用typedef定義為用戶自定義數據類型的結構體。
同4.1.4,要相同類型結構體才能作為自變量傳遞給task和function
2. 聯合體(union)
聯合體只存儲一個元素,但該元素可以有多種表示方法,每種表示方法可以是不同數據類型
Union聲明及成員引用方法同struct,關鍵詞為union。
Union內的成員公用同一存儲空間。所以對其中一個成員賦值,其他成員也會相應變化,只是數據類型不同而已
2.1. 非壓縮聯合體(unpacked unions) (不可綜合)
非壓縮聯合體可以包含任意變量類型,包括real,非壓縮結構體和非壓縮數組。
2.2. 標簽聯合體(tagged unions)(沒懂啥應用價值P130)
相當於在使用時要註意讀值和上次存儲都是針對同一個union member(有啥用)
2.3. 壓縮聯合體(packed unions)(可綜合)
壓縮聯合體中每個成員位數相同,只存儲整數值。
(一般用於存signed,unsigned兩種類型,比如,當需要存signed類型時,給ele0賦值,需要存unsigned類型時,給ele1賦值)
typedef struct packed {
logic [15:0] source_address;
logic [15:0] destination_address;
logic [23:0] data;
logic [ 7:0] opcode;
} data_packet_t;
union packed {
data_packet_t packet; //壓縮結構體
logic [7:0][7:0] bytes; // 壓縮數組
} dreg;
該例中,值可以使用byte格式的數組寫入,然後以data_packet格式讀出相同的值(共享空間)
Systemverilog for design 筆記(四)