1)系统任务:$monitor

 
格式:
$monitor(p1,p2,p3...pn);
$monitor;
$monitoron;
$monitoroff;
任务$monitor提供了监控输出列表中的表达式或变量值的功能。其参数列表中输出格式控制字符串和输出列表的规则和$display一样。当启动一个带有一个或多个参数的$monitor时,仿真器则建立一个处理机制,使得每当参数列表中变量或者表达式的值发生变化是,整个参数列表中变量或者表达式的值都将输出显示。如果同一时刻,两个或多个参数的值发生变化,则该时刻只输出一次。在$monitor中,参数可以是$time系统函数。这样参数列表中变量或表达式的值同时发生变化的时刻可以通过表明同一时刻的多行显示出来。
如: $monitor($time,,"tex=%b rex=%b",tex,rex);     //注意这里的,,代表空参数,空参数在输出时显示为空格。
$monitor和$display的不同之处在于$monitor往往直接用在initial语句块中,只要不调用$monitoroff,$monitor便不断的对所设定的信号进行监视。$monitor不能在always块中调用。
再多模块的调试情况下,每一个模块都会默认调用$monitor语句,但是仿真器只能执行一个$monitor语句,因此程序会报错,这是需要$monitoron和$monitoroff语句,这样可以使得各个模块分开调用$monitor函数。
 
2)时间度量系统函数$time
 
在Verilog HDL中有两类型的时间系统函数,$time和$realtime。用这两个系统用函数可以的大当前的仿真时间。
$time可以返回一个64位的整数来表示当前仿真时刻值,该时刻是以模块的仿真时间尺度位基准的。
$realtime返回的时间数字是一个实型数。该数也是以时间尺度为基准的。
 
