FSM one-hot an toàn: tự hồi phục từ trạng thái cấm
Module cần viết: fsm_safe · 6 case (2 mẫu) · giới hạn 4 s/case · ~25 phút
Trên silicon, một hạt neutron hay một glitch nguồn có thể lật một bit của thanh ghi trạng thái. FSM one-hot vào một trạng thái cấm (hai bit 1, hoặc không bit nào), và nếu code không lường trước thì nó kẹt lại đó mãi. Ô tô, hàng không và vũ trụ đòi hỏi FSM an toàn: mọi trạng thái cấm tự quay về trạng thái đã biết. Bài này có một cổng "nạp trạng thái" (như chuỗi scan khi test) để testbench đưa FSM vào trạng thái bất kỳ.
module fsm_safe (
input logic clk,
input logic rst_n, // reset bất đồng bộ: st = IDLE
input logic start, stall, finish,
input logic load, // nạp st = load_val ở sườn lên (ưu tiên cao nhất, giá trị bất kỳ)
input logic [3:0] load_val,
output logic [3:0] st // thanh ghi trạng thái one-hot
);
| Trạng thái | Mã | Chuyển (ở sườn lên, khi load = 0) |
|---|---|---|
| IDLE | 0001 | start → RUN |
| RUN | 0010 | stall → WAIT; ngược lại finish → DONE |
| WAIT | 0100 | !stall → RUN |
| DONE | 1000 | → IDLE |
| mọi giá trị khác | → IDLE ở sườn kế tiếp |
Không có điều kiện nào thì giữ nguyên trạng thái hợp lệ. Testbench đặt tín hiệu và đọc st ở sườn xuống.
Các case
- Một vòng IDLE → RUN → DONE → IDLEmẫu
- RUN ⇄ WAIT theo stallmẫu
Cùng 4 case ẩn kiểm các yêu cầu còn lại của đề. Case ẩn chỉ báo đúng/sai, không nói chi tiết: tự tìm chỗ sai từ đề, hoặc mở gợi ý.
Testbench có mô hình tham chiếu riêng, độc lập với lời giải mẫu. Lời giải mẫu đã chạy qua mọi case trên simulator thật, và 4 bản lỗi mẫu đều bị ít nhất một case bắt. Case mẫu sai sẽ cho biết chỗ sai đầu tiên (giá trị mong đợi so với giá trị nhận được); case ẩn chỉ báo đúng/sai.