Struct và union: gom field hay nhìn lại cùng một nhóm bit
Tiên quyết
Sau bài này bạn sẽ
- Tính layout packed struct theo thứ tự member và tổng width
- Phân biệt copy record với overlay untagged union
- Không đồng nhất packed layout với byte order của file hoặc host
Cùng tám bit có thể được đặt tên theo hai cách
Một header có tag 3 bit và length 5 bit. Nếu chỉ dùng raw[7: 0], các slice dễ bị đảo; packed struct đặt tên cho hai vùng. Packed union cho phép cùng tám bit được nhìn dưới dạng raw hoặc header. Nó không lưu hai bản dữ liệu rồi đồng bộ chúng bằng phép gán.
Member đầu là vùng significant cao
header_t khai tag trước length, nên tag chiếm bits 7..5 và length chiếm 4..0. Tổng width 8. Rawff tương ứng tag 7/length 31; đổi length thành 0 giữ tag 7 và raw thànhe 0=224. Đây là thứ tự bit của packed value, không phải lời hứa về thứ tự byte khi gửi qua bus hoặc ghi file. [1]
Record unpacked chứa cả trường khác loại
Unpacked struct không cần biến thành một packed integral vector. Ví dụ record có string label và int count; gán record_b=record_a chép giá trị các field của ví dụ. Sau đó sửa a thànhresponse/9, b vẫnrequest/7. Nếu field là class handle thì copy handle không tự deep-copy object; trường hợp đó thuộc OOP, chưa được mô phỏng ở đây.
Union chia sẻ storage giữa các view
view_t là packed untagged union của raw 8 bit và header 8 bit. Gán raw rồi đọc header thấy ngay cách chia 3+5. Gán view.header.length đổi ngay low 5 của view.raw; upper 3 giữ nguyên. Đây là reinterpretation cùng bit, khác struct chứa thêm một raw field bên cạnh header field độc lập. [2]
Packed untagged union cần các member cùng width
Hai member của ví dụ cùng 8 bit. Đừng cộng 8+8 rồi gọi union 16 bit, cũng đừng đưa field 4 bit và 8 bit vào cùng packed untagged union rồi mong tự padding theo host C. Unpacked/tagged union có các luật riêng và không nằm trong claim này; phải đối chiếu LRM thay vì kéo kết luận qua mọi dạng union.
256 raw values kiểm cả đọc view và ghi field
TB dùng n/32 làm expected tag và n modulo 32 làm expected length, khác cách DUT view chia field theo declaration. Sau đó ghi length 31-r, expected raw là q*32+31-r. Cuối n 255 cho 224. Cách kiểm hai chiều giúp bắt cả field order sai lẫn trường hợp vô tình dùng hai vùng storage riêng.
Copy struct không phải alias của biến nguồn
TB giữ copy_header trước khi sửa header.tag; copy phải vẫn đúng n. Named field giúp review, nhưng vẫn cần kiểm width/sign của từng trường. Các member bit trong ví dụ đều 2-state/unsigned; không dùng kết quả đó để kết luận struct logic sẽ giữ hay làm mất X ở mọi conversion. [3]
Từ layout 8 bit tới record copy độc lập
Expected trước chạy: 256 values, packedwidth 8, last_union224; unpackedcopy request/count 7.
Không claim synthesis, streaming/bitstream casts, tagged union hoặc serialization endianness từ test này. [4]
Tự kiểm tra
Hỏi field có storage riêng hay là một view
Dùng struct khi cần một record có nhiều field; dùng packed union khi thật sự muốn các cách diễn giải cùng bits. Vẽ ranh giới field và tính expected raw bằng số học trước khi chạy. Chỉ định riêng byte order tại biên serialization, không suy từ tên high/low.
Nguồn và mức độ đối chiếu
- SystemVerilog Structure — bản chụp resources.zip, Packed layout. Trích dẫn; nguồn đã đọc các mục liên quan.
- SystemVerilog Union — bản chụp resources.zip, Overlay. Trích dẫn; nguồn đã đọc các mục liên quan.
- IEEE 1800-2023 SystemVerilog LRM, Giới hạn đối chiếu. Chưa đối chiếu với văn bản nguồn (chưa mở).
- Thí nghiệm nguyên bản ex.b1.struct-union, Bằng chứng. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, struct-union types, assignment and conversion semantics. Chưa đối chiếu với văn bản nguồn (chưa mở).
- Thí nghiệm nguyên bản ex.b1.struct-union, Source, self-checks, metadata và verification.json. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, struct-union type and conversion semantics. Chưa đối chiếu với văn bản nguồn (chưa mở).
- SystemVerilog Structure — bản chụp resources.zip, Unpacked Structures; What is the need to typedef a structure?; Packed Structures. Trích dẫn; nguồn đã đọc các mục liên quan.
- SystemVerilog Union — bản chụp resources.zip, Union vs Struct: Shared Storage; Struct vs Union: Same Fields, Two Behaviors; Why All Packed Untagged Union Members Must Be the Same Size. Trích dẫn; nguồn đã đọc các mục liên quan.