`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=3
在这个例子中,模块test想在时间为16ns是设置寄存器set的值为0,在32ns时设置寄存器的set为1。但是由$time疾苦的set变化时刻却和预想的不一样,这是由下面两个原因引起的。
1)$time显示时刻受时间尺度的影响。这里时间尺度为10ns,故16ns和32ns是对应输出的数字为1.6和3.2。
2)$time总是输出整数,所以在将经过尺度比例变换的数字输出时,要先进行取整,1.6和3.2分别取整为1和3.2.
3)如果将上述例子中的$time替换成$realtime,那么输出的数字将变为1.6和3.2.
 
3)系统任务$readmemb $readmemh
在Verilog中有两个系统任务$readmemb和$readmemh,并用来从文件中读取数据到存储器中。这两个系统任务可以在仿真的任何时刻都被执行使用。
(1)$readmemb("<数据文件名>",<存储器名>);
(2)$readmemb("<数据文件名>",<存储器名>,<起始地址>);
(3)$readmemb("<数据文件名>",<存储器名>,<起始地址>,<结束地址>);
(4)$readmemh("<数据文件名>",<存储器名>);
(5)$readmemh("<数据文件名>",<存储器名>,<起始地址>);
(6)$readmemh("<数据文件名>",<存储器名>,<起始地址>,<结束地址>);
在这两个系统函数中,被读取的数据文件的内容只能包括:空白字符(空格换行和制表格) 注释行(//和/**/) 二进制和十六进制数字。当地址出现在数据文件中时,其格式为@FF...F。
1 module test;
2 reg [0:7]memory[0:7]; //声明8个8位的存储单元
3 integer i;
4 initial
5 $readmemb("init.dat",memory);
6 for(i=0;i<8;i=i+1)
7 $display("memory[%d]=%b",i,memory[i]);
8 end
9 endmodule
 如果文件中的内容为:
@002
11111111 00000000
01010101 10101010
@006
1111xxxx 00001111
则测试结果为:
memory[0]=xxxxxxxx
memory[1]=xxxxxxxx
memory[2]=11111111
memory[3]=00000000
memory[4]=01010101
memory[5]=10101010
memory[6]=1111xxxx
memory[7]=00001111
在上面6种系统任务格式,需补充说明一下几点:
(1)如果系统任务和数据文件都没有说明地址。则从默认的存储器地址开始写入数据,直至数据写完或者存储器存满。
(2)如果系统任务说明了起始地址,没有说明结束地址,则数据从起始地址开始存放,直至存储器的结束地址为止。
(3)如果系统任务说明了起始地址和结束地址。那么久按章任务说明中的地址进行存储,不考虑存储器的默认起始地址。
(4)如果系统任务和数据文件都说明了地址。那么数据文件中的地址说明必须包含在任务地址说明语句中,否则将出现错误信息,并且停止存储。
(5)如果数据文件中的数据个数和系统任务中起始地址和结束地址暗示的数据个数不同,也会报错。
 
4)系统任务$finish $stop
 
格式:
$finish;
$finish(n);
系统任务$finish的作用是退出仿真器,返回主操作系统,也就是结束仿真过程。$finish可以带承诺书,根据参数的值输出不同的特征信息。如果不带参数,默认其值为1;
0 不输出任何信息。
1 输出当前的仿真时间和位置;
2 输出当前的仿真时间、位置和仿真过程中所用memory和CPU的时间统计。
 
格式:
$stop;
$stop(n);
$stop任务的作用是将EDA工具设置为暂停模式,在仿真环境下给出一个交互式的命令,将控制权交给用户。参数值越大,输出信息越多。
 
5)系统任务$random
 
这个系统函数提供了一个产生随机数的手段。当函数被调用时返回一个32位的随机数。这是一个带符号的整型数。
$random的一般用法是:$random%b,其中b>0.他给出了一个范围在(-b+1):(b-1)中的随机数。下面给出例子:
reg [23:0]rand;
rand=$random%60;            //生成-59~59之间的随机数
rand={$random}%60;        //生成0~59之间的随机数

Verilog学习笔记基本语法篇(十一)········ 常用系统函数的更多相关文章

  1. Verilog学习笔记基本语法篇(十)········ 常用系统函数

    $display 和 $write 任务 格式: $display (p1,p2,...,pn); $write (p1,p2,..,pn); 这两个函数和系统的任务作用是用来输出信息,即将参数p2到 ...

  2. Verilog学习笔记基本语法篇(十二)········ 编译预处理

    h Verilog HDL语言和C语言一样也提供编译预处理的功能.在Verilog中为了和一般的语句相区别,这些预处理语句以符号"`"开头,注意,这个字符位于主键盘的左上角,其对应 ...

  3. Verilog学习笔记基本语法篇(九)········ 任务和函数

    task 和 function 说明语句分别用来定义任务和函数,利用任务和函数可以把函数模块分成许多小的任务和函数便于理解和调试.任务和函数往往还是大的程序模块在不同地点多次用到的相同的程序段.输入. ...

  4. Verilog学习笔记基本语法篇(八)········ 结构说明语句

    Verilog中的任何过程都可以属于以下四种结构的说明语句; 1) initial;  2) always;  3) task;   4) function; 1) initial说明语句: 一个程序 ...

  5. Verilog学习笔记基本语法篇(六)········ 循环语句

    在Verilog中存在着4种类型的循环语句,用来控制执行语句的执行次数. 1)forever语句: 连续执行的语句. 2)repeat语句:  连续执行n次的语句. 3)while语句:    执行语 ...

  6. Verilog学习笔记基本语法篇(三)·········赋值语句(待补充)

    在Verilog HDL语言中,信号有两种赋值方式. A)非阻塞赋值(Non-Blocking)方式(如:b<=a;) (1)在语句块中,上面语句所赋值的变量不能立即为下面的语句所用: (2)块 ...

  7. Verilog学习笔记基本语法篇(一)·········数据类型

    Verilog中共有19种数据类型. 基本的四种类型: reg型.wire型.integer型.parameter型. 其他类型:large型.medium型.small型.scalared型.tim ...

  8. Verilog学习笔记基本语法篇(十三)...............Gate门

    Verilog中已有一些建立好的逻辑门和开关的模型.在所涉及的模块中,可通过实例引用这些门与开关模型,从而对模块进行结构化的描述. 逻辑门: and (output,input,...) nand ( ...

  9. Verilog学习笔记基本语法篇(七)········ 生成块

    生成块可以动态的生成Verilog代码.可以用于对矢量中的多个位进行重复操作.多个模块的实例引用的重复操作.根据参数确定程序中是否包含某段代码.生成语句可以控制变量的声明.任务和函数的调用.还能对实例 ...

随机推荐

  1. 用java开发微信公众号:测试公众号与本地测试环境搭建(一)

    本文为原创,原始地址为:http://www.cnblogs.com/fengzheng/p/5023678.html 俗话说,工欲善其事,必先利其器.要做微信公众号开发,两样东西不可少,那就是要有一 ...

  2. Self Host模式下的ASP. NET Web API是如何进行请求的监听与处理的?

    构成ASP.NET Web API核心框架的消息处理管道既不关心请求消息来源于何处,也不需要考虑响应消息归于何方.当我们采用Web Host模式将一个ASP.NET应用作为目标Web API的宿主时, ...

  3. Windows Azure Storage (17) Azure Storage读取访问地域冗余(Read Access – Geo Redundant Storage, RA-GRS)

    <Windows Azure Platform 系列文章目录> 细心的用户会发现,微软在国外和国内的数据中心建设都是成对的,比如香港数据中心(Asia East)和新加坡的数据中心(Sou ...

  4. Atitit 索引技术--位图索引

    Atitit 索引技术--位图索引 索引在数据结构上可以分为三种B树索引.位图索引和散列索引 存储原理 编辑 位图索引对数据表的列的每一个键值分别存储为一个位图,Oracle对于不同的版本,不同的操作 ...

  5. SQL Server 复制:事务发布

    一.背景 在复制的运用场景中,事务发布是使用最为广泛的,我遇到这样一个场景:在Task数据库中有Basic与Group两个表,需要提供这两个表的部分字段给其它程序读取放入缓存,程序需要比较及时的获取到 ...

  6. 深入理解javascript对象系列第一篇——初识对象

    × 目录 [1]定义 [2]创建 [3]组成[4]引用[5]方法 前面的话 javascript中的难点是函数.对象和继承,前面已经介绍过函数系列.从本系列开始介绍对象部分,本文是该系列的第一篇——初 ...

  7. Android使用TextureView播放视频

    1.引言 如果你想显示一段在线视频或者任意的数据流比如视频或者OpenGL 场景,你可以用android中的TextureView做到. 1).TextureView的兄弟SurfaceView 应用 ...

  8. Objective-C中的深拷贝和浅拷贝

    在Objective-C中对象之间的拷贝分为浅拷贝和深拷贝.说白了,对非容器类的浅拷贝就是拷贝对象的地址,对象里面存的内容仍然是一份,没有新的内存被分配.对非容器类的深拷贝就是重写分配一块内存,然后把 ...

  9. 关于在BAE上部署ThinkPHP框架的问题

    现在有点小兴奋,因为在在BAE上部署ThinkPHP框架的问题快折腾一天了,午觉都没睡,不过没白整总算有点结果.不扯淡了,直入正题吧. 之前熟悉ThinkPHP框架,想在BAE上用ThinkPHP做点 ...

  10. 小菜学习设计模式(二)—单例(Singleton)模式

    前言 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Method) ...