Bug hunt OOP: biến che thuộc tính, static, clone và super.new
Class cần viết: pkt · cần máy chấm có SystemVerilog · 6 case (2 mẫu) · giới hạn 4 s/case · ~30 phút
Một kỹ sư mới viết hai class gói tin cho testbench. Mọi thứ biên dịch sạch, nhưng scoreboard báo lỗi khắp nơi. Starter là code gốc của họ, chứa năm bug. Sửa sao cho đúng đặc tả dưới đây; giữ nguyên tên class, tên method và danh sách đối số.
class pkt
| Thành phần | Đặc tả |
|---|---|
int id; bit [7:0] data; |
thuộc tính |
new(int id = -1, bit [7:0] data = 0) |
gán id, data từ đối số |
int total() |
số đối tượng pkt (kể cả lớp con và bản clone) đã được tạo từ đầu mô phỏng; gọi qua đối tượng nào cũng cho cùng kết quả |
pkt clone() |
trả về một đối tượng mới, cùng kiểu thực sự với đối tượng gốc, cùng giá trị mọi thuộc tính; sửa bản clone không ảnh hưởng bản gốc |
class prio_pkt extends pkt
| Thành phần | Đặc tả |
|---|---|
int prio; |
thuộc tính thêm |
new(int id = -1, bit [7:0] data = 0, int prio = 0) |
gán cả ba thuộc tính |
clone() |
như trên: bản clone là một prio_pkt, giữ cả prio, kể cả khi gọi qua một handle kiểu pkt |
Testbench gọi clone() qua handle kiểu pkt rồi $cast kết quả sang prio_pkt khi đối tượng gốc là prio_pkt.
Các case
- new gán đúng thuộc tínhmẫu
- total() đếm mọi đối tượngmẫ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.