常用系统任务:
1.监控任务
2.仿真控制任务
3.文件输出任务
4.仿真时间函数
5.随机函数random
1.监控任务
监控任务$monitor作用是连续监控指定的参数,只有参数表中的参数值发生变化,参数表就在当前仿真时刻结束时显示。
其格式与$display和$write任务相同。
参数可以是$time系统函数。这样,参数列表中变量或表达式的值同时发生变化的时刻可以通过标明同一时刻的多行输出来显示。
例:对D,clk和Q的值进行监控:
$monitor("At%t, D=%d,clk=%d",$time,D,clk,"and Q is %d",Q);
输出:At24, D=x, clk=x and Q is 0;
At25, D=x, clk=x and Q is 1;
At30, D=0, clk=x and Q is 1;
$monitoroff 任务用于停止监控任务$monitor;
$monitoron 任务用于启动监控任务$monitor;
$monitor 与 $display 的不同之处还在于$monitor往往在initial块中调用,只要不调用$monitoroff, $monitor便不间断地对其所设定的信号进行监视。
2.仿真控制任务
仿真控制任务用于使仿真进程停止。该类的任务有两个:
$finish:终止仿真进程后,会把控制权返回操作系统;
$stop:终止仿真进程后,没有返回操作系统,而是返回仿真器的命令行。
两者用法相同,以$stop进行描述:
initial #500 $stop;
执行initial语句将使仿真进程在500个时间单位后停止。
3.文件输出任务
$readmemb:读取二进制格式数;
$readmemh:读取十六进制格式数;
这两个系统函数用于从文本中读取数据并将数据加载到存储器中。格式如下:
$readmemb("<数据文件名>",<存储器名>,<起始地址>,<结束地址>);
其中,起始地址和结束地址是可选项,如果没有起始地址和结束地址则存储器从其最低位开始加载数据直到最高位。如果有起始地址和结束地址则存储器从起始地址开始加载直到结束地址。
举例说明:
先定义一个有256个地址的字节存储器mem:
reg[7:0] mem [1:256];//由256个8位寄存器组成的存储器
不同的装载数据方法:
initial $readmemh("mem.data", mem);
initial $readmemh("mem.data", mem,16);
initial $readmemh("mem.data", mem,128,1);
另一种方式是把指定的数据放入指定的存储器地址单元内,即在存放数据的文本内,给相应的数据规定其存储地址,形式如下:
@<16进制形式的地址><数据>
系统任务执行时将把该数据放入指定的地址,后续读入的数据从指定地址的下一个存储单元开始向后加载。
例:@3 B
数据B会被放入存储器地址为3的单元内,后续读入的数据会从地址4开始存放。
4.仿真时间
$time:返回64位的整型时间;
$realtime:返回实型时间;
用这两个时间函数可以得到当前的仿真时刻。该时刻是以模块的仿真时间尺度timescale为基准。
`timescale 10ns/1ns
module test;
reg set;
parameter p =1.6;
initial
begin
$monitor($time, "set=", set);
#p set =0;
#p set =1;
end
endmodule
//输出结果:
0 set=x
2 set=0
3 set=1
时间尺度为10ns,精度为1ns,$time输出的时刻是时间尺度的整数倍,即输出1.6和3.2,且$time的返回值是整数,所以1.6和3.2ing过取整变为2和3.
`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
3.2 set=1
5.随机函数random
随机函数提供一种随机数机制,每次调用这个函数都可以返回一个新的随机数,格式如下:
$random %b
b>0,产生一个范围在(-b+1):(b-1)中的随机数
{$random} %b
产生一个范围在0:(b-1)中的随机数