Verilog语言中的系统任务和系统函数

 Verilog语言中预先定义了一些任务和函数,用于完成一些特殊的功能,它们被称为系统任务和系统函数,这些函数大多数都是只能在Testbench仿真中使用的,使我们更方便的进行验证。

1 `timescale 1ns/1ns //时间尺度预编译指令 时间单位/时间精度

时间单位和时间精度由值1、10、和100以及单位s、ms、us、ns、ps和fs组成
时间单位:定义仿真过程所有与时间相关量的单位仿真中使用 “#数字”表示延时相应时间单位的时间,例#10表示延时10个单位的时间,即10ns。
时间精度:决定时间相关量的精度及仿真显示的最小刻度。

1 `timescale 1ns/10ps  //精度0.01,#10.11 表示延时10110ps 

下面这种写法就是错误的,因为时间单位不能比时间精度小。

1 `timescale 100ps/1ns  

主要的函数有如下这些,在支持Verilog语法的编辑器中都会显示为高亮关键字 。

//--------------------------------------------------
$display    //打印信息,自动换行 
$write        //打印信息
$strobe        //打印信息,自动换行,最后执行 
$monitor       //监测变量 
$stop          //暂停仿真 
$finish        //结束仿真 
$time          //时间函数 
$random        //随机函数 
$readmemb     //读文件函数
//--------------------------------------------------

下面我们单独介绍它们的功能,并在ModelSim的Transcript界面中打印这些信息。
1、$display用于输出、打印信息
使用格式为:

 1 $display("%b+%b=%d",a, b, c); //格式“%b+%b=%d” 格式控制,未指定时默认十进制
 2 %h或%H //以十六进制的形式输出 
 3 %d或%D //以十进制的形式输出 
 4 %o或%O //以八进制的形式输出 
 5 %b或%B //以二进制的形式输出 
 6 //--------------------------------------------------    
 7 //a,b,c 输出列表,需要输出信息的变量 
 8 //每次打印信息后自动换行
 9 `timescale 1ns/1ns 
10  
11 module tb_test(); 
12  
13 reg [3:0] a;
14 reg [3:0] b;
15 reg [3:0] c;
16  
17 initial begin 
18   $display("Hello"); 
19   $display("xiangliangzi"); 
20   a = 4'd5; 
21   b = 4'd6; 
22   c = a + b; 
23   #100; 
24   $display("%b+%b=%d", a, b, c); 
25 end 
26 
27 endmodule
28 //--------------------------------------------------    

在这里插入图片描述
2、$write 用于输出、打印信息
使用格式为:

 1 $write("%b+%b=%d\n",a, b, c); //“%b+%b=%d\n” 格式控制,未指定时默认十进制 
 2 %h或%H //以十六进制的形式输出 
 3 %d或%D //以十进制的形式输出 
 4 %o或%O //以八进制的形式输出 
 5 %b或%B //以二进制的形式输出
 6 \n     //换行
 7 //--------------------------------------------------    
 8 //a,b,c为输出列表,需要输出信息的变量
 9 `timescale 1ns/1ns 
10  
11 module tb_test(); 
12  
13 reg [3:0] a;
14 reg [3:0] b;
15 reg [3:0] c;
16  
17 initial begin 
18   $write("Hello ");    
19   $write("xiangliangzi\n");
20   a = 4'd5; 
21   b = 4'd6; 
22   c = a + b; 
23   #100; 
24   $write("%b+%b=%d\n",a, b, c);
25 end 
26  
27 endmodule    
28 //--------------------------------------------------    

在这里插入图片描述
3、$strobe用于输出、打印信息
使用格式为:

 1 $strobe("%b+%b=%d",a,b,c); //“%b+%b=%d” 格式控制,未指定时默认十进制 
 2 %h或%H //以十六进制的形式输出 
 3 %d或%D //以十进制的形式输出 
 4 %o或%O //以八进制的形式输出 
 5 %b或%B //以二进制的形式输出 
 6 //--------------------------------------------------
 7 //a,b,c 输出列表,需要输出信息的变量 
 8 //打印信息后自动换行,触发操作完成后执行
 9 `timescale 1ns/1ns 
