Bộ đệm vòng tự tăng dung lượng: new[n](old) chép sai thứ tự
Class cần viết: ring · cần máy chấm có SystemVerilog · 6 case (2 mẫu) · giới hạn 4 s/case · ~30 phút
Bộ đệm vòng (ring buffer) là cấu trúc FIFO cổ điển: một mảng cố định, hai chỉ số đuổi nhau. Trong testbench, ta thường muốn nó tự lớn lên khi đầy, như queue [$], nhưng giữ được truy cập theo chỉ số O(1). Viết class ring bằng mảng động int mem[]:
| Method | Đặc tả |
|---|---|
new(int cap = 2) |
dung lượng ban đầu cap (≥ 1), rỗng |
int size() |
số phần tử đang chứa |
int capacity() |
dung lượng hiện tại |
void push(int v) |
thêm v vào cuối. Nếu đang đầy thì trước đó gấp đôi dung lượng, giữ nguyên thứ tự các phần tử |
bit pop(ref int v) |
lấy phần tử cũ nhất; rỗng thì trả 0, không đổi v |
bit peek_at(int i, ref int v) |
đọc phần tử thứ i tính từ cũ nhất (i = 0 là cũ nhất), không lấy ra; i ngoài [0, size) thì trả 0 |
Dung lượng chỉ tăng (không bao giờ co lại) và chỉ tăng khi push vào bộ đệm đầy. Ví dụ với cap = 2: push 5 lần cho dung lượng 2 → 4 → 8.
Testbench kiểm size(), capacity() và toàn bộ nội dung qua peek_at sau các chuỗi push/pop có quấn vòng.
Các case
- push và pop không quấn vòngmẫu
- Quấn vòng khi chưa đầymẫ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.