Casting: đổi biểu diễn khác với kiểm giá trị có được phép

Khoảng 40 phútMức 2/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 real-to-int rounding, truncation và signed extension
  • Phân biệt static enum cast với function-form $cast có kiểm membership
  • Bảo toàn destination sau checked cast thất bại và kiểm đủ miền nhỏ

Một cast có thể làm compiler im nhưng dữ liệu vẫn sai

Có 8 encoding ba bit nhưng enum chỉ định nghĩa 0/2/5. Một static cast có thể tạo 7, dù 7 không phải trạng thái được nêu. Nếu raw 7 là input lỗi, việc ép kiểu đã bỏ qua việc cần kiểm. Bài tách mục đích representation conversion khỏi domain validation.

Type cast vẫn có thể mất bit

Cú pháp type'(expression) tạo giá trị theo kiểu đích. Nibble_t4bit nhận n 0..255 giữ n modulo 16; không có tự động saturation. Signedness quyết định extension: byteff cast int là-1, còn unsigned view của byteff cast int là 255. Cast đặt đúng ý định, không thay kiểm overflow nếu contract cần báo lỗi. [1]

Int cast làm tròn, rtoi cắt về 0

Với 2.8 và-2.8, int cast lần lượt 3/-3; rtoi lần lượt 2/-2. Không suy rằng tất cả conversion sang integer đều giống thao tác truncation của C. Các giá trị bài tránh đúng điểm tie để chỉ kiểm quy tắc cần thiết; tie rounding, overflow và NaN không thuộc claim. Gán real vào integral cũng có conversion ngầm; không lặp khẳng định sai rằng mọi real→int assignment đều compile error.

Function-form cast trả trạng thái và giữ đích khi lỗi

Checked enum conversion dùng function-form $cast(destination,source) rồi kiểm return. Trong miền 0..7, chỉ 0/2/5 hợp lệ: 3 accept,5 reject. Khi reject, destination giữ member trước đó; caller phải xử lý reject, không dùng stale value như giao dịch mới. [2]

Giữ đích không đồng nghĩa có thể bỏ cờ lỗi

TB đặt checkedBUSY trước loop; sau valid 5 và invalid 6/7, checked vẫn 5. Đây là hành vi giữ đích cần được chứng minh, nhưng cũng là bẫy nếu consumer luôn đọc checked mà quên nhánh false. Kết quả 5 có thể là giao dịch cũ, không phải input 7 đã biến thànhBUSY một cách hợp lệ.

Static cast 7 không thành member mới

phase_t'(7) cho encoding 7 trong phép thử; enum vẫn chỉ có ba member. Không dùng name() của encoding ngoài miền làm hợp đồng log nếu chưa kiểm chính xác. Static cast không thêm tên, không biến next thành số học và không thay chính sách invalid-state của FSM.

Hai dạng cast và class handles có phạm vi khác

Ví dụ chỉ dùng function-form $cast vào enum. Task-form có đường báo runtime error khi thất bại và phải được test như expected failure riêng nếu dùng; class downcast còn phụ thuộc type thực của object và thuộc phần OOP. Không lấy kết quả enum 2-state ở đây để tuyên bố mọi handle/X/Z cast đã hoạt động. [3]

Ba accept, năm reject và 256 phép thu hẹp

Kỳ vọng trước chạy:±2.8→±3 với int,±2 với rtoi; signedff-1/unsign edff255; enum 3 accept/5 reject, retained 5/static 7;256 narrow cases.

Thí nghiệm casting

Kỳ vọng tính trước chạy: Real±2.8:intcast±3,rtoi±2;ffsign-1/unsigned 255. Enumvalid 0/2/5 of 8=3 accept 5 reject,failedcastgiữ 5;staticcast 7;256 narrow n%16.

