调试用系统任务和常用编译预处理语句
用于调试和差错的系统任务,以及编写模块时的预处理语句
系统任务$monitor
提供了监控和输出参数列表中表达式或变量值的功能。参数列表中输出控制格式字符串和输出表列的规则和display一样。当启动一个带有一个或多个参数的display一样。当启动一个带有一个或多个参数的display一样。当启动一个带有一个或多个参数的monitor任务时,仿真器会建立一个处理机制,当参数列表中的变量或表达式值发生变化,整个参数列表中变量或表达式的值将输出显示。同一时刻多个参数值变化,该时刻只输出显示一次。但参数可以实$time系统函数,这样参数列表中变量或表达式的值同时发生变化的时刻可以通过标明同一时刻的多行输出显示。
$monitor($time, ,"rxd=%b txd=%b",rxd,txd); // , ,代表空参数,输出时为空格。
$monitoron 和 $monitoroff 打开关闭监控标志来控制监控任务$monitor的启动和停止,来控制任务发生。调用$monitoron启动$monitor 时,不管参数列表值是否发生变化,总是立刻输出显示当前时刻参数列表中的值,用于初始化。默认仿真开始就开启了。多模块调试下,许多模块都调用了$monitor ,任何时刻只能有一个起作用,需要搭配$monitoron $monitoroff使用,将需要监控的模块打开,监视完毕关闭。
$time时间度量系统函数
- 系统函数$time,返回一个64位的整数表示当前仿真时刻。时刻以模块仿真时间尺度为基准
`timescale 10ns/1ns
module test; // 想再16ns时设置set为0,32ns设置set为1
reg set;
parameter p=1.6;
initial
begin
$monitor($time,,"set=",set);
#p set=0; // 延迟p个时间单位,一个时间尺度10ns,总是输出时间尺度的倍数,所以时16ns
#p set=1;
end
endmodule
输出结果为: $time显示时刻受时间尺度比例影响,总是输出整数
0 set=x
2 set=0 所以再1.6和3.2取整后输出2和3
3 set=1
- $realtime系统函数,作用和上一样,只是返回一个实数型。
`timescale 10ns/1ns
module test;
reg set;
parameter p=1.55;
initial
begin
$monitor($realtime,,"set=",set);
#p set=0;
#p set=1;
end
endmodule
输出结果为:
0 set=x
1.6 set=0 将仿真时刻经过尺度变化后输出,不用取整。1.6个10ns,就是16ns了
3.2 set=1
$finish
$finish/ $finish(n) 退出仿真器,返回主操作系统,结束仿真。可以带参数,输出不同特征信息,默认参数为1. 0不输出任何信息,1输出当前仿真时刻和位置,2输出仿真时刻,位置和再仿真过程中所用的memory内存及CPU时间统计
$stop
暂停,仿真环境下给出一个交互式命令提示符,可以带参数 $stop(n) 0-2 越大输出信息月多
$readmemb $readmemh
从文件中读取数据到存储器。可以在仿真的任何时刻执行使用
可以读取的数据文件只能包含:空白位置(空格,换行,tab, form-feeds) ,注释,二进制(readmemb),十六进制(readmemh)的数字。数字不能包含位宽说明和格式说明。
地址指的是对存储器(memory)建模的数组的寻址指针。当数据文件被读取,每个被读取的数字都被存放到地址连续的存储器单元中,地址范围由系统任务声明语句中的起始地址和终止地址说明,每个数据的存放地址在数据文件中说明。数据文件中地址格式为 @十六进制数。允许大小写,字符@和数字之间无空白位置。系统任务遇到一个地址说明时,系统任务将该地址后面的数据存放到存储器对应地址单元中:
module test;
reg [7:0] memory [0:7]; //声明有8个8位的存储单元
integer i;
initial
begin
// 读取存储器文件 init.dat 到存储器中的给定地址
$readmemb("init.dat", memory);
//显示初始化后的存储器内容
for(i=0; i < 8; i = i + 1)
$display("Memory [%d] = %b", i, memory[i]);
end
endmodule
/*文件init.dat包含初始化数据。用@<地址>在数据文件中指定地址。地址以十六进制数说明。数据用空格符分隔。
数据可以包含x或者z。未初始化的位置缺省值为x。 名为init.dat的样本文件内容如下所示。*/
@002