Implication |-> và |=>: mỗi tick một attempt
Sau bài này bạn sẽ
- Theo dõi attempt từ tick khởi đầu tới endpoint và kết quả
- Tính consequent từ cuối antecedent nhiều chu kỳ
- Phân biệt non-vacuous success, vacuous success và pending
Mỗi tick mở một attempt độc lập
Một concurrent assertion có clock không chờ xong yêu cầu trước rồi mới nhận yêu cầu sau. Mỗi tick bắt đầu một attempt đánh giá property; các nghĩa vụ có thể chồng lấn.
Với (a && !b) |=> (a && b), hai mẫu bên trái đúng liên tiếp tạo hai nghĩa vụ riêng. Hãy theo dõi chúng theo tick bắt đầu. Các tín hiệu a và b ở đây là Boolean minh họa, không phải tên quy tắc của một protocol.
Theo dõi hai nghĩa vụ ở hai tick liên tiếp
Xét sáu tick: b luôn bằng 0, còn a chỉ bằng 1 ở tick 2 và 3. Property yêu cầu mẫu (a && b) ở tick kế tiếp khi mẫu (a && !b) đúng.
| Tick bắt đầu | a | b | Kết quả của attempt |
|---|---|---|---|
| 1 | 0 | 0 | Thành công vacuous ở tick 1 |
| 2 | 1 | 0 | Vi phạm ở tick 3: b bằng 0 |
| 3 | 1 | 0 | Vi phạm ở tick 4: a và b đều bằng 0 |
| 4 | 0 | 0 | Thành công vacuous ở tick 4 |
| 5 | 0 | 0 | Thành công vacuous ở tick 5 |
| 6 | 0 | 0 | Thành công vacuous ở tick 6 |
Ở tick 3, nghĩa vụ cũ vi phạm đồng thời một nghĩa vụ mới được tạo cho tick 4. Lỗi của attempt trước không tự hủy attempt sau.
Overlap tính từ cuối antecedent
Với antecedent Boolean a, a |-> b kiểm b cùng tick mà a đúng; a |=> b bắt đầu ở tick kế tiếp.
Trong (a ##1 mid) |-> gnt, a ở tick 1 và mid ở tick 2 tạo match kết thúc tại tick 2. gnt được kiểm ở tick 2; đổi sang |=> chuyển việc kiểm tới tick 3.
Antecedent dài hai tick đổi điểm đặt consequent
Giả sử a đúng ở tick 1 và 5, mid đúng ở tick 2 và 6, gnt đúng ở tick 2 và 7.
| Match antecedent | Endpoint | |-> gnt |
|=> gnt |
|---|---|---|---|
| a ở 1, mid ở 2 | 2 | Đáp ứng tại 2 | Vi phạm tại 3 |
| a ở 5, mid ở 6 | 6 | Vi phạm tại 6 | Đáp ứng tại 7 |
Cả hai cách viết đều có một vi phạm, nhưng vi phạm xảy ra ở tick khác nhau. Tổng số lỗi vì thế chưa đủ để phát hiện dùng nhầm implication.
Ví dụ này có một endpoint cho mỗi lần bắt đầu. Với range hoặc nhiều nhánh match, cần xét các endpoint liên quan trước khi đặt consequent.
Đếm pass chưa đủ chứng minh yêu cầu đã được thử
Khi antecedent không match, implication có thể thành công vacuous: không có nghĩa vụ consequent nào cần được đáp ứng từ lần đánh giá ấy.
Trong bảng sáu tick, bốn lần thành công đều thuộc tick a bằng 0. Chúng chưa chứng minh hệ thống từng đáp ứng một yêu cầu thực sự được kích hoạt.
Vacuous success cũng khác pending. Một nghĩa vụ đã bắt đầu nhưng còn chờ kết luận không trở thành thành công chỉ vì mô phỏng kết thúc.
Từ assertion tới coverage
Assertion trả lời liệu quan hệ đã viết có bị vi phạm. Muốn biết yêu cầu đã được thử chưa, cần quan sát thêm: antecedent đã match bao giờ, và có nghĩa vụ nào đã hoàn tất non-vacuous?
Nếu stimulus giữ a bằng 0 suốt test, implication có thể không báo lỗi mà chưa thử được đường đáp ứng. Hãy đặt mục tiêu coverage cho hành vi cần thấy, thay vì chỉ đếm clock hoặc số lần action chạy.
Bốn lỗi thường gặp khi đọc implication
- Tính consequent từ đầu antecedent thay vì endpoint của match.
- Gộp hai lần kích hoạt liên tiếp thành một nghĩa vụ.
- Xem mọi lần thành công là bằng chứng antecedent đã được kích hoạt.
- Chỉ so tổng lỗi, bỏ qua tick vi phạm.
Khi debug, ghi tick bắt đầu, endpoint, deadline và kết quả của từng attempt.
Tự sửa trace và tính lại nghĩa vụ
- Trong bảng sáu tick, nếu bỏ a ở tick 3 thì còn nghĩa vụ nào?
- Giữ nguyên trace nhưng đổi
|=>thành|->: các vi phạm chuyển tới tick nào? - Trong bảng endpoint, đổi cả hai property thành cùng một loại implication. Vì sao chỉ đếm một lỗi có thể bỏ sót việc đổi nhầm?
Hãy trả lời bằng từng dòng thời gian trước khi mở mã và bằng chứng phía dưới.
Kiểm tra
Bằng chứng kiểm chứng
Expected của main thứ nhất được tính từ bảng sáu tick: IMPLICATION ATTEMPT CHECK samples=6 passes=4 failures=2 failure_mask=24 vacuous_pass=6 time_ns=60. Đây là thí nghiệm có vi phạm dự kiến được tự kiểm, nên failure counter khác 0 không làm regression thất bại nếu đúng số lượng và thời điểm đã định.
Main thứ hai chạy mười tick, có thời gian drain sau deadline ở tick 7. Expected là IMPLICATION ENDPOINT CHECK samples=10 starts=2 overlap_failures=1 next_failures=1 overlap_mask=64 next_mask=8 time_ns=100.
Ví dụ cũ giữ nguyên để dữ liệu học và liên kết trước đây vẫn có ngữ cảnh. Nó kiểm cửa sổ delay, goto và local variable. f2=0 của property goto chỉ là không ghi nhận failure trước khi test dừng; không được nâng thành chứng minh rằng mọi attempt đã hoàn tất hoặc đã có positive coverage. B9 covergroup minh họa phía dưới cũng chỉ có nhãn parsed, không có bằng chứng thu functional coverage.
Giới hạn báo cáo: số lần pass action chạy là quan sát trên cấu hình Verilator đã ghi, không phải giao diện báo cáo chung của mọi simulator. Ví dụ covergroup B9 dưới đây chỉ được parse; chưa có bằng chứng thu functional coverage. Giữ nguyên các assertion sai cố ý và kỳ vọng về tick vi phạm để phát hiện checker bị tắt hoặc dùng nhầm toán tử.
Nguồn và mức độ đối chiếu
- IEEE 1800-2023 SystemVerilog LRM, Clause 16. Chưa đối chiếu với văn bản nguồn (chưa mở).
- SystemVerilog Assertions Property Implication — bản chụp resources.zip, Overlapping Implication: |->; Non-Overlapping Implication: |=>; The Overlap Point for a Multi-Cycle Antecedent. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản B8.implication-endpoints, Two multi-cycle antecedent matches and failure masks at ticks 6/3. Trích dẫn; nguồn đã đọc toàn văn.
- SystemVerilog Assertions Property Implication — bản chụp resources.zip, Vacuous Success: What Happens When the Antecedent Is False?. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản B8.implication-attempts, Six-tick attempt identity, vacuous actions and six runtime mutants across two examples. Trích dẫn; nguồn đã đọc toàn văn.
- Kết quả thực nghiệm toolchain của dự án (docs/toolchain.md), case c07_sva. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, Clause 16 — vacuous success. Chưa đối chiếu với văn bản nguồn (chưa mở).
- IEEE 1800-2023 SystemVerilog LRM, Clause 16 — implication and vacuity; chưa đối chiếu LRM. Chưa đối chiếu với văn bản nguồn (chưa mở).
- IEEE 1800-2023 SystemVerilog LRM, Clause 16 (Assertions). Chưa đối chiếu với văn bản nguồn (chưa mở).
- SystemVerilog Assertions Handbook, chưa xác định chương. Chưa đối chiếu với văn bản nguồn (mới xem thông tin xuất bản).
- IEEE 1800-2023 SystemVerilog LRM, Clause 19 (Functional coverage). Chưa đối chiếu với văn bản nguồn (chưa mở).
- IEEE 1800-2023 SystemVerilog LRM, Clause 16 — implication, antecedent endpoints and vacuity; chưa đối chiếu LRM. Chưa đối chiếu với văn bản nguồn (chưa mở).
- SystemVerilog Assertions Property Implication — bản chụp resources.zip, Vacuous Success: What Happens When the Antecedent Is False?; Overlapping Implication: |->; Non-Overlapping Implication: |=>; The Overlap Point for a Multi-Cycle Antecedent. Trích dẫn; nguồn đã đọc các mục liên quan.