Menu
CoddyTech

Vòng lặp vô hạn

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 61 trên 90.

Vòng lặp forever lặp lại một khối code liên tục, mãi mãi. Nó không bao giờ tự dừng.

Vòng lặp forever chạy lặp đi lặp lại không ngừng. Nó hữu ích để tạo đồng hồ và các tín hiệu liên tục khác trong testbench.

Cú pháp:

forever begin
  // Đoạn code lặp lại mãi mãi
end

Ví dụ đơn giản

forever begin
  $display("This prints forever");
end

Điều này sẽ in ra liên tục và làm mô phỏng của bạn gặp sự cố. Luôn thêm độ trễ hoặc điều kiện dừng.

Tạo xung nhịp (cách dùng phổ biến)

Cách dùng phổ biến nhất của forever là tạo xung nhịp:

initial begin
  clk = 0;
  forever begin
    #5 clk = ~clk;   // Đảo trạng thái sau mỗi 5 đơn vị thời gian
  end
end

Lệnh này tạo ra một chiếc đồng hồ chạy trong suốt quá trình mô phỏng.

Mãi mãi với disable

Bạn có thể dừng vòng lặp forever bằng câu lệnh disable:

initial begin : clock_gen   // Thêm tên ở đây
  clk = 0;
  forever begin
    #5 clk = ~clk;
  end
end
initial begin
  #100;
  disable clock_gen;   // Giờ thì cách này hoạt động rồi
end

Vòng lặp forever và các vòng lặp khác

Vòng lặpCó dừng không?Khi nào sử dụng
forCó (sau số lần lặp cố định)Khi biết trước số lần lặp
whileCó (khi điều kiện sai)Khi chưa biết điều kiện dừng
repeatCó (sau số lần lặp cố định)Khi biết trước số lần lặp
foreverKhông (không bao giờ)Tín hiệu liên tục (đồng hồ)

Quy tắc quan trọng

Quy tắcGiải thích
Phải có độ trễ#10 hoặc @(posedge clk)
Không có độ trễ, mô phỏng sẽ bị treoVòng lặp vô hạn không làm thời gian tiến lên
Dừng vòng lặp bằng disable hoặc kết thúc mô phỏng bằng $finishNếu không, mô phỏng sẽ không bao giờ kết thúc
Tốt nhất nên dùng trong testbenchKhông thể tổng hợp
challenge icon

Thử thách

Cần làm gì:

Thêm vòng lặp forever còn thiếu để tạo một đồng hồ chuyển trạng thái sau mỗi 10 đơn vị thời gian.

Tự làm thử

module forever_challenge;
  reg clk;
  
  initial begin
    clk = 0;
    // TODO: Thêm vòng lặp forever để đảo trạng thái clk sau mỗi 10 đơn vị thời gian
  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