Case decode: full coverage không phải lời hứa one-hot
Tiên quyết
- Module A7: Hành vi & ngữ nghĩa mô phỏng: Đang tải
- Module A5: FSM: Đang tải
- Latch inference: đường không gán cũng mô tả phần cứng: Đang tải
Sau bài này bạn sẽ
- Phân biệt exact match, wildcard và priority khi nhiều lựa chọn có thể khớp
- Kiểm điều kiện one-hot trước khi thay priority bằng parallel logic
- Đọc default và unique như hợp đồng cần kiểm, không phải phép sửa input
Một bảng decode cần cả miền input hợp lệ
Một decoder chỉ được dùng với request one-hot khác với decoder phải xử lý mọi tổ hợp request. Nếu bỏ qua điều kiện ấy, đổi priority logic sang OR các nhánh có thể cho kết quả khác ngay trên input 11. Bài kiểm cả 16 selector 4-state và một điều kiện one-hot-or-zero rất nhỏ có thể liệt kê tay.
Plain case so khớp đủ bốn trạng thái
Plain case của ví dụ liệt kê 00/01/10/11; mọi selector có X/Z rơi vào default 3. Default này là giá trị chức năng của mô hình, không tự báo lỗi input. Một default khác có thể phù hợp yêu cầu khác, nhưng phải được nêu rõ. Không biến X/Z trong case item thành wildcard nếu đang dùng plain case. [1]
Casez và casex có thể làm mất dấu unknown
Casez bỏ qua Z/dấu hỏi; casex còn bỏ qua X, kể cả trong selector. Với item 1?, bit thấp chứa X cũng có thể được che bởi dấu hỏi của item. Vì vậy câu “casez luôn để X rơi về default” không đúng cho mọi pattern. TB tính expected từ nhãn 0/1/X/Z của từng bit rồi so output, tránh lấy chính output decoder làm oracle.
One-hot là tiền điều kiện cần có bằng chứng
Trong 00/01/10, priority decode và parallel OR của ví dụ cùng cho 0/1/2. Nhưng 11 cho priority 2 và parallel 3. Nếu contract yêu cầu ưu tiên bit cao, OR song song đã sai; nếu contract chỉ cho phép one-hot, vẫn cần kiểm producer giữ điều kiện đó. Đừng tự gắn assumption rồi xóa input vi phạm khỏi verification mà chưa có yêu cầu.
Full, parallel và unique không tự tạo phần cứng đúng
“Đã gán đủ mọi đường” và “các nhánh loại trừ nhau” là hai thuộc tính khác nhau. Default giúp định nghĩa đường không match, nhưng không chứng minh one-hot. Các keyword/pragmas như unique, full_case hay parallel_case có thể thay đổi kiểm tra hoặc assumption tối ưu tùy flow; bài không thử chúng và không dùng như cách bỏ warning. Nếu sử dụng, phải đối chiếu ngôn ngữ/tool và kiểm cả input vi phạm. [2]
16 selector và một phản ví dụ 11
Tính trước chạy: ba selector one-hot-or-zero cùng kết quả; req 11 priority 2/parallel 3. Exact default 3 cho các mã chứa X/Z; wildcard được kiểm cho mọi cặp bốn trạng thái.
CASEX là warning dự kiến của module cố ý minh họa rủi ro. Generic synthesis kiểm không FF/latch; không dùng nó để chứng minh hardware có thể phát hiện điện áp unknown. [3]
Tự kiểm tra
Định nghĩa domain trước khi tối ưu decoder
Viết rõ mã hợp lệ, điều kiện chồng lấn, ưu tiên và hành vi invalid. Kiểm chúng độc lập trước khi dùng kết luận full/parallel. Bài giữ draft/LRM needs-spec-check, không claim mọi wildcard hoặc pragma synthesis.
Nguồn và mức độ đối chiếu
- Verilog case statement — bản chụp trong resources.zip, Exact và wildcard. 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.a8.case, Bằng chứng. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, case language 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.a8.case, Source/assertions/verification.json và probe ghi rõ trong bài. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, case semantics. Chưa đối chiếu với văn bản nguồn (chưa mở).
- Verilog case statement — bản chụp trong resources.zip, x and z in the case expression; casez and casex; How is a case different from if-else?. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản ex.a8.case, Source, metadata và verification.json. Trích dẫn; nguồn đã đọc toàn văn.