Dễ

Enum giá trị thưa: next(), $cast và cast tĩnh không kiểm tra

Class cần viết: st_tools · cần máy chấm có SystemVerilog · 6 case (2 mẫu) · giới hạn 4 s/case · ~20 phút

enumcastingcast-checktrapinterview

Enum trong SystemVerilog không nhất thiết đánh số liên tiếp. Mã trạng thái của FSM, opcode, mã lỗi thường thưa, và đó là chỗ mọi phép "cộng 1 cho trạng thái kế" hỏng.

Kiểu enum đã cho sẵn trong starter (giữ nguyên):

typedef enum int { IDLE = 0, RD = 1, WR = 3, DONE = 6 } st_t;

Viết các hàm static của class st_tools:

Hàm Trả về
st_t step(st_t s, int k) phần tử cách s đúng k vị trí theo thứ tự khai báo, vòng tròn. k có thể âm (đi lùi) hoặc lớn hơn số phần tử.
bit try_parse(int v, ref st_t s) 1 và gán s nếu v là giá trị của một phần tử; 0 và không đổi s nếu không.
int index_of(st_t s) vị trí của s trong khai báo, đếm từ 0 (IDLE → 0, DONE → 3).
bit from_name(string n, ref st_t s) như try_parse nhưng theo tên, phân biệt hoa thường: "WR" hợp lệ, "wr" thì không.
int count_valid(int lo, int hi) số giá trị nguyên v trong [lo, hi] là giá trị hợp lệ của st_t (0 nếu lo > hi).

Ví dụ: step(RD, 1) = WR, step(DONE, 1) = IDLE, step(IDLE, -1) = DONE, try_parse(2, s) trả 0, count_valid(0, 3) = 3.

Các case

  1. step tiến 1 bướcmẫu
  2. try_parse giá trị hợp lệ và không hợp lệmẫ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à 5 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.

Đang kết nối máy chấm…
Đang nạp bản nháp…

Tab để thụt lề. Nhấn Esc rồi Tab để rời trình soạn. Bản nháp tự lưu trong trình duyệt.

Gợi ý

Mỗi gợi ý mở trước khi AC giảm 10% điểm của đề.

Lời giải và phân tích

Lịch sử nộp bài

Chưa có lượt nào.

Độ khó: Dễ. Điểm gốc 20.