Menu
CoddyTech

Sử dụng system task

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

Tác vụ hệ thống là các lệnh có sẵn trong Verilog, bắt đầu bằng ký hiệu đô la ($). Chúng thực hiện các chức năng hữu ích như in thông báo, kết thúc mô phỏng và tạo tệp dạng sóng.

Trong các bài học trước, chúng ta đã tìm hiểu $display, $monitor, $dumpfile và $dumpvars. Trong bài học này, chúng ta sẽ tìm hiểu thêm các tác vụ hệ thống hữu ích trong testbench.

Tác vụ hệ thống bổ sung

Tác vụ hệ thốngMục đích
$timeTrả về thời gian mô phỏng hiện tại
$finishKết thúc mô phỏng
$stopTạm dừng mô phỏng
$randomTạo số ngẫu nhiên

$time

Trả về thời gian mô phỏng hiện tại. Hữu ích để theo dõi thời điểm các sự kiện xảy ra.

$display("Current time is %0t", $time);

$finish

Kết thúc mô phỏng. Luôn dùng ở cuối môi trường kiểm thử.

$finish;

$stop

Tạm dừng mô phỏng. Có thể tiếp tục bằng một lệnh của trình mô phỏng. Hữu ích khi gỡ lỗi.

$stop;

$random

Tạo một số ngẫu nhiên. Hữu ích khi tạo tín hiệu kiểm thử ngẫu nhiên.

reg [7:0] rand_value;
rand_value = $random;

Ví dụ sử dụng nhiều tác vụ hệ thống

module system_tasks_demo;
  reg [7:0] data;
  integer i;
  
  initial begin
    $display("Simulation started at time %0t", $time);
    
    for (i = 0; i < 5; i = i + 1) begin
      data = $random;
      $display("Random value %d: %b", i, data);
    end
    
    $stop;
    #10 $display("Resumed at time %0t", $time);
    
    $display("Simulation finished at time %0t", $time);
    $finish;
  end
endmodule
challenge icon

Thử thách

Thêm các tác vụ hệ thống còn thiếu vào testbench này.

Cần làm:

  1. Thêm $display để in ra thời gian hiện tại lúc bắt đầu
  2. Thêm $display để in ra thời gian hiện tại lúc kết thúc
  3. Thêm $finish để kết thúc mô phỏng

Tự làm thử

module and_gate (
  input a,
  input b,
  output c
);
  assign c = a & b;
endmodule

module testbench;
  reg a, b;
  wire c;
  
  and_gate dut (
    .a(a),
    .b(b),
    .c(c)
  );

  initial begin
    // TODO: Thêm $display để hiển thị thời gian hiện tại lúc bắt đầu
    // Định dạng: "Start time: %0t"
    
    
    $monitor("Time %0t: a=%b, b=%b, c=%b", $time, a, b, c);
    
    a = 0; b = 0; #10;
    a = 0; b = 1; #10;
    a = 1; b = 0; #10;
    a = 1; b = 1; #10;
    
    // TODO: Thêm $display để hiển thị thời gian hiện tại lúc kết thúc
    // Định dạng: "End time: %0t"
    
    
    // TODO: Thêm $finish
    
  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