Packed và unpacked: cùng số bit chưa phải cùng cách đánh chỉ số

Khoảng 40 phútMức 1/3Bản nháp: một số khẳng định chưa đối chiếu spec

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ữ.

Thí nghiệm packed-unpacked

Kỳ vọng tính trước chạy: 256 rawbyte, desc 0 low/1 high,asc 0 high/1 low;outer 2 element 4 bit,total 8;unpackedX/Zpreserved.

tb_layout.sv testbench
module tb_layout;  logic[1:0][3:0] descending;  logic[0:1][3:0] ascending;  logic[3:0] words[0:1];  integer n;  initial begin    if($bits(descending)!=8||$size(descending)!=2||$bits(words[0])!=4||$size(words)!=2) $fatal(1,"array dimensions");    for(n=0;n<256;n++) begin      descending=n[7:0];ascending=n[7:0];      words[0]=descending[0];words[1]=descending[1];      if(descending[0]!==n[3:0]||descending[1]!==n[7:4]||ascending[0]!==n[7:4]||ascending[1]!==n[3:0])        $fatal(1,"packed direction n=%0d",n);      if(words[0]!==n[3:0]||words[1]!==n[7:4]) $fatal(1,"unpacked element mapping");    end    words[1]=4'b1x0z;    if(!$isunknown(words[1])||words[1]!==4'b1x0z) $fatal(1,"array element X/Z lost");    $display("LAYOUT CHECK cases=256 bits=8 outer_size=2 element_bits=4 xz_preserved=1");    $finish;  endendmodule

Đã kiểm chứng thế nào

  • Phân tích và elaborate theo LRM (pyslang 12.1.0)
  • Mô phỏng, exit 0 và output khớp kỳ vọng tính tay (Icarus Verilog 11.0, 4-state)

Output phải khớp: LAYOUT CHECK cases=256 bits=8 outer_size=2 element_bits=4 xz_preserved=1

Chỉ fixed array/index/value mapping đã kiểm bằng Icarus 4-state; không claim whole-array implicit cast, host layout hoặc synthesis.

Các kiểm tra chạy lúc xây dựng nội dung (2026-11-06), không chạy trong trình duyệt. Kỳ vọng được tính tay trước khi chạy.

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

Tự kiểm tra: packed-unpacked

  1. Packed[1:0][3:0] rawb 3: element 0 và 1 là gì?
  2. Packed[0:1][3:0] rawb 3: element 0 là gì?
  3. Words là logic[3:0] words[0:1], words[0] rộng bao nhiêu?
  4. Packed[1:0][3:0] có totalbits và outer size nào?
  5. Logic element nhận 1x0z trong Icarus giữ gì?

Đọ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

  1. 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.
  2. 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.
  3. 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.
  4. 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ở).
  5. 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.
  6. 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.
  7. 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.