Packed và unpacked: cùng số bit chưa phải cùng cách đánh chỉ số
Tiên quyết
Sau bài này bạn sẽ
- Đọc packed dimension trước tên và unpacked dimension sau tên
- Dự đoán ảnh hưởng chiều range tới vị trí significant
- Kiểm mapping phần tử bằng giá trị độc lập thay vì đoán từ host memory
Tám bit có thể là một vector hoặc hai phần tử
Một byte raw có thể được chia thành hai nibble packed, hoặc chép vào hai phần tử unpacked. Tổng số bit bằng nhau không làm hai kiểu tự có cùng phép gán, slice hay thứ tự index. Trước khi nhìn giá trị, viết rõ element là gì và mỗi index lấy một bit hay cả nhóm bit.
Packed dimension chia một integral value
logic[1:0][3:0] có hai nhóm, mỗi nhóm 4 bit, toàn bộ 8 bit. Index đầu chọn nhóm; index thứ hai chọn bit trong nhóm. Với rawb 3, descending[1] làb và descending[0] là 3. Các nhóm có significance theo chiều range khai báo, không theo số index luôn tăng hay luôn giảm. [1]
Đổi range ngoài thành 0..1 đổi mapping index
Với logic[0:1][3:0] và cùng rawb 3, phần tử[0] làb, phần tử[1] là 3. Giá trị packed tổng vẫnb 3. Nếu producer và consumer cùng gọi lane 0 nhưng khai range khác chiều, lỗi có thể nằm ở mapping giao diện chứ không ở phép cộng dữ liệu. TB kiểm cả hai chiều cho mọi 256 rawbyte.
Unpacked dimension tạo các element riêng
logic[3:0] words[0:1] tạo hai phần tử 4 bit. words[0] là một nibble, không phải bit 0 của toàn mảng. Ví dụ chép riêng descending[0] vào words[0] và descending[1] vào words[1]; mapping ấy là thao tác được định nghĩa rõ, không giả định whole-array cast tự đúng. [2]
Bits, size và element width trả câu hỏi khác nhau
Trong ví dụ, packed total 8 bit, outer size 2 và mỗi words element 4 bit. Không lấy size của outer dimension làm tổng bit, hoặc dùng bits(element) làm số element. Với nhiều dimension, ghi cả dimension đang hỏi khi đọc query. Các query phức tạp hơn và mọi thứ tự flatten chưa thuộc claim.
Mảng không làm mất hay thêm X một cách thần kỳ
Element words là logic 4-state nên phép gán mẫu 1x0z giữ cảX/Z trong Icarus. Nếu đổi element sang bit, domain giá trị thay đổi như B1, không phải vì chữ unpacked. Kiểm unknown trên mẫu nguyên gốc trước khi chuyển nó sang collection 2-state nếu đó là lỗi cần bắt.
Packed significance không là ABI của máy host
Bài kiểm value semantics bằng index và số học, không đọc địa chỉ RAM của simulator. Không kết luận C struct padding, endian của file hoặc thứ tự byte trên đường truyền từ packed declaration. Tại biên serialization, nêu riêng thứ tự và kiểm một mẫu có các byte khác nhau.
256 raw values và một mẫu cóX/Z
Expected trước chạy: 256 byte, packed 8 bit, outer 2, element 4; descendinglow/high khác ascendinghigh/low; mẫu 1x0z phải được giữ.
Oracle dùng hai nibble của index, không lấy view này làm expected cho view kia. [3]
Tự kiểm tra
Đọc declaration từ element và dimension
Ghi width của packed value, số phần tử unpacked, chiều index và mapping cần dùng. Hai declaration cùng tổng bit vẫn có thể không cùng type hay thao tác. Bài giữ draft/LRM needs-spec-check, không claim synthesis/host layout.
Nguồn và mức độ đối chiếu
- SystemVerilog Packed Arrays — bản chụp resources.zip, Packed arrays. Trích dẫn; nguồn đã đọc các mục liên quan.
- SystemVerilog Unpacked Arrays — bản chụp resources.zip, Unpacked arrays. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản ex.b2.packed-unpacked, Bằng chứng. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, packed-unpacked array and collection 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.b2.packed-unpacked, Source, self-checks, metadata và verification.json; probe limits. Trích dẫn; nguồn đã đọc toàn văn.
- SystemVerilog Packed Arrays — bản chụp resources.zip, Single Dimensional Packed Arrays; Multidimensional Packed Arrays. Trích dẫn; nguồn đã đọc các mục liên quan.
- SystemVerilog Unpacked Arrays — bản chụp resources.zip, Syntax; Single Dimensional Unpacked Array; Multidimensional Unpacked Array; Packed + Unpacked Array. Trích dẫn; nguồn đã đọc các mục liên quan.