虚拟机:VMware-workstation-full-14.0.0.24051
 环 境:ubuntu 18.04.1
 应用工具:VCS(verilog compiled simulator,编译型代码仿真器)
文章目录
一、学习内容(上)

二、系统任务
(1)监控任务
监控任务$monitor作用是连续监控指定的参数,只要参数表中的参数值发生变化,参数表就在当前仿真时刻结束时显示。其格式与$display和$write任务相同。参数可以是$time系统函数。这样,参数列表中变量或表达式的值同时发生变化的时刻可以通过标明同一时刻的多行输出来显示。
//例对D、Clk和Q的值进行监控
$monitor (“At%t, D=%d, Clk=%d”, $time, D, Clk, “and Q is %d”, Q);
//输出:
	At 24, D=x, Clk=x and Q is 0;
	At 25, D=x, Clk=x and Q is 1;
	At 30, D=0, Clk=x and Q is 1;
- $monitoroff 任务用于停止监控任务$monltor;
- 
     
      
       
        
         m
        
        
         o
        
        
         n
        
        
         i
        
        
         t
        
        
         o
        
        
         r
        
        
         o
        
        
         n
        
        
         任
        
        
         务
        
        
         用
        
        
         于
        
        
         启
        
        
         动
        
        
         监
        
        
         控
        
        
         任
        
        
         务
        
       
       
        monitoron 任务用于启动监控任务
       
      
     monitoron任务用于启动监控任务monitor。
 $monitor与$display的不同之处还在于$monitor往往在initial块中调用,只要不调用$monitoroff,$monitor便不间断地对其所设定的信号进行监视。
(2)仿真控制任务
//仿真控制任务用于使仿真进程停止。该类任务有两个:
	$finish
	$stop
//两者用法相同,以$stop为例说明:
initial #500 $stop;
//执行此initial语句将使仿真进程在500个时间单位后停止。
//这两个系统任务都是终止仿真:
◆$finish终止仿真进程后,会把控制权返回操作系统;
◆$stop终止仿真进程后,没有返回操作系统,而是返回仿真器的命令行。
(3)文件输出任务
//$readmemb:读取二进制格式数
//$readmemh:读取十六进制格式数

   这两个系统任务用于从文本文件中读取数据并将数据加载到存储器中。格式如上,其中<起始地址>和<结束地址>是可选项。如果没有<起始地址>和<结束地址>则存储器从其最低位开始加载数据直到最高位。如果有<起始地址>和<结束地址>则存储器从其起始地址开始加载数据直到结束地址 。
//例,先定义一个有256个地址的字节存储器mem:
	reg[7:0] mem[1:256];
//下面给出的系统任务以各自不同的方式装载数据到存储器mem中。
	initial $readmemh(“mem.data”,mem);
	initial $readmemh("mem.data”,mem,16);
	initial $readmemh(“mem.data”,mem,128,1);
  另一种方式是把指定的数据放入指定的存储器地址单元内,即在存放数据的文本内,给相应的数据规定其存储地址,形式如下:
 
   系统任务执行时将把该数据放入指定的地址,后续读入的数据会从该指定地址的下一个存储单元开始向后加载。例: @ 3 B,数据B会被放入存储器地址为3的单元内,后续读入的数据会从地址4开始存放。
(4)仿真时间函数
  在Verilog HDL中有两种类型的时间系统函数:$time和$realtime。用这两个时间系统函数可以得到当前的仿真时刻。该时刻是以模块的仿真时间尺度timescale为基准的。不同之处:
   ◆$time返回64位的整型时间。
   ◆$realtime返回实型时间。
//【例】
`timescale 10 ns /1ns
module test;
	reg set;
	pararaeter 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,$time输出的时刻是时间尺度的整数倍,即输出1.6 和3.2,且$time的返回值是整数,所以1.6和3.2经过取整为2和3
//采用$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
	3.2 set =1
(5)随机函数random
  随机函数提供一种随机数机制,每次调用这个函数都可以返回一个新的随机数,格式如下,其中b>0。它给出了一个范围在(-b+1):(b-1)中的随机数。
 
//给出了一个范围在-59到59之间的随机数
reg [23:0]rand;
rand=$random%60;
//产生一个值在0~59之间的随机数
reg[23:0]rand;
rand={$random}%60;
三、小结











