Menu
CoddyTech

Khối initial

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

Verilog có hai khối thủ tục: initial (chạy một lần) và always (chạy liên tục). Bây giờ, hãy tìm hiểu về khối initial.

Khối initial là gì?

Khối initial chỉ chạy một lần khi bắt đầu mô phỏng (thời điểm 0). Khi chạy xong, khối này không chạy lại.

Nó chủ yếu được dùng trong testbench để:

  • Đặt các giá trị ban đầu
  • Tạo tín hiệu kiểm thử
  • Hiển thị thông báo
  • Bắt đầu mô phỏng

Cú pháp

initial begin
  // Các câu lệnh (statements) chạy một lần, theo thứ tự
end

Ví dụ cơ bản

initial begin
  $display("Simulation started");
  $display("This runs once");
  $finish;
end

Đầu ra:

Simulation started
This runs once

Dùng khối initial để tạo tín hiệu kiểm thử

initial begin
  a = 0;
  #10 a = 1;
  #10 a = 0;
  #10 $finish;
end

Đoạn code này thay đổi a tại các thời điểm: 0, 10 và 20.

Ban đầu và luôn luôn

 initialalways
Thực thiMột lầnLiên tục (mãi mãi)
Dùng choTestbench, khởi tạoPhần cứng (flip-flop, bộ đếm)
Có thể tổng hợp?Chỉ dùng cho giá trị ban đầu (FPGA)Có (với danh sách độ nhạy)

Ghi chú quan trọng

  • Các khối initial chủ yếu dùng để mô phỏng. Công cụ tổng hợp không thể chuyển các khoảng trễ như #10 hoặc các tác vụ như $display thành phần cứng
  • Chủ yếu dùng initial trong testbench. Trong một module thiết kế, chỉ các công cụ tổng hợp FPGA mới dùng nó, và chỉ để đặt giá trị ban đầu cho một thanh ghi hoặc bộ nhớ
  • Nếu testbench có đồng hồ chạy liên tục (ví dụ: always #5 clk = ~clk;), mô phỏng sẽ chạy mãi trừ khi bạn gọi $finish; nếu chỉ có khối initial, trình mô phỏng sẽ tự dừng khi không còn sự kiện nào, nhưng thêm $finish vẫn là một thói quen tốt
challenge icon

Thử thách

Thêm khối initial còn thiếu để đặt a thành 0, sau đó đặt a thành 1 sau 10 đơn vị thời gian.

Cần làm:

  1. Thêm initial begin và end
  2. Đặt a = 0
  3. Chờ #10
  4. Đặt a = 1
  5. Thêm $finish để kết thúc mô phỏng

Tự làm thử

module test;
  reg a;
  
  // TODO: Thêm khối lệnh initial vào đây
  // Gán a = 0
  // Chờ #10
  // Gán a = 1
  // Thêm $finish; để kết thúc mô phỏng
  
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