Logic, bit và int: đừng làm mất X trước khi checker nhìn thấy

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ẽ

  • Chọn kiểu theo miền giá trị, width và signedness thay vì tên quen thuộc
  • Dự đoán default và conversion X/Z giữa kiểu2-state/4-state
  • Bảo toàn thông tin unknown ở đường vào scoreboard trước khi so sánh

Kiểu dữ liệu là một phần của checker

DUT chưa reset và trả một bit X. Nếu monitor lập tức chép nó vào bit, checker phía sau chỉ thấy 0 và có thể chấp nhận một giao dịch hỏng. Không có phép so sánh thông minh nào khôi phục được thông tin đã mất. Bài phân biệt ba câu hỏi độc lập: có giữ X/Z không, bao nhiêu bit, và diễn giải signed hay unsigned.

Hai trạng thái và bốn trạng thái

bit, byte, shortint, int và longint là kiểu 2-state; logic và integer là 4-state trong phạm vi đang xét. Chuyển từng bit X/Z sang 2-state làm nó thành 0, không tạo báo lỗi runtime mặc định. Trong ví dụ four=01xz, bit 4 nhận 0100; integer giữ low 4 là 01xz. Logic không có nghĩa là một mức điện áp vật lý X, mà là miền giá trị của mô hình số. [1]

Width và signedness không đi cùng số trạng thái

byte 8/shortint 16/int 32/longint 64 đều signed mặc định; bit và vector logic không khai signed là unsigned. integer có 32 bit và signed. Bởi vậy byte và logic[7: 0] đều chứa tám bit nhưng khi cùng có pattern ff, mở rộng sang int lần lượt ra-1 và 255. Đừng dùng độ rộng C int của máy host để suy đoán SystemVerilog int.

Zero ban đầu không phải bằng chứng reset đúng

Biến 2-state chưa gán của TB bắt đầu 0, còn integer/logic chưa gán mangX trong mô phỏng đã kiểm. Điều đó không hứa flop thật có power-up value ấy. Nếu reset checker dùng 2-state, việc thấy 0 trước reset có thể chỉ là default hoặc conversion. Kiểm reset theo clock/contract của DUT và giữ dữ liệu quan sát ở 4-state khi unknown là lỗi cần bắt.

256 pattern và 240 pattern chứa unknown

Một nibble có bốn lựa chọn 0/1/X/Z cho mỗi bit, nên có 4^4=256 pattern. Chỉ 2^4=16 pattern hoàn toàn nhị phân;240 pattern còn lại chứaX/Z. TB dùng index base 4 để sinh giá trị và oracle độc lập chỉ đặt bit 1 cho chữ số 1. Nó kiểm bit/int nhận giá trị coerced, integer giữ nguyên low 4 và phần mở rộng 0 vì source unsigned.

Kiểm unknown trước khi đổi kiểu

Nếu interface cho phép X/Z trong giai đoạn chưa hợp lệ, monitor phải tách valid và data theo contract. Khi valid đã được chấp nhận và data bắt buộc nhị phân, kiểm unknown trên mẫu 4-state rồi mới chuyển sang transaction 2-state. Không tự sửa DUT bằng cách ép X về 0, cũng không kết luận mọi field của transaction đều cần 4-state nếu chỉ là số đếm do TB tự tạo.

Logic không tự giải quyết ownership

logic là data type; net/variable và quyền drive còn phụ thuộc declaration và ngữ cảnh port. Nó không biến hai procedural writer thành một thiết kế đúng, và không thay resolved net cho đường nhiều driver cần resolution. Quy tắc port, writer và resolution phải đối chiếu LRM/flow cụ thể; thí nghiệm này chỉ kiểm integral values, không claim bao phủ các luật ấy. [2]

Kiểm default, conversion và mở rộng dấu

Expected tính trước: 5 biến 2-state default 0; integer/logic defaultX;256 ca với 240 unknown; byteff→-1 còn unsignedff→255.

Thí nghiệm logic

Kỳ vọng tính trước chạy: 2564 state nibble;16 binary-only nên 240 cóX/Z;2 statecoerceX/Z0, integerpreserve;ffsigned-1,unsigned 255.

