Streaming: đảo byte khác đảo bit và khác shift

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

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.

Thí nghiệm streaming

Kỳ vọng tính trước chạy: 65536 binary 16 bit;sample 1234 byte 3412,bitrev 2 c 48;unpack 12/34. Equalwidthonly.

tb_stream.sv testbench
module tb_stream;  bit[15:0] raw,byte_swap,bit_reverse,reference_bits,forward_stream;  bit[7:0] high_byte,low_byte;  int n,k;  initial begin    for(n=0;n<65536;n++) begin      raw=16'(n);byte_swap={<<8{raw}};bit_reverse={<<{raw}};forward_stream={>>{raw}};      reference_bits=0;      for(k=0;k<16;k++)if((n/(2**k))%2)reference_bits[15-k]=1;      if(byte_swap!==16'((n%256)*256+n/256)||bit_reverse!==reference_bits||forward_stream!==raw)        $fatal(1,"stream direction/slice n=%0d",n);      {>>{high_byte,low_byte}}=raw;      if(int'(high_byte)!=n/256||int'(low_byte)!=n%256) $fatal(1,"stream unpack bytes n=%0d",n);    end    raw=16'h1234;byte_swap={<<8{raw}};bit_reverse={<<{raw}};    if(byte_swap!==16'h3412||bit_reverse!==16'h2c48) $fatal(1,"stream named sample");    $display("STREAM CHECK cases=65536 sample=1234 byte_swap=3412 bit_reverse=2c48 unpack=12/34");    $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 (Verilator 5.050, 2-state)

Output phải khớp: STREAM CHECK cases=65536 sample=1234 byte_swap=3412 bit_reverse=2c48 unpack=12/34

Chỉ 65536 binary fixed 16 bit/equal-width, byte-swap/bit-reverse/forward/unpack. Không claim X/Z, unequal/dynamic widths, padding/partial slice, synthesis hoặc protocol byteorder.

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.

Chỉ binary fixed 16 bit, không claim X/Z propagation, synthesis hoặc protocol cụ thể. [2]

Tự kiểm tra

Tự kiểm tra: streaming

  1. Raw 1234 left-stream slice 8 bit cho gì?
  2. Raw 1234 left-stream không slice size cho gì?
  3. Right-stream unpack raw 1234 vào high/lowbyte cho gì?
  4. Vét cạn mọi binary 16 bit có bao nhiêu giá trị?
  5. Các test streaming bài này chứng minh phạm vi nào?

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

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