最近学习了Verliog语法种几种常用于调试和查错的系统任务以及编写实用模块时常用的编译预处理语句。
4.1 系统任务 $ monitor
任务$ monitor 有监控和输出参数列表中的表达式和变量值的功能,常在initial块中调用,每当参数列表中的变量或表达式的值改变时,整个参数列表中的变量或表达式的值都输出显示,若同时刻多个值改变,则该时刻只输出显示一次,输出格式和规则同$ display。在多模块调试时,任何时刻只能有一个$ monitor起作用。
格式:
$ monitor (p1,p2,...,pn);
$ monitor;
$ monitoron;//启动监控任务$ monitor
$ monitoroff;//关闭监控任务$ monitor
4.2 时间度量系统函数 $ time
Verliog中有2种类型的时间系统函数:$ time和$ realtime,使用它们可以得到当前的仿真时刻,输出的仿真时刻经过尺度变换输出即时间尺度的倍数。常用在$ monitor中用来做时间标记。
$ time返回一个 64位的整数 来表示以模块仿真时间尺度为基准的当前仿真时刻值。
$ realtime返回的时间数字是一个实型数,同样以时间尺度为基准
eg:模块功能:分别在16ns和32ns时设置寄存器set的值为0和1.
`timescale 10 ns/1 ns //仿真时间尺度为10ns,精度为1ns
module test;
reg set;
reg realset;
parameter p = 1.6;
initial begin
$ monitor($ time, ,"set=",set);//监控和输出仿真时间和寄存器值
$ monitor($ realtime, ,"realset=",set);// “, ,”代表一个空参数,输出显示为空格。
#p set=0;//延时1.6*10ns=16ns
#p set=1;//再延时1.6*10ns=16ns,即32ns
end
endmodule
$ time输出结果:
0 set=x