tb_types.sv testbench
module tb_types;  bit initial_bit;  byte initial_byte;  shortint initial_short;  int initial_int;  longint initial_long;  integer initial_integer;  logic initial_logic;  logic[3:0] four;  bit[3:0] two;  int converted;  integer preserved;  byte signed_byte;  logic[7:0] unsigned_byte;  int from_signed,from_unsigned;  integer n,k,ref_value,unknown_cases=0;  function automatic logic state4(input integer digit);    case(digit)0:state4=0;1:state4=1;2:state4=1'bx;default:state4=1'bz;endcase  endfunction  initial begin    if(initial_bit!==0||initial_byte!==0||initial_short!==0||initial_int!==0||initial_long!==0||       initial_integer!==32'bx||initial_logic!==1'bx) $fatal(1,"type defaults mismatch");    $display("TYPE DEFAULT two_state_zero=5 integer_unknown=1 logic_unknown=1");    for(n=0;n<256;n=n+1) begin      ref_value=0;      for(k=0;k<4;k=k+1) begin        four[k]=state4((n>>(2*k))&3);        if(((n>>(2*k))&3)==1) ref_value=ref_value|(1<<k);      end      two=four;converted=four;preserved=four;      if(two!==ref_value[3:0]||converted!==ref_value||preserved[3:0]!==four||preserved[31:4]!==0)        $fatal(1,"type conversion mismatch n=%0d four=%b",n,four);      if($isunknown(four)) begin        unknown_cases=unknown_cases+1;        if(!$isunknown(preserved)||$isunknown(two)||$isunknown(converted)) $fatal(1,"X/Z lost in wrong type");      end    end    signed_byte=8'hff;unsigned_byte=8'hff;    from_signed=signed_byte;from_unsigned=unsigned_byte;    if(from_signed!=-1||from_unsigned!=255||$bits(initial_byte)!=8||$bits(initial_int)!=32||unknown_cases!=240)      $fatal(1,"signedness/width coverage mismatch");    $display("TYPE CHECK cases=256 xz_cases=%0d signed_ff=%0d unsigned_ff=%0d",unknown_cases,from_signed,from_unsigned);    $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: TYPE DEFAULT two_state_zero=5 integer_unknown=1 logic_unknown=1TYPE CHECK cases=256 xz_cases=240 signed_ff=-1 unsigned_ff=255

Icarus 4-state kiểm subset integral types, không claim logic tự sửa multiple drivers hoặc reset silicon.

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.

Icarus 4-state thực thi checker trên mọi pattern. Không dùng một simulator 2-state để kết luận X đã được giữ. [3]

Tự kiểm tra

Tự kiểm tra: logic

  1. Mẫu logic 01xz được gán vào bit[3:0], kết quả nào được kiểm?
  2. Trong 256 nibble 4-state, có bao nhiêu mẫu chứa ít nhất một X/Z?
  3. byteff và logic[7:0]ff mở rộng sang int lần lượt là gì?
  4. int trong TB chưa gán có giá trị default nào trong phép thử?
  5. DUT data cần bắt unknown trước khi thành transaction 2-state, làm gì?

Chọn kiểu ở biên quan sát trước

Vẽ đường DUT signal→monitor sample→transaction→scoreboard. Đánh dấu điểm nào có thể làm mất unknown, truncate hoặc mở rộng dấu. Chọn kiểu và assertion tại đúng biên ấy; kết quả 0 sau conversion không chứng minh nguồn là 0. Bài giữ draft/LRM needs-spec-check.

Nguồn và mức độ đối chiếu

  1. SystemVerilog bit, byte and int — bản chụp resources.zip, Integral types. Trích dẫn; nguồn đã đọc các mục liên quan.
  2. IEEE 1800-2023 SystemVerilog LRM, Phạm vi chưa đối chiếu. Chưa đối chiếu với văn bản nguồn (chưa mở).
  3. Thí nghiệm nguyên bản ex.b1.logic, Source và assertions. Trích dẫn; nguồn đã đọc toàn văn.
  4. IEEE 1800-2023 SystemVerilog LRM, logic types, assignment and conversion 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.b1.logic, Source, self-checks, metadata và verification.json. Trích dẫn; nguồn đã đọc toàn văn.
  6. IEEE 1800-2023 SystemVerilog LRM, logic type and conversion semantics. Chưa đối chiếu với văn bản nguồn (chưa mở).
  7. SystemVerilog bit, byte and int — bản chụp resources.zip, 2-State Data Types; bit; byte; shortint; int; longint. Trích dẫn; nguồn đã đọc các mục liên quan.