使用系统任务
本课属于 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挑战
在这个测试平台中添加缺失的系统任务。
要做什么:
- 添加
$display,在开始时打印当前时间 - 添加
$display,在结束时打印当前时间 - 添加
$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这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Verilog 在线编译器