1、函数作用
monitor用于追踪变量的变化情况,这在实际使用中还是非常实用的。电路中的某个信号的变化可以通过monitor检测,不需要使用波形图去仔细查找。也便于准确描述某个信号的变化。
2、基本用法
module monitor;
reg a_monitor;
reg b_monitor;
initial begin
a_monitor=1;
b_monitor=0;
$monitor($realtime,,"a=%b,b=%b",a_monitor,b_monitor);
#1
a_monitor=0;
#1
b_monitor=1;
#1
a_monitor=1; b_monitor=0;
#10;
#100 a_monitor=1; b_monitor=1;
#100 a_monitor=0; b_monitor=0;
#100 a_monitor=0; b_monitor=0;
#100 a_monitor=0; b_monitor=0;
#100 a_monitor=0; b_monitor=0;
// $stop;
end
endmodule
当在$monitor调用时对多个变量进行监控,当$monitor监控的变量中任何一个发生变化时,将会打印出当前仿真时刻的值;如果$monitor监控的所有变量在某一时刻均不改变,将不会打印任何信息。
module monitor;
reg a_monitor;
reg b_monitor;
initial begin
a_monitor=1;
b_monitor=0;
$monitor($time,,"a= %b",a_monitor);
$monitor($time,,"b= %b",b_monitor);
#1
a_monitor=0;
#1
b_monitor=1;
#1
a_monitor=1; b_monitor=0;
#10;
#100 a_monitor=1; b_monitor=1;
#100 a_monitor=0; b_monitor=0;
#100 a_monitor=0; b_monitor=0;
#100 a_monitor=0; b_monitor=0;
#100 a_monitor=0; b_monitor=0;
// $stop;
end
endmodule
$monitor具有单一进程性,即monitor只会执行一次,由$monitoroff结束。同时使用两个monitor会自动关闭前面的一个。当在同一个模块中调用了两次$monitor时,最后一次的调用将会覆盖之前的所有调用。注意$stop函数先于$monitor,如果stop同时有变量变化,是不会出现在结果中的。
需要检测多个变量时使用多参数形式。使用$time和$realtime(带小数)可以将时间显示出来,用于凸显时序。
3、总结
$monitor是一个自动检测函数,可以弥补$display必须在需要显示的地方插入才能跟踪的缺点。使用$monitor可以对某些关键变量的变化起到准确描述作用。