Casting: đổi biểu diễn khác với kiểm giá trị có được phép
Tiên quyết
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.
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
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
- SystemVerilog Casting — bản chụp resources.zip, Static cast. Trích dẫn; nguồn đã đọc các mục liên quan.
- 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.
- 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ở).
- 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.
- 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ở).
- 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.
- 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ở).
- 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.