Altifigence Academy

17 / 37 · Thực hành

Thực hành: kiểm tra reset, quay vòng và bất biến bộ đếm

Đối chiếu từng cạnh lên với tham chiếu, tách ảnh hưởng giá trị đầu, reset và độ rộng.

Đối tượng và điều kiện quan sát

Đặt giá trị đầu 3, resetReset Điều khiển đưa trạng thái về giá trị đầu đã định. Phải quy định đồng bộ hay bất đồng bộ và ưu tiên so với các điều khiển khác. Tìm hiểu thêm 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 đầu. Sau đó đi 0, 1, 2, 3, 0. Reset bật nhưng trước cạnh clock giá trị vẫn giữ.

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.

Mã nguồn SystemVerilog

SystemVerilog
module top (
    input logic clk,
    input logic rst,
    output logic [1:0] count
);
    // Active-high synchronous reset: sampled only at the rising clock edge.
    always_ff @(posedge clk)
        if (rst) count <= 2'b00;
        else count <= count + 2'b01;
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)[true,true]
Reset portrst · Active high · 1 cycle
Maximum cycles / time5 / 5000ps

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

json
[
  {
    "inputs": {}
  },
  {
    "inputs": {}
  },
  {
    "inputs": {}
  },
  {
    "inputs": {}
  },
  {
    "inputs": {}
  }
]

Mỗi cột ghi lại quan sát tại một cạnh lên. Đầu vào là giá trị ngay trước cạnh, còn trạng thái có tên chứa after là giá trị ngay sau cập nhật. Cách căn cột thể hiện thứ tự lấy mẫu, không mô tả độ trễ lan truyềnĐộ trễ lan truyền Thời gian từ khi đầu vào đổi đến khi đầu ra ổn định ở giá trị đúng. Tương đương logic và đặc tính thời gian là hai vấn đề riêng. Tìm hiểu thêm vật lý. E0~E4 lần lượt là cạnh lên 500, 1500, 2500, 3500, 4500ps. So tất cả cột count trung gian, không chỉ cuối.

Năm cạnh lên trong thực hành
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
edge23452E0 → E1 → E2 → E3 → E4
reset10...
count before2345211 → 00 → 01 → 10 → 11
count after2345200 → 01 → 10 → 11 → 00

So sánh kết quả

5 cycles · count=00. Kiểm tra tại 500, 1500, 2500, 3500, 4500ps lần lượt 00 → 01 → 10 → 11 → 00.

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 học là hồ sơ học tập, không phải kết quả mô phỏng thực.

Tính trạng thái kỳ vọng theo từng cạnh

Giá trị 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 đầu là 3 nhưng reset ưu tiên tại cạnh lên đầu. Đừng coi khởi tạo và reset là một.

Cạnh lênrstcount trước cạnhcount sau cạnh
500ps11100
1500ps00001
2500ps00110
3500ps01011
4500ps01100

Trong khoảng không reset, mỗi cạnh phải thỏa quan hệ sau.

ck+1=(ck+1) mod 4c_{k+1}=(c_k+1)\bmod 4

Chỉ kiểm tra 00 cuối có thể cho qua mạch từng đi qua giá trị sai. Kiểm tra riêng cả chuỗi trạng thái và ưu tiên reset.

Mỗi lần chỉ đổi một điều kiện

  • Đổi giá trị đầu thành 00, chuỗi sau reset đầu vẫn giống. Qua đó kiểm tra reset không phụ thuộc giá trị đầu.
  • Đổi Reset cycles thành 2: count ở hai cạnh đầu đều phải 00, thời điểm bắt đầu tăng lùi một cạnh.
  • Mở thành ba bit thì quay vòng sau tám lần tăng. Không chỉ đổi khai báo; rà cả độ rộng hằng, mảng giá trị đầu và độ dài chạy.

Tổng quát thành modulo-10

Bộ lưu bốn bit biểu diễn 0~15, nên tăng đơn thuần không đưa 9 về 0. Cần định nghĩa hàm trạng thái kế tiếp riêng.

ck+1={0rk=10rk=0 ∧ ek=1 ∧ ck≥9ck+1rk=0 ∧ ek=1 ∧ ck<9ckrk=0 ∧ ek=0c_{k+1}=\begin{cases}0 & r_k=1\\0 & r_k=0\ \land\ e_k=1\ \land\ c_k\ge 9\\c_k+1 & r_k=0\ \land\ e_k=1\ \land\ c_k<9\\c_k & r_k=0\ \land\ e_k=0\end{cases}

Định nghĩa này đưa trạng thái không dùng 10~15 về 0 khi có enable. Có thể chọn phục hồi khác, nhưng đặc tả và mô hình kiểm chứng phải dùng cùng chính sách.

Tự thử

Với bộ đếm hai bit gốc, sau reset cạnh đầu, thực hiện mười một lần tăng không có enable. count là bao nhiêu? Tính không cần liệt kê trạng thái giữa.

Đọc giải thích

Sau reset là 0 và 11 mod 4=311\bmod4=3, nên kết quả 11. “Tổng mười một cạnh” khác “mười một lần tăng sau reset”; nếu cạnh đầu của trường hợp trước là reset thì thực chỉ tăng mười lần.

Lesson files

counter-top.sv ↓counter-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.