Streaming: đảo byte khác đảo bit và khác shift
Tiên quyết
Sau bài này bạn sẽ
- Dự đoán streaming direction và slice size trên fixed-width data
- Kiểm pack/unpack bằng oracle số học độc lập
- Giữ equal-width contract rõ thay vì suy mọi padding/truncation rule
Byte swap không phải lật mọi bit
Raw 1234 nếu đổi thứ tự hai byte cho 3412. Nếu đảo cả 16 bit, kết quả 2 c 48. Cả hai đều có vẻ là đảo chiều nhưng là hai phép biến đổi khác nhau. Nêu rõ đơn vị slice trước khi dùng một streaming expression cho serialization.
Right stream giữ thứ tự trên ví dụ equal-width
Với {>>{raw}} gán vào biến 16 bit trong bài, giá trị giữ nguyên. Streaming operator nằm trong braces, khác toán tử dịch raw>>n. Slice/direction là cách sắp xếp bit stream, không có latency hoặc clock trong TB này. [1]
Left stream đảo thứ tự block 8 bit
{<<8{raw}} tách theo block 8 bit rồi đảo thứ tự block, giữ thứ tự bit bên trong mỗi byte. Raw 1234 thành 3412. Oracle dùng remainder 256 và quotient 256 để xây byte swap, không dùng chính streaming expression làm reference.
Không khai slice thì đơn vị là một bit
{<<{raw}} của 1234 cho 2 c 48, không phải 3412. TB xây reference bằng loop qua 16 bit của index, đặt mỗi bit vào vị trí 15-k. Dùng mẫu toàn 0 hoặc toàn 1 sẽ không phân biệt hai thuật toán; bài vét cạn 65536 giá trị nhị phân 16 bit để bắt cả những pattern khác.
Unpack fill hai byte theo thứ tự target
Streaming bên trái với high_byte rồi low_byte nhận raw 16 bit; expected high=n/256 và low=nmod 256. Với sample 1234, hai byte 12/34. Tổng width target bằng source trong mọi ca. Không lấy phép pack→unpack roundtrip làm bằng chứng duy nhất, vì hai lỗi đảo chiều giống nhau có thể tự triệt tiêu.
Expression cần context phù hợp
Trong source đã kiểm, stream được gán vào biến packed có width rõ rồi mới dùng để so sánh. Prototype đặt trực tiếp một stream không có context thích hợp trong expression so sánh bị parser chặn; sửa cấu trúc expression, giữ expected bit mapping. Không tắt parser diagnostic hoặc chọn tool khác để bỏ lỗi.
Equal-width không chứng minh mọi luật thiếu bit
Bài không thử source ngắn hơn target, slice không chia hết width, dynamic stream size hay mọi padding/truncation rule. Không kéo một tutorial khái quát thành luật đã verified cho các trường hợp ấy. Tại biên file/bus, thứ tự byte vẫn cần contract riêng; streaming expression chỉ là cách hiện thực mapping đó.
65536 raw values, hai thuật toán và unpack độc lập
Expected trước chạy: 65536ca, sample 1234→byteswap 3412/bitreverse 2 c 48, unpack 12/34.
Chỉ binary fixed 16 bit, không claim X/Z propagation, synthesis hoặc protocol cụ thể. [2]
Tự kiểm tra
Định nghĩa byte order rồi kiểm từng chiều
Tính expected từ giá trị byte/bit khác nhau, kiểm pack và unpack với reference độc lập. Viết slice size tường minh khi đổi byte; không đồng nhất streaming với shift hoặc roundtrip đẹp với chuẩn serialization.
Nguồn và mức độ đối chiếu
- SystemVerilog Streaming Operators — bản chụp resources.zip, Packing a stream. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản ex.b2.streaming, Bằng chứng. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, streaming 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.streaming, Source, self-checks, metadata và verification.json; probe limits. Trích dẫn; nguồn đã đọc toàn văn.
- SystemVerilog Streaming Operators — bản chụp resources.zip, Packing Values Into a Stream; Unpacking a Stream Back Into Variables. Trích dẫn; nguồn đã đọc các mục liên quan.