Implication, if-else và foreach: ràng buộc quan hệ thay vì chạy lệnh gán
Tiên quyết
Sau bài này bạn sẽ
- Phân biệt implication một chiều với if-else hai nhánh
- Kiểm đủ tập nghiệm cho các biến điều kiện nhỏ
- Dùng foreach constraint và oracle riêng cho từng element
Điều kiện không phải một timeline thực thi
Choice có enabled, value và flag được solver chọn cùng nhau. If/implication trong constraint mô tả quan hệ giữa các giá trị, không phải chạy enabled trước rồi gán value sau. Đừng mang cách nghĩ về procedural if hoặc SVA temporal implication vào bài toán này.
If-else đặt yêu cầu cho cả hai nhánh
Enabled 0 yêu cầu value 0..3; enabled 1 yêu cầu value 4..7. Cả hai là một phần hợp đồng. Nếu bỏ else, phần disabled không tự mang điều kiện ngược; các constraint khác vẫn áp dụng theo cách riêng.
Value 7 yêu cầu flag 1, không phải hai điều kiện tương đương
Rule (value==7)->(flag==1) loại value 7/flag 0. Khi value khác 7, riêng rule này không cấm flag 1. Main pin cả enabled 0/value 0/flag 1 và enabled 1/value 4/flag 1 như những ca hợp lệ để bắt lỗi đảo chiều hoặc thêm equivalence ngoài ý muốn.
Foreach đặt quan hệ cho từng phần tử array
Lanes có ba element 4 bit; mỗi lanes[i] bằng value+i trong expression đã widen sang int. Đây là ba ràng buộc được xét cùng các rule khác, không phải một vòng procedural sửa array sau solver. Với value 7, các element phải 7/8/9, vẫn nằm trong 4 bit.
Tính số nghiệm của ba field điều khiển
Enabled 0 có bốn value và hai flag, được 8 cặp value/flag. Enabled 1 có value 4/5/6 với hai flag, được 6; value 7 chỉ flag 1, thêm 1. Tổng 15 cấu hình trong 32 pin; còn 17 vô nghiệm. Mỗi cấu hình hợp lệ quy định cả ba lanes, không nhân thêm số nghiệm tùy ý cho array.
Kiểm trạng thái thành công trước khi đọc lanes
Main quét hai enabled, tám value và hai flag. Return phải khớp oracle; chỉ 15 call thành công mới được kiểm các field và 45 element. Khi fail, TB không giả định array mới được sinh hoặc tiếp tục dùng dữ liệu như stimulus hợp lệ.
Đảo implication làm thay tập nghiệm
Mutation (flag==1)->(value==7) không tương đương rule gốc. Checker pinning bắt symptom conditional/implication legal set; không chữa bằng đổi expected theo những mẫu solver tình cờ trả về. Foreach cũng phải kiểm từng index, không chỉ tổng có thể triệt tiêu lỗi.
32 pin và 45 element được kiểm
Expected tính trước chạy: 15 accept/17 reject,45 lane check,giá trị lớn nhất 9. UNSATCONSTR của các pin vô nghiệm là diagnostic dự kiến; process chỉ exit 0 khi tất cả return/output/accounting đúng. Không tắt warning hoặc gọi các call return 0 là randomization success.
Tự kiểm tra
Viết bảng hợp lệ trước rồi mới chọn cú pháp
Xác định antecedent, consequent và những gì vẫn tự do theo riêng rule đó. Với if-else hãy kiểm cả hai phía; với foreach hãy kiểm shape và width từng element. Dùng pinning cho miền nhỏ và seed cho tái hiện, không suy phân phối từ 15 cấu hình đúng.
Nguồn và mức độ đối chiếu
- SystemVerilog Implication Constraint — bản chụp resources.zip, Nguồn đào tạo đã đọc theo section. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản ex.b6.implication, Bằng chứng thực nghiệm. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, Class randomization and constraint expressions. Chưa đối chiếu với văn bản nguồn (chưa mở).
- Thí nghiệm nguyên bản ex.b6.implication, Source, self-checks, verification.json và mutation probes. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, Class randomization, constraint expressions and randomization methods. Chưa đối chiếu với văn bản nguồn (chưa mở).
- SystemVerilog Implication Constraint — bản chụp resources.zip, Implication vs if-else: Two Equivalent Styles; Implication Operator; if-else Constraint. Trích dẫn; nguồn đã đọc các mục liên quan.
- SystemVerilog foreach Constraint — bản chụp resources.zip, Basic foreach Constraint. Trích dẫn; nguồn đã đọc các mục liên quan.