10 
11 module tb_test(); 
12  
13 reg [3:0] a;
14 reg [3:0] b;
15 reg [3:0] c;
16   
17 initial begin 
18   $strobe("strobe:%b+%b=%d", a, b, c); 
19   a = 4'd5;    
20   $display("display:%b+%b=%d", a, b, c); 
21   b = 4'd6; 
22   c = a + b; 
23 end  
24  
25 endmodule
26 //--------------------------------------------------

在这里插入图片描述
4、$monitor用于持续监测变量
使用格式为:

 1 $monitor("%b+%b=%d",a,b,c); //“%b+%b=%d” 格式控制,未指定时默认十进制 
 2 %h或%H //以十六进制的形式输出 
 3 %d或%D //以十进制的形式输出 
 4 %o或%O //以八进制的形式输出 
 5 %b或%B //以二进制的形式输出 
 6 //--------------------------------------------------
 7 //a,b,c 输出列表,需要输出信息的变量 
 8 //被测变量变化触发打印操作,自动换行
 9 `timescale 1ns/1ns 
10  
11 module tb_test(); 
12  
13 reg [3:0] a;
14 reg [3:0] b;
15 reg [3:0] c;
16   
17 initial begin 
18   a = 4'd5; 
19   #100; 
20   b = 4'd6; 
21   #100; 
22   c = a + b; 
23 end 
24  
25 initial $monitor("%b+%b=%d", a, b, c); 
26  
27 endmodule
28 //--------------------------------------------------

在这里插入图片描述
5、$stop用于暂停仿真,
$finfish用于结束仿真

使用格式为:

 1 //--------------------------------------------------
 2 `timescale 1ns/1ns 
 3  
 4 module tb_test(); 
 5  
 6 initial begin 
 7   $display("Hello"); 
 8   $display("xiangliangzi"); 
 9   #100; 
10   $display("Stop Simulation"); 
11   $stop;     //暂停仿真 
12   $display("Continue Simulation"); 
13   #100; 
14   $display("Finish Simulation"); 
15   $finish;     //结束仿真 
16 end 
17  
18 endmodule
19 //--------------------------------------------------

在这里插入图片描述
6、$time为时间函数,返回64位当前仿真时间;
$random用于产生随机函数,返回随机数

使用格式为:

 1 //--------------------------------------------------
 2 `timescale 1ns/1ns
 3   
 4 module tb_test();
 5   
 6 reg [3:0] a; 
 7  
 8 always #10 a = $random;
 9  
10 initial $monitor("a=%d @time %d", a, $time); 
11  
12 endmodule
13 //--------------------------------------------------

在这里插入图片描述
7、$readmemh用于读二进制文件函数 ,
$readmemh 用于读十六进制文件函数

使用格式为:

 1 $readmemb("<数据文件名>", <寄存器变量名>); 
 2 $readmemh("<数据文件名>", <寄存器变量名>);
 3 //--------------------------------------------------
 4 `timescale 1ns/1ns
 5   
 6 module tb_test(); 
 7 
 8 integer i; 
 9 
10 reg [7:0] a [23:0]; 
11  
12 initial begin 
13    $readmemb("xiangliangzi.txt", a); 
14    for(i=0; i<=23; i=i+1) begin 
15       #10; 
16       $write("%s", a[i]); 
17    end 
18 end 
19  
20 endmodule
21 //--------------------------------------------------

读取的”xiangliangzi.txt”文件为:

 1 //--------------------------------------------------
 2 01010111 // W 
 3 01100101 // e 
 4 01101100 // l 
 5 01100011 // c 
 6 01101111 // o 
 7 01101101 // m 
 8 01100101 // e 
 9 00100000 //空格
10 01110100 // t 
11 01101111 // o 
12 00100000 //空格
13 01111000 // x 
14 01101001 // i
15 01100001 // a
16 01101110 // n
17 01100111 // g
18 01101100 // l
19 01101001 // i
20 01100001 // a
21 01101110 // n
22 01100111 // g
23 01111010 // z
24 01101001 // i
25 00100001 // !
26 //--------------------------------------------------

在这里插入图片描述
  欢迎加入FPGA技术学习交流群,本群致力于为广大FPGAer提供良好的学习交流环境,不定期提供各种本行业相关资料!QQ交流群号:450843130
在这里插入图片描述

 

posted @ 2020-03-15 19:53  相量子  阅读(1334)  评论(0编辑  收藏  举报