Soft, inline và mode: mặc định khác với luật bắt buộc
Tiên quyết
Sau bài này bạn sẽ
- Phân biệt hard constraint, soft default và inline pin
- Khôi phục đúng rand_mode và constraint_mode sau một tình huống thử
- Theo dõi phạm vi chia sẻ mode của static constraint giữa các object
Một mặc định hữu ích vẫn phải cho phép thử biên
Giả sử một field value 3 bit chỉ hợp lệ từ 0 đến 5. Test thông thường muốn sinh từ 3 đến 5, nhưng test biên muốn pin 0. Nếu cả hai yêu cầu đều viết thành hard constraint, pin 0 sẽ làm bài toán vô nghiệm.
Soft default biểu đạt lựa chọn mặc định có thể nhường khi xung đột; hard limit biểu đạt miền phải giữ. Thiết kế hai loại yêu cầu riêng giúp một test đặc biệt chọn 0 mà không vô tình mở cả những giá trị 6 và 7 ngoài miền hợp lệ.
Soft áp dụng cho expression được đánh dấu
SoftDefault có hard rule value<=5 và một block khác chứa soft value>=3. Không có xung đột, call bình thường trong thí nghiệm phải cho value từ 3 đến 5. Có inline pin bằng 0, phần soft nhường, còn hard limit vẫn giữ.
Đừng gọi cả block là “soft” nếu trong đó có expression không có từ khóa soft. Chẳng hạn một cận trên hard không tự trở thành mặc định mềm chỉ vì đứng cạnh một expression soft. Trong bài, việc tách hai block còn giúp các phép bật/tắt mode có tên rõ ràng.
Inline bổ sung điều kiện, không thay hard rule
Một call randomize() with {value==local::pin;} thêm điều kiện tại chỗ. local::pin chỉ rõ biến của scope gọi, giúp tránh nhầm biến ngoài class với member cùng tên. Với HardDefault, pin 0 vẫn xung đột cận dưới hard bằng 3; call thất bại.
Vét đủ tám pin 0 đến 7 cho hai class: SoftDefault nhận 6 giá trị 0 đến 5, HardDefault nhận 3 giá trị 3 đến 5. Tổng 9 accept và 7 reject trong 16 call. Inline pin 6 hoặc 7 không thể thắng cận trên hard của bất kỳ class nào.
Rand_mode tắt việc đổi field, không tắt constraint
Sau khi gán value bằng 6, test gọi value.rand_mode(0). Field không còn được chọn lại khi randomize, nhưng hard rule value nhỏ hơn hoặc bằng 5 vẫn đang bật. Bài toán phải thất bại; chỉ giữ một field cố định không làm nó tự hợp lệ.
Đây là một lỗi thực tế khi giữ một phần transaction rồi randomize phần còn lại. Hãy kiểm cả giá trị đang giữ và mọi constraint vẫn tham chiếu nó. Không gán ý nghĩa “khỏi kiểm field này” cho rand_mode.
Bật/tắt một rule có phạm vi rõ và khôi phục sau đó
Test tiếp tục tắt riêng hard_limit bằng constraint_mode(0). Value đang giữ là 6, phù hợp soft rule value lớn hơn hoặc bằng 3, nên randomize có thể thành công và giữ nguyên 6. Sau đó test bật lại hard_limit và rand_mode, rồi kiểm một call bình thường trở về miền 3 đến 5.
Khi viết test dài, một thay đổi mode bị quên khôi phục có thể làm các tình huống sau âm thầm mất rule. Hãy coi thao tác mode như một phần trạng thái phải quản lý, không phải một thiết lập một lần không cần theo dõi.
Static constraint chia sẻ mode, không chia sẻ mọi field
SharedMode có static block upper với rule value nhỏ hơn hoặc bằng 2 và block lower bình thường yêu cầu value lớn hơn hoặc bằng 1. Tắt lower của first không được tắt lower của second. Trái lại, tắt upper qua first làm mode upper của second và object late mới tạo cùng ở trạng thái tắt.
Test kiểm mode bằng query và pin value bằng 3 trên cả hai object khi upper tắt. Bật upper qua second phải khôi phục mode trên first và late; pin 3 sau đó phải thất bại. Value vẫn là property riêng của mỗi object, không phải field static chỉ vì được dùng trong static constraint.
Đừng tắt quá rộng để làm một call xanh
Nếu pin 0 hợp lệ với hard limit nhưng xung đột default, cần xem default có nên là soft. Nếu pin 6 vi phạm miền mà test vẫn phải giữ, tắt hard limit không phải cách sửa stimulus hợp lệ. Thí nghiệm bật/tắt để giải thích semantics và kiểm việc khôi phục; đó không phải khuyến nghị bỏ luật hợp lệ cho mọi test.
disable soft xử lý soft constraint; constraint_mode() bật/tắt block có tên; rand_mode() điều khiển field được randomize. Chúng không hoán đổi cho nhau. Main của bài kiểm hai mode và soft/inline; không claim đã kiểm mọi quy tắc ưu tiên giữa nhiều soft constraint kế thừa.
16 pin, 32 default và 9 phép kiểm mode
Expected tính trước chạy: 6 pin soft thành công, 3 pin hard thành công, 7 pin bị từ chối; 32 call không inline giữ default; 9 mốc kiểm mode đạt. Return code được đọc trước khi dùng các giá trị sinh ra.
Tự kiểm tra
Giữ luật bắt buộc, ghi rõ mặc định và trạng thái
Khi một call thất bại, liệt kê hard rule, soft default, inline expression và các mode đang bật. Đối chiếu chúng với giá trị của field bị giữ trước khi sửa seed. Sau một test tạm đổi mode, kiểm cả việc khôi phục và tác động lên object khác.
Nguồn và mức độ đối chiếu
- SystemVerilog Soft Constraints — bản chụp resources.zip, Example; How Is It Different From Hard Constraints?. Trích dẫn; nguồn đã đọc các mục liên quan.
- SystemVerilog Inline Constraints — bản chụp resources.zip, Inline Constraints Add To, Never Replace. Trích dẫn; nguồn đã đọc các mục liên quan.
- SystemVerilog Disable Randomization — bản chụp resources.zip, Disabling a Single Variable. Trích dẫn; nguồn đã đọc các mục liên quan.
- SystemVerilog Disable Constraints — bản chụp resources.zip, Syntax; Method; Example. Trích dẫn; nguồn đã đọc các mục liên quan.
- SystemVerilog Static Constraints — bản chụp resources.zip, Turn Off a Non-static Constraint; Turn Off a Static Constraint. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản ex.b6.soft-inline, Source, oracle và mutation. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, Constraint expressions and randomization methods. Chưa đối chiếu với văn bản nguồn (chưa mở).
- IEEE 1800-2023 SystemVerilog LRM, Constraint expressions, randomization methods and solve ordering. Chưa đối chiếu với văn bản nguồn (chưa mở).
- SystemVerilog Soft Constraints — bản chụp resources.zip, Example; How Is It Different From Hard Constraints?; Replacing an Inherited Soft Constraint With disable soft. Trích dẫn; nguồn đã đọc các mục liên quan.
- SystemVerilog Inline Constraints — bản chụp resources.zip, Basic Inline Constraint; When Inline and Class Constraints Conflict; Inline Constraints Add To, Never Replace. Trích dẫn; nguồn đã đọc các mục liên quan.
- SystemVerilog Static Constraints — bản chụp resources.zip, Syntax; Non-static Constraints; Turn Off a Non-static Constraint; Turn Off a Static Constraint. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản ex.b6.soft-inline, Source, self-checks, verification.json, mutation và capability probes. Trích dẫn; nguồn đã đọc toàn văn.