Menu
CoddyTech

使用系统任务

本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 77 课,共 90 课。

系统任务是 Verilog 中内置的命令,以美元符号($)开头。它们可以执行一些实用功能,例如打印消息、结束仿真和创建波形文件。

我们已经在之前的课中介绍过 $display、$monitor、$dumpfile 和 $dumpvars。在这节课中,我们将了解一些在测试平台中很有用的其他系统任务。

其他系统任务

系统任务用途
$time返回当前仿真时间
$finish结束仿真
$stop暂停仿真
$random生成随机数

$time

返回当前仿真时间。可用于跟踪事件发生的时间。

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

$finish

结束仿真。始终在测试平台的末尾使用。

$finish;

$stop

暂停仿真。可以使用仿真器命令恢复。调试时很有用。

$stop;

$random

生成一个随机数。可用于生成随机测试激励。

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

使用多个系统任务的示例

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

挑战

在这个测试平台中添加缺失的系统任务。

要做什么:

  1. 添加 $display,在开始时打印当前时间
  2. 添加 $display,在结束时打印当前时间
  3. 添加 $finish,结束模拟

亲手试试

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:在开始时添加 $display,显示当前时间
    // 格式:“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:在结束时添加 $display,显示当前时间
    // 格式:“End time: %0t”
    
    
    // TODO:添加 $finish
    
  end
endmodule
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

基础知识中的所有课

自己练习: Verilog 在线编译器