FSM với enum: chuyển trạng thái theo hợp đồng và kiểm không làm mất X
Tiên quyết
Sau bài này bạn sẽ
- Viết next-state/output/state-register có ownership và reset rõ
- Kiểm đủ bảng chuyển của ba state hợp lệ qua interface thực
- Giữ4-state khi so output và phân biệt legal-state tests với fault recovery
Tên state giúp đọc, contract quyết định chuyển
Controller có IDLE 0, BUSY 1, DONE 2. Start chỉ làm IDLE sangBUSY; finish chỉ làm BUSY sangDONE; ack chỉ làm DONE vềIDLE. Tín hiệu cùng tên có thể mang contract khác trong thiết kế khác; đừng suy global priority từ thứ tự bit control.
State type làm encoding và nhãn dễ review
Ví dụ khai enum base logic 2 bit, gán nhãn 0/1/2 rõ. Không dùng arithmetic cộng state để giả làm trình tự giao dịch. Explicit labels thể hiện RTL encoding, nhưng synthesis vẫn có thể re-encode theo flow. Example dùng attribute riêng của Yosys để giữ binary cho cell check, không hứa mọi tool hoặc target giữ nguyên bits. [1]
Next-state và register làm hai việc khác nhau
Always_comb đặt next_state=state rồi chọn transition; always_ff lấy mẫu next_state hoặc reset đồng bộ vềIDLE. Done là decode của current state, không phải nhớ độc lập thêm một chu kỳ. Mỗi state register có một owner, output state_out là view để TB kiểm qua port.
Control không dùng trong state hiện tại phải không gây chuyển
Ở BUSY, start hoặc ack không thay điều kiện finish. Ở DONE, ack quyết định trở vềIDLE dù start/finish có giá trị nào. Vì có 3 state và 8 pattern control,24 ca normal phủ từng hàng của bảng bước đơn hợp lệ; một reset_mode khác kiểm thêm 24 ca ưu tiên reset.
Preload bằng reset và giao dịch thật
TB không force vào biến state. Muốn BUSY thì reset rồi phát start; muốn DONE thì thêm finish. Nó kiểm state/done sau từng setup trước khi áp pattern cần thử. Cách này tránh bỏ qua logic để đi tới state mà vẫn gọi là coverage.
Int cast trong checker có thể biến X thành 0
State_out là 4-state, nên checker dùng case inequality với expected 2 bit. Probe cố ý làm output ởBUSY thành X1: checker cũ castint có thể nhìn thành 1 và exit 0, còn checker mới runtime từ chối ngay lần chuyển vàoBUSY. Đây là lỗi của cách quan sát, không phải lý do đổi simulator 2-state hoặc sửa expected theo DUT.
Default recovery chưa được fault-inject không phải proof
Source có default next=IDLE, nhưng main không inject internal encoding 3/X hoặc mô hình metastability. Output-X mutation chỉ kiểm độ chặt của checker, không chứng minh mọi internal fault recovery. Dòng invalid_fault_injected=0 cố tình nhắc giới hạn ấy; không tắt warning hoặc bảo đảm enum khiến invalid state bất khả xảy ra.
48 ca bước đơn và cell count binary
Expected trước chạy: 24 normal/24 reset,12 advance/12 hold, done đúng ởDONE; generic 2 FF/0 latch với attribute đã nêu.
Icarus giữ 4-state ở interface/checker; sample sau NBA và có watchdog. Không claim formal liveness, fault recovery hay physical reset sign-off. [2]
Tự kiểm tra
Kiểm bảng chuyển và kiểm chính checker
Ghi state hợp lệ, control có ý nghĩa, reset và latency output. Dùng interface thật để setup, giữ X/Z tới phép so sánh, rồi thử một mutation làm dữ liệu quan sát sai. Một dòng PASS không đủ nếu checker đã xoá thông tin cần bắt.
Nguồn và mức độ đối chiếu
- SystemVerilog FSM Enum Modeling — bản chụp resources.zip, Enum state. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản ex.b3.fsm-enum, Bằng chứng. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, fsm-enum procedural/package semantics. Chưa đối chiếu với văn bản nguồn (chưa mở).
- Thí nghiệm nguyên bản ex.b3.fsm-enum, Source, self-checks, metadata, verification.json và mutation probes. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, fsm-enum procedural semantics. Chưa đối chiếu với văn bản nguồn (chưa mở).
- SystemVerilog FSM Enum Modeling — bản chụp resources.zip, Declaring States as an Enumerated Type; Decoding State with unique case; Casting Into the State Variable. Trích dẫn; nguồn đã đọc các mục liên quan.
- SystemVerilog always\_comb, always\_ff — bản chụp resources.zip, always_comb; always_ff. Trích dẫn; nguồn đã đọc các mục liên quan.