Unique và priority: kiểm điều kiện chọn nhánh, không sửa input giúp bạn

Khoảng 40 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ẽ

  • Tách kiểm overlap khỏi kiểm no-match và khỏi assignment coverage
  • Dự đoán tác động của else/default tới no-match check
  • Đọc violation theo simulator/option và không biến assumption thành bảo đảm

Có default không có nghĩa đã kiểm one-hot

Req 11 không phải named case item của decoder exact. Default trả 0, và unique không tự báo rằng producer đã gửi hai request cùng lúc. Nếu one-hot là yêu cầu, cần kiểm riêng yêu cầu ấy thay vì trông cậy vào tên keyword.

Ba qualifier hỏi các câu khác nhau

Unique kiểm overlap và no-match khi không có else/default; unique0 kiểm overlap nhưng cho phép no-match; priority cho phép overlap và chọn nhánh đầu, kiểm no-match khi không có else/default. Đây là contract chọn nhánh, khác câu hỏi mọi output có được gán trên mọi đường hay không. [1]

Default đáp ứng no-match nhưng không xoá overlap

Main example unique case liệt kê 01/10, có default 0. Req 00/11 đều đi default, không vi phạm no-match. Một probe đổi điều kiện thành overlap vẫn bị runtime check khi chạy với Verilator --assert dù có else. Severity/điểm báo phụ thuộc flow; không gọi mọi simulator đều phải dừng như probe này. [2]

Priority cho thứ tự có chủ ý

Ordered ưu tiên req[1] rồi req[0], có else 0. Vì thế req 11 cho 2. Decoder exact cho 0 ở cùng input. Hai hàm khác nhau theo contract; qualifier không khiến chúng thành tương đương hoặc tự sửa điều kiện đã viết sai thứ tự.

Unique0 cho phép no-match không tự gán 0

Zero_ok được gán default 0 trước unique0 if. Hai điều kiện req 1/req 2 loại trừ nhau; req 0/req 3 không vào nhánh nào nhưng output vẫn xác định nhờ assignment ban đầu. Bỏ default assignment có thể để lại đường giữ/latch; cho phép no-match không phải bảo đảm combinational completeness.

Assumption cho tối ưu phải có bằng chứng từ producer

Tool tổng hợp có thể khai thác qualifier theo flow. Nếu input vi phạm assumption, netlist có thể khác điều bạn suy từ nhánh RTL. Bài chỉ tổng hợp source main với các default rõ, kiểm không FF/latch; không đo PPA hoặc công nhận input ngoài contract luôn an toàn.

Bật check và giữ diagnostic của input sai

Pipeline Verilator dùng --assert. Probe overlap đã compile rồi runtime bị từ chối; không lọc warning hoặc thêm qualifier khác để che nó. Trong regression thật, phân loại reset/unknown và vi phạm sau reset theo contract, không vô hiệu toàn bộ check vì tutorial gọi một warning là harmless.

Bốn selector nhị phân, hai hàm khác nhau tại 11

Tính trước: unique-default 0/1/2/0; priority 0/1/2/2; unique0 với pre-default 0/1/2/0.

Thí nghiệm unique-priority

Tính trước:req00/01/10/11, exactunique+default 0/1/2/0; priority 0/1/2/2; unique 0 với defaultassignment 0/1/2/0. Không assert one-hot tự động từ unique default.

tb_qualifiers.sv testbench
`timescale 1ns/1psmodule tb_qualifiers;  logic[1:0] req;  wire[1:0] unique_default,ordered,zero_ok;  int n,ref_exact,ref_priority;  qualifiers dut(.*);  initial begin    for(n=0;n<4;n++)begin      req=2'(n);#1;      ref_exact=(n==1||n==2)?n:0;      ref_priority=(n>=2)?2:n;      if(int'(unique_default)!=ref_exact||int'(zero_ok)!=ref_exact||int'(ordered)!=ref_priority)        $fatal(1,"qualifier function mismatch req=%0d",n);    end    $display("QUALIFIER CHECK inputs=4 req11_unique_default=0 req11_priority=2 unique0_none=0");    $finish;  endendmodule
qualifiers.sv RTL
`timescale 1ns/1psmodule qualifiers(input logic[1:0] req,output logic[1:0] unique_default,ordered,zero_ok);  always_comb begin    unique case(req)      2'b01:unique_default=1;      2'b10:unique_default=2;      default:unique_default=0;    endcase  end  always_comb begin    priority if(req[1])ordered=2;    else if(req[0])ordered=1;    else ordered=0;  end  always_comb begin    zero_ok=0;    unique0 if(req==1)zero_ok=1;    else if(req==2)zero_ok=2;  endendmodule

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

  • Phân tích và elaborate theo LRM (pyslang 12.1.0)
  • Lint -Wall (Verilator 5.050)
  • Mô phỏng, exit 0 và output khớp kỳ vọng tính tay (Verilator 5.050, 2-state)
  • Tổng hợp, số cell khớp kỳ vọng (Yosys 0.70)

Output phải khớp: QUALIFIER CHECK inputs=4 req11_unique_default=0 req11_priority=2 unique0_none=0

Kỳ vọng sau tổng hợp: qualifiers: $_*DFF* = 0qualifiers: $_*DLATCH* = 0

Main chỉ binary 2 bit với default/else đầy đủ, không FF/latch. Không claim 4-state hoặc mọi tool/severity/scheduling của violation.

Probe overlap unique-if có else bị Verilator --assert runtime từ chối; đây là hành vi flow ghim, không khái quát mọi simulator đều fatal.

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 chỉ binary 2 bit; parse/lint/Verilator/generic synthesis đạt, không claim 4-state hoặc mọi scheduling rule của violation. [3]

Tự kiểm tra

Tự kiểm tra: unique-priority

  1. Req 11 trong main cho unique-default và priority là gì?
  2. Else/default có xoá overlap check của unique không?
  3. Vì sao zero_ok xác định 0 khi không match?
  4. Main qualifier TB kiểm miền nào?
  5. Trong priority if, khi cả hai điều kiện đúng thì sao?

Kiểm domain, selection và assignment riêng

Nêu input nào hợp lệ, nhánh nào thắng, no-match có được phép và output lúc ấy là gì. Keyword giúp phát hiện vi phạm đã khai, không thay constraint/monitor của producer. Bài vẫn draft/LRM needs-spec-check.

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

  1. SystemVerilog 'unique' and 'priority' if-else — bản chụp resources.zip, Qualifier checks. Trích dẫn; nguồn đã đọc các mục liên quan.
  2. chipverify_com_systemverilog_systemverilog_unique_priority_case — bản chụp resources.zip, Case và default. Trích dẫn; nguồn đã đọc các mục liên quan.
  3. Thí nghiệm nguyên bản ex.b3.unique-priority, Bằng chứng. Trích dẫn; nguồn đã đọc toàn văn.
  4. IEEE 1800-2023 SystemVerilog LRM, unique-priority procedural semantics. Chưa đối chiếu với văn bản nguồn (chưa mở).
  5. Thí nghiệm nguyên bản ex.b3.unique-priority, Source, self-checks, metadata, verification.json và mutation probes. Trích dẫn; nguồn đã đọc toàn văn.
  6. SystemVerilog 'unique' and 'priority' if-else — bản chụp resources.zip, Syntax; unique-if and unique0-if; priority-if. Trích dẫn; nguồn đã đọc các mục liên quan.
  7. chipverify_com_systemverilog_systemverilog_unique_priority_case — bản chụp resources.zip, Syntax; unique and unique0 case; priority case. Trích dẫn; nguồn đã đọc các mục liên quan.