Implication |-> và |=>: mỗi tick một attempt

Khoảng 55 phútMức 2/3Bản nháp: một số khẳng định chưa đối chiếu spec

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ụ

  1. Trong bảng sáu tick, nếu bỏ a ở tick 3 thì còn nghĩa vụ nào?
  2. Giữ nguyên trace nhưng đổi |=> thành |->: các vi phạm chuyển tới tick nào?
  3. 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

Implication và attempt

  1. Property (psel && !penable) |=> (psel && penable). psel=1, penable=0 được giữ ở 2 posedge liên tiếp (t 1, t 2) rồi psel về 0 ở t 3. Có bao nhiêu attempt FAIL?
  2. Khi antecedent sai, attempt của a |-> b được tính là gì?
  3. a đúng ở tick 1, mid đúng ở tick 2. Với (a ##1 mid) |-> gnt, gnt phải đúng ở đâu?
  4. Trong bảng hai match antecedent, cả hai property đều có một vi phạm. Chúng đã kiểm cùng một thời điểm vi phạm chưa?
  5. Trong bảng sáu tick, property (a && !b) |=> (a && b) có bốn lần thành công. Bao nhiêu nghĩa vụ consequent do antecedent true đã thành công?

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.

SVA implication-attempts

Expected tính trước chạy: IMPLICATION ATTEMPT CHECK samples=6 passes=4 failures=2 failure_mask=24 vacuous_pass=6 time_ns=60

tb.sv testbench
`timescale 1ns/1ps// Six ticks. Generic a&&!b at2/3, bnevertrue ->failures3/4(mask24),4vacuouspasses. Separate false|->false passes6.module tb_implication_attempts; bit clk=0,a=0,b=0; int tag=1,samples=0,passes=0,failures=0,failure_mask=0,vacuous_pass=0,vacuous_fail=0; always #5 clk=~clk; always @(posedge clk)samples++; A_step:assert property(@(posedge clk)(a&&!b)|=>(a&&b))passes++;else begin failures++;failure_mask|=1<<tag;end A_vacuous:assert property(@(posedge clk)1'b0|->1'b0)vacuous_pass++;else vacuous_fail++; initial begin  for(int cycle=1;cycle<=6;cycle++)begin   if(cycle>1)@(negedge clk);   tag=cycle;a=(cycle==2||cycle==3);b=0;  end  @(negedge clk);  if($time!=60||samples!=6||passes!=4||failures!=2||failure_mask!=24||vacuous_pass!=6||vacuous_fail!=0)$fatal(1,"implication attempt identity oracle");  $display("IMPLICATION ATTEMPT CHECK samples=6 passes=4 failures=2 failure_mask=24 vacuous_pass=6 time_ns=%0d",$time);$finish; endendmodule

Đã kiểm chứng thế nào

  • Phân tích và elaborate theo LRM (pyslang 12.1.0)
  • Mô phỏng, exit 0 và output khớp kỳ vọng tính tay (Verilator 5.050, 2-state)

Output phải khớp: IMPLICATION ATTEMPT CHECK samples=6 passes=4 failures=2 failure_mask=24 vacuous_pass=6 time_ns=60

Verilator 2-state; pass-action/vacuity observation belongs to this tool/configuration. Six finite attempts conclude before finish; no unbounded liveness claim.

Các kiểm tra chạy lúc xây dựng nội dung (2026-11-06), không chạy trong trình duyệt. Kỳ vọng được tính tay trước khi chạy.

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.

SVA implication-endpoints

Expected tính trước chạy: IMPLICATION ENDPOINT CHECK samples=10 starts=2 overlap_failures=1 next_failures=1 overlap_mask=64 next_mask=8 time_ns=100

tb.sv testbench
`timescale 1ns/1ps// Expected before execution: 10 samples, two antecedent endpoints (2/6).// gnt at2/7: overlap fails at6 (mask64); non-overlap fails at3 (mask8).module tb_implication_endpoints; bit clk=0,a=0,mid=0,gnt=0; int tick=1,samples=0,starts=0,over_fail=0,next_fail=0,over_mask=0,next_mask=0; always #5 clk=~clk; always @(posedge clk) begin  samples++;  if(a)starts++; end A_overlap:assert property(@(posedge clk)(a ##1 mid)|->gnt)  begin end else begin over_fail++;over_mask|=1<<tick;end A_next:assert property(@(posedge clk)(a ##1 mid)|=>gnt)  begin end else begin next_fail++;next_mask|=1<<tick;end initial begin  for(int cycle=1;cycle<=10;cycle++)begin   if(cycle>1)@(negedge clk);   tick=cycle;a=(cycle==1||cycle==5);mid=(cycle==2||cycle==6);gnt=(cycle==2||cycle==7);  end  @(negedge clk);  if($time!=100||samples!=10||starts!=2||over_fail!=1||next_fail!=1||over_mask!=64||next_mask!=8)   $fatal(1,"implication endpoint oracle");  $display("IMPLICATION ENDPOINT CHECK samples=10 starts=2 overlap_failures=1 next_failures=1 overlap_mask=64 next_mask=8 time_ns=%0d",$time);  $finish; endendmodule

Đã kiểm chứng thế nào

  • Phân tích và elaborate theo LRM (pyslang 12.1.0)
  • Mô phỏng, exit 0 và output khớp kỳ vọng tính tay (Verilator 5.050, 2-state)

Output phải khớp: IMPLICATION ENDPOINT CHECK samples=10 starts=2 overlap_failures=1 next_failures=1 overlap_mask=64 next_mask=8 time_ns=100

Two single-endpoint antecedent matches only; not a general proof for ranges, multiple antecedent matches or all SVA operators. No protocol specification.

Các kiểm tra chạy lúc xây dựng nội dung (2026-11-06), không chạy trong trình duyệt. Kỳ vọng được tính tay trước khi chạy.

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.

Implication, delay range, goto repetition và local variable

Đếm số attempt fail của 3 property với stimulus cố định; so với kết quả tính tay theo LRM.

tb_sva.sv assertion
// Kiểm ngữ nghĩa SVA với kết quả tính tay (đếm attempt fail, không đếm vacuous).// Stimulus theo cycle (đổi ở negedge, sample ở posedge). Cycle k = posedge thứ k (k=1..).//  a: 1 tại cycle 1 và 6;  b: 1 tại cycle 3;  d: 5 tại cycle 6, 0 nơi khác (d sample tại cycle 6 = 5)//  P1: a |-> ##[1:3] b      : attempt@1 thấy b@3 → pass; attempt@6: b không lên ở 7..9 → FAIL ×1//  P2: a |-> b[->1]         : attempt@1 b@3 → pass; attempt@6 không có b trước khi kết thúc mô phỏng → chưa kết luận (0 fail)//  P3: (a, v=d) |=> (d == v): attempt@1 v=0, d@2=0 → pass; attempt@6 v=5, d@7=0 → FAIL ×1module tb;  logic clk = 0, a = 0, b = 0; logic [3:0] d = 0; int f1 = 0, f2 = 0, f3 = 0;  always #5 clk = ~clk;  property p3; logic [3:0] v; @(posedge clk) (a, v = d) |=> (d == v); endproperty  A1: assert property (@(posedge clk) a |-> ##[1:3] b) else f1++;  A2: assert property (@(posedge clk) a |-> b[->1]) else f2++;  A3: assert property (p3) else f3++;  initial begin    // negedge thứ n chuẩn bị giá trị cho posedge thứ n+1; posedge 1 ở t=5 thấy giá trị khởi tạo.    // Đặt trực tiếp trước posedge tương ứng:    a = 1;                                   // posedge1 (t=5): a=1    @(negedge clk) a = 0;                    // posedge2    @(negedge clk) b = 1;                    // posedge3: b=1    @(negedge clk) b = 0;                    // posedge4    @(negedge clk);                          // posedge5    @(negedge clk) begin a = 1; d = 5; end   // posedge6    @(negedge clk) begin a = 0; d = 0; end   // posedge7    repeat (4) @(negedge clk);    $display("SVA RESULT f1=%0d f2=%0d f3=%0d (expect 1 0 1)", f1, f2, f3); $finish;  endendmodule

Đã kiểm chứng thế nào

  • Phân tích và elaborate theo LRM (pyslang 12.1.0)
  • Mô phỏng, exit 0 và output khớp kỳ vọng tính tay (Verilator 5.050, 2-state)

Output phải khớp: SVA RESULT f1=1 f2=0 f3=1

Verilator 5.050 chưa hỗ trợ intersect với operand độ dài biến đổi và within với delay range (docs/toolchain.md).

Các kiểm tra chạy lúc xây dựng nội dung (2026-11-06), không chạy trong trình duyệt. Kỳ vọng được tính tay trước khi chạy.

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ử.

Covergroup: coverpoint, bins, cross

Mô hình coverage nhỏ; tính tay coverage = trung bình (cp_k 100%, cp_w 50%, cross 50%) = 66.7%.

tb_cov.sv coverage
// Functional coverage: coverpoint, bins, cross; đọc get_coverage().module tb;  bit [1:0] kind; bit wr;  covergroup cg; cp_k: coverpoint kind { bins k[] = {[0:3]}; } cp_w: coverpoint wr; x: cross cp_k, cp_w; endgroup  cg c = new;  initial begin    for (int i = 0; i < 4; i++) begin kind = 2'(i); wr = 1; c.sample(); end    $display("C08 RESULT cov=%0.1f (LRM expect 66.7 = avg(cp_k 100, cp_w 50, cross 50))", c.get_coverage());    $finish;  endendmodule

Đã kiểm chứng thế nào

  • Phân tích và elaborate theo LRM (pyslang 12.1.0)

KHÔNG mô phỏng: Verilator 5.050 biên dịch covergroup không cảnh báo nhưng get_coverage() trả 0.0 (sai). Con số 66.7% là tính tay theo quy tắc trung bình có trọng số mặc định, chưa đối chiếu LRM.

Các kiểm tra chạy lúc xây dựng nội dung (2026-11-06), không chạy trong trình duyệt. Kỳ vọng được tính tay trước khi chạy.

[2] [3] [4] [5]

Nguồn và mức độ đối chiếu

  1. IEEE 1800-2023 SystemVerilog LRM, Clause 16. Chưa đối chiếu với văn bản nguồn (chưa mở).
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.
  7. 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ở).
  8. 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ở).
  9. IEEE 1800-2023 SystemVerilog LRM, Clause 16 (Assertions). Chưa đối chiếu với văn bản nguồn (chưa mở).
  10. 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).
  11. 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ở).
  12. 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ở).
  13. 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.