tb_cast.sv testbench
module tb_cast;  typedef enum bit[2:0] {IDLE=0,BUSY=5,DONE=2} phase_t;  typedef bit[3:0] nibble_t;  phase_t checked,forced,previous;  int n,ok,accepted=0,rejected=0;  real positive=2.8,negative=-2.8;  byte signed_byte;  int sign_extended,zero_extended;  initial begin    if(int'(positive)!=3||int'(negative)!=-3||$rtoi(positive)!=2||$rtoi(negative)!=-2)      $fatal(1,"real conversion rounding/truncation");    signed_byte=8'hff;sign_extended=int'(signed_byte);zero_extended=int'($unsigned(signed_byte));    if(sign_extended!=-1||zero_extended!=255) $fatal(1,"sign conversion");    checked=BUSY;    for(n=0;n<8;n++) begin      previous=checked;ok=$cast(checked,n);      if(n==0||n==2||n==5) begin        accepted++;if(ok!=1||int'(checked)!=n) $fatal(1,"valid enum cast n=%0d",n);      end else begin        rejected++;if(ok!=0||checked!==previous) $fatal(1,"invalid cast changed destination n=%0d",n);      end    end    forced=phase_t'(7);    if(int'(forced)!=7||checked!=BUSY||accepted!=3||rejected!=5) $fatal(1,"enum cast distinction");    for(n=0;n<256;n++) if(int'(nibble_t'(n))!=n%16) $fatal(1,"cast truncation n=%0d",n);    $display("CAST REAL rounded=3/-3 truncated=2/-2 signed_ff=-1 unsigned_ff=255");    $display("CAST ENUM accepted=3 rejected=5 retained=5 forced=7 narrow_cases=256");    $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: CAST REAL rounded=3/-3 truncated=2/-2 signed_ff=-1 unsigned_ff=255CAST ENUM accepted=3 rejected=5 retained=5 forced=7 narrow_cases=256

Chỉ function-form $cast enum; không claim task error handling, class downcast, X/Z enum hoặc synthesis. Static type cast không phải validation miền enum.

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 xác định membership từ ba giá trị numeric, kiểm return lẫn destination trên mọi encoding. [4]

Tự kiểm tra

Tự kiểm tra: casting

  1. Với-2.8, int cast và rtoi lần lượt cho gì?
  2. Enum 0/2/5 nhận function-form cast mọi 0..7: số accept/reject?
  3. Checked đangBUSY 5, cast từ 7 thất bại: đích thế nào?
  4. Static phase_t cast 7 chứng minh điều gì?
  5. Cast 255 vào nibble_t4bit trả bao nhiêu?

Ghi rõ thứ gì mất và ai xử lý lỗi

Khi review cast, hỏi width/sign/state nào thay đổi, dữ liệu ngoài miền được báo hay bị cắt, và caller có kiểm success không. Thử cả valid/invalid/boundary rồi kiểm destination sau failure. Bài giữ draft/LRM needs-spec-check, không claim synthesis hoặc mọi dạng cast.

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

  1. SystemVerilog Casting — bản chụp resources.zip, Static cast. Trích dẫn; nguồn đã đọc các mục liên quan.
  2. SystemVerilog Casting — bản chụp resources.zip, Dynamic enum cast. Trích dẫn; nguồn đã đọc các mục liên quan.
  3. IEEE 1800-2023 SystemVerilog LRM, Cần đối chiếu LRM. 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.b1.casting, Bằng chứng. Trích dẫn; nguồn đã đọc toàn văn.
  5. IEEE 1800-2023 SystemVerilog LRM, casting types, assignment and conversion semantics. Chưa đối chiếu với văn bản nguồn (chưa mở).
  6. Thí nghiệm nguyên bản ex.b1.casting, Source, self-checks, metadata và verification.json. Trích dẫn; nguồn đã đọc toàn văn.
  7. IEEE 1800-2023 SystemVerilog LRM, casting type and conversion semantics. Chưa đối chiếu với văn bản nguồn (chưa mở).
  8. SystemVerilog Casting — bản chụp resources.zip, Static Casting in SystemVerilog; Dynamic Casting in SystemVerilog; $cast as a function example. Trích dẫn; nguồn đã đọc các mục liên quan.