Bộ nhân tuần tự dịch-cộng 8×8 với bắt tay start/done
Module cần viết: seq_mult · 7 case (2 mẫu) · giới hạn 4 s/case · ~35 phút
Bộ nhân tổ hợp 8×8 tốn nhiều diện tích. Bộ nhân tuần tự chỉ dùng một bộ cộng, đổi lại mất nhiều chu kỳ: mỗi chu kỳ xử lý một bit của số nhân. Bài này luyện cách ghép datapath với điều khiển và giao thức bắt tay start/done, một khuôn mẫu gặp ở mọi khối tính toán nhiều chu kỳ.
module seq_mult (
input logic clk,
input logic rst, // reset ĐỒNG BỘ, tích cực mức cao: busy = 0, done = 0, p = 0
input logic start, // yêu cầu nhân a × b (chỉ được nhận khi không busy)
input logic [7:0] a, b, // không dấu; chỉ cần đúng tại chu kỳ start được nhận
output logic busy,
output logic done, // xung 1 chu kỳ khi có kết quả
output logic [15:0] p // a × b; giữ nguyên cho tới khi phép nhân kế tiếp được nhận
);
Thời gian (mọi tín hiệu đổi ngay sau sườn lên):
- Sườn lên E₀ thấy
start = 1vàbusy = 0: nhận phép nhân,busy = 1. busy = 1đúng 8 chu kỳ. Tại sườn E₈:busy = 0,done = 1,p = a × b.donechỉ cao 1 chu kỳ.pgiữ giá trị cho tới khi phép nhân kế tiếp được nhận.startkhibusy = 1bị bỏ qua.
| sườn | E₀ (start) | E₁ … E₇ | E₈ | E₉ |
|---|---|---|---|---|
| busy sau sườn | 1 | 1 | 0 | 0 |
| done sau sườn | 0 | 0 | 1 | 0 |
Testbench đổi đầu vào ở sườn xuống clk và đọc ngõ ra ở sườn xuống kế tiếp. Trong lúc busy, testbench có thể đổi a, b bất kỳ.
Các case
- 3 × 5mẫu
- 255 × 255 và 0 × 77mẫu
Cùng 5 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à 3 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.