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