Altifigence Academy

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.

Đố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.

Tự thay đổi đường được chọn

y = sel ? b : a

Mã nguồn SystemVerilog

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;
endmodule

Cá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ậpGiá trị
Giá trị thanh ghi đầu (từ LSB)[false]
Reset portĐể trống
Maximum cycles / time8 / 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.

Nhìn tám tổ hợp trong JSON đầu vào
Xem dữ liệu dạng sóng
Dữ liệu dạng sóng: mỗi ký tự là một khoảng; dấu chấm giữ trạng thái trước; p là một chu kỳ đồng hồ.
Tín hiệuDạng sóngGiá trị bus
a0...1...
b0.1.0.1.
sel01010101
y expected0..1.01.

Kích thích đầu vào

json
[
  {
    "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 yy theo thứ tự trên. Chuỗi kỳ vọng là 0,0,0,1,1,0,1,10,0,0,1,1,0,1,1, đã 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.

qk+1=sk‾ak+skbkq_{k+1}=\overline{s_k}a_k+s_kb_k

Ở đây dùng đầu vào lấy tại cạnh thứ kk để định nghĩa trạng thái sau cạnh qk+1q_{k+1}. 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

  1. Đả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 a=ba=b không phát hiện lỗi này.
  2. Nhầm điểm quan sát: giải thích vì sao so ngay y kỳ vọng tổ hợp với sampled_y có thể khiến mạch đúng trông như sai.
  3. Kiểm tra giữ đầu vào: chỉ đổi đầu vào không được chọn, xác nhận yy giữ; đổi đầu vào được chọn thì yy 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à 24+4+1=5122^{4+4+1}=512 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 a=0,b=1,s=0a=0,b=1,s=0 tại cạnh lên, chỉ đổi ss thành 1 trước cạnh sau. Tìm yy 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 y=1y=1. 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.

Lesson files

mux-top.sv ↓mux-inputs.json ↓

Lựa chọn áp dụng cho trình duyệt này. Có thể đổi ở chân trang bất cứ lúc nào.