Menu
CoddyTech

Danh sách độ nhạy

Thuộc phần Kiến thức nền tảng trong hành trình Verilog của Coddy. Bài học 48 trên 90.

Danh sách độ nhạy cho khối lệnh always biết khi nào cần chạy. Danh sách này được viết trong dấu ngoặc đơn sau ký hiệu @.

Danh sách độ nhạy là tập hợp các tín hiệu hoặc sự kiện kích hoạt khối always. Khi bất kỳ tín hiệu nào trong danh sách thay đổi, khối lệnh sẽ chạy.

Cú pháp:

always @(sensitivity_list) begin
  // Code chạy khi các tín hiệu trong danh sách thay đổi
end

Các loại danh sách nhạy

LoạiCú phápKhi nào khối lệnh thực thi
Tất cả tín hiệu (tổ hợp)always @(*)Khi bất kỳ tín hiệu nào bên trong thay đổi
Các tín hiệu cụ thểalways @(a or b)Khi a hoặc b thay đổi
Kích hoạt theo cạnh (tuần tự)always @(posedge clk)Khi có cạnh lên của xung nhịp
Nhiều cạnhalways @(posedge clk or posedge reset)Khi có cạnh xung nhịp hoặc cạnh tín hiệu đặt lại

Phương án 1: Tất cả tín hiệu (*)

Cách an toàn và phổ biến nhất cho logic tổ hợp.

always @(*) begin
  out = a & b;   // Chạy khi a hoặc b thay đổi
end

* tự động bao gồm tất cả tín hiệu được đọc trong khối.

Tùy chọn 2: Tín hiệu cụ thể

always @(a or b) begin
  out = a & b;   // Chạy khi a hoặc b thay đổi
end

Nếu bạn quên một tín hiệu, đầu ra sẽ không cập nhật trong mô phỏng khi tín hiệu đó thay đổi, vì vậy mô phỏng không còn khớp với phần cứng đã tổng hợp.

Lựa chọn 3: Kích hoạt cạnh (posedge)

always @(posedge clk) begin
  q <= d;        // Chạy tại cạnh lên của xung nhịp
end

Dùng posedge cho cạnh lên, negedge cho cạnh xuống.

Lựa chọn 4: Nhiều cạnh

always @(posedge clk or posedge reset) begin
  if (reset)
    q <= 0;
  else
    q <= d;
end

Hoạt động ở cạnh xung clock hoặc cạnh reset.

Lỗi thường gặp

LỗiLý do sai
always @(a or b or c) nhưng lại dùng dThiếu d → đầu ra bị cũ trong mô phỏng (không khớp giữa mô phỏng và tổng hợp)
always @(posedge clk or reset)Thiếu posedge cho reset
always @(clk)Nên dùng posedge clk cho các mạch lật
challenge icon

Thử thách

Cần làm gì:

  1. Thêm danh sách độ nhạy (sensitivity list) phù hợp để flip-flop này hoạt động. Khối lệnh sẽ thực thi ở cạnh lên của clk.

Tự làm thử

module flipflop (
  input clk,
  input d,
  output reg q
);
  
  always @(______) begin
    q <= d;
  end

endmodule
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Kiến thức nền tảng

Tự luyện tập: Trình biên dịch Verilog online