• 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
    ",a, b, c); //“%b+%b=%d
    ” 格式控制,未指定时默认十进制 
     2 %h或%H //以十六进制的形式输出 
     3 %d或%D //以十进制的形式输出 
     4 %o或%O //以八进制的形式输出 
     5 %b或%B //以二进制的形式输出
     6 
         //换行
     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
    ");
    20   a = 4'd5; 
    21   b = 4'd6; 
    22   c = a + b; 
    23   #100; 
    24   $write("%b+%b=%d
    ",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
    在这里插入图片描述

  • 相关阅读:
    JSP----获取表单参数
    application 从web.xml中获取初始化参数
    使用定时器分解任务
    无阻塞加载外部js(动态脚本元素,XMLHttpRequest注入,LazyLoad)
    ReactJs 入门DEMO(转自别人)
    带你一分钟理解闭包--js面向对象编程(转载他人)
    使用SqlBulkCopy进行批量数据插入
    AngularJsDEMO
    ECharts
    C#发送邮件DEMO
  • 原文地址:https://www.cnblogs.com/mc2-xiangliangzi/p/12950548.html
Copyright © 2020-2023  润新知