25 / 63 · Thực hành
Thực hành: kiểm tra toàn bộ MUX và phân tích đầu ra được lưu
Áp cùng đầu vào vào đường tổ hợp và đường thanh ghi; kiểm tra bằng bảng chân trị và thời điểm lấy mẫu.
Bài học miễn phí. Đăng ký để lưu tiến độ học tập.
Đối tượng và điều kiện quan sát
sel=0 thì y=a, sel=1 thì y=b. sampled_y lưu y tại cạnh lênCạnh lên Khoảnh khắc clock chuyển 0 sang 1, khác với mức cao chỉ cả khoảng CLK=1. Tìm hiểu thêm. Dù đầu vào đổi, sampled_y giữ tới cạnh lên kế tiếp.
Trước khi bắt đầu
Chuẩn bị dự án Desktop của Digital Design Studio và quyền chạy bình thường. Lưu mỗi ví dụ vào rtl/top.sv trong thư mục riêng.
Trước tiên tạo a và b khác nhau. Xác nhận sel=0 xuất a, sel=1 xuất b, rồi đối chiếu từng hàng của tệp đầu vào.
y = sel ? b : a
Mã nguồn SystemVerilog
module top (
input logic clk,
input logic a,
input logic b,
input logic sel,
output logic y,
output logic sampled_y
);
assign y = sel ? b : a;
// Explicit observation register: y remains purely combinational.
// The register makes this design eligible for logic-netlist-1 simulation.
always_ff @(posedge clk) sampled_y <= y;
endmoduleCách chạy
Trong New analysis chọn Two-state single-clock v1. Clock port là clk, chu kỳ 1000ps. Dùng thiết lập dưới để Preflight, rồi Run RTL simulation và so sánh kết quả.
| Thiết lập | Giá trị |
|---|---|
| Giá trị thanh ghi đầu (từ LSB) | [false] |
| Reset port | Để trống |
| Maximum cycles / time | 8 / 8000ps |
Mỗi cột là một mục trong tệp đầu vào dưới. y tổ hợp kỳ vọng là 0,0,0,1,1,0,1,1. Hình chỉ dự đoán chức năng theo thứ tự đầu vào, không chứa thời điểm cập nhật sampled_y.
Xem dữ liệu dạng sóng
| Tín hiệu | Dạng sóng | Giá trị bus |
|---|---|---|
| a | 0...1... | |
| b | 0.1.0.1. | |
| sel | 01010101 | |
| y expected | 0..1.01. |
Kích thích đầu vào
[
{
"inputs": {
"a": [
false
],
"b": [
false
],
"sel": [
false
]
}
},
{
"inputs": {
"a": [
false
],
"b": [
false
],
"sel": [
true
]
}
},
{
"inputs": {
"a": [
false
],
"b": [
true
],
"sel": [
false
]
}
},
{
"inputs": {
"a": [
false
],
"b": [
true
],
"sel": [
true
]
}
},
{
"inputs": {
"a": [
true
],
"b": [
false
],
"sel": [
false
]
}
},
{
"inputs": {
"a": [
true
],
"b": [
false
],
"sel": [
true
]
}
},
{
"inputs": {
"a": [
true
],
"b": [
true
],
"sel": [
false
]
}
},
{
"inputs": {
"a": [
true
],
"b": [
true
],
"sel": [
true
]
}
}
]So sánh kết quả
8 cycles · y=1 · sampled_y=1. Kiểm tra tại 3000ps, y=1 và sampled_y=0.
Thực hành dùng RTL 0/1 một clock, không bao gồm testbench #delay, initial hoặc X/Z. Dấu hoàn tất bài học là hồ sơ học tập, không phải kết quả mô phỏng thực.
Viết kết quả kỳ vọng trước
Trước khi chạy mô phỏng, tự tính đầu ra tổ hợp theo thứ tự trên. Chuỗi kỳ vọng là , đã kiểm tra đủ tám tổ hợp, mạnh hơn chỉ khớp một giá trị cuối.
Đầu ra thanh ghiThanh ghi Mạch lưu trạng thái nhiều bit. Thanh ghi đồng bộ trong khóa học lưu đầu vào đã quy định tại cạnh clock. Tìm hiểu thêm cập nhật tại cạnh lên, không tại lúc kích thích đổi. Ghi riêng đầu ra tổ hợp trước cạnh và đầu ra thanh ghi sau cạnh.
Ở đây dùng đầu vào lấy tại cạnh thứ để định nghĩa trạng thái sau cạnh . sampled_y là trạng thái đó. Dù cùng tọa độ thời gian, vẫn phải xác nhận thứ tự sự kiện áp đầu vào và cập nhật thanh ghi.
Ba phép kiểm tra phân biệt lỗi
- Đảo lựa chọn: trước khi sửa thành
sel ? a : b, dự đoán vector đầu tiên sẽ sai. Vector không phát hiện lỗi này. - Nhầm điểm quan sát: giải thích vì sao so ngay
ykỳ vọng tổ hợp vớisampled_ycó thể khiến mạch đúng trông như sai. - Kiểm tra giữ đầu vào: chỉ đổi đầu vào không được chọn, xác nhận giữ; đổi đầu vào được chọn thì phải theo.
Báo cáo lỗi ghi từng đầu vào, thời điểm quan sát, kỳ vọng và thực tế. Chỉ ghi “dạng sóng lạ” không phân biệt được lỗi chọn với trễ một chu kỳ.
Bài mở rộng
Mở dữ liệu thành bốn bit thì không gian tổ hợp là trường hợp, vẫn kiểm tra toàn bộ được. Trước hết dùng 0, lớn nhất, 0101, 1010 và walking-one để nhanh chóng lộ lỗi vị trí bit. Cũng cập nhật thiết lập và tệp đầu vào cùng thay đổi độ rộng.
Tự thử
Sau khi lưu giá trị ứng với tại cạnh lên, chỉ đổi thành 1 trước cạnh sau. Tìm sau trễ logic và sampled_y trước, sau cạnh lên kế tiếp.
Đọc giải thích
Đầu ra tổ hợp . sampled_y giữ 0 trước cạnh lên kế tiếp rồi lưu 1 tại cạnh đó. So sánh giả định đầu vào ổn định đủ thời gian lấy mẫu.