SYoong的个人空间 https://blog.eetop.cn/1584010 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

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

热度 1已有 3215 次阅读| 2016-9-26 14:01 |个人分类:Verilog基础|系统分类:芯片设计

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便不断的对所设定的信号进行监视。

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)时间尺度`timescale

`timescale命令用来说明跟在该命令后面的模块的时间单位和精度。使用`timescale命令可以在同一个设计中包含不同的时间单位的模块。一般的命令格式如下:`timescale<时间单位>/<时间精度>

在这条命令中,时间单位参量是用来定义模块中的仿真时间和延迟时间的基准单位的。时间精度是用来声明该模块的仿真时间的精确程度的,该参量被用来对延迟时间值进行取证操作,因此又可以称作是取整精度。如果在同一个程序设计里,存在多个`timescale一样的命令,则用最小的时间精度值来决定仿真的时间单位。另外时间精度不能大于时间单位值。

使用`timescale时应该注意,`timescale的有效区域为`timescale语句处直至下一个`timescale命令或者`resetall语句为止。当有多个`timescale命令时,只有最后一个才起作用,多以在同一个源文件中`timescale定义的不同的多个模块最好分开编译,不要包含在一起以免出错。

`timescale 1ns/1ps         //时间值都为1ns的整数倍,时间精度为1ps,因此延迟时间可以表达为带三位小数的实型数。

`timescale 10μs/100ns   //时间单位为10μs的整数倍,时间精度位100ns,因此延迟时间可以表达为带两位小数的实型数。

 

 1 `timescale 10ns/1ns
 2 module test;
 3   reg =set;
 4   parameter p=1.55;
 5   initial 
 6     begin
 7       $monitor($time,,"set=",set);
 8       #p set=0;
 9       #p set=1;
10      end
11 endmodule
1)根据时间精度,参数p的值从1.55取整为1.6;

2)因为时间单位是10ns,时间精度为1ns,所以延迟时间#p作为事件单位的整数倍为16ns;

3)可以用$printtimescale函数来输出显示一个模块的时间单位和时间精度。

 

4)条件编译命令`ifdef `else `endif

一般情况下,Verilog HDL源程序中所有的航都参加编译。但是有时希望对其中的部分内容只有在满足编译条件时才进行编译。也就是对一部分内容指定编译条件,即条件编译。

条件编译命令有以下几种形式:

     `ifdef 宏名 (标识符)

      程序段1

    `else

      程序段2

    `endif

它的作用是当宏名已经被定义过(`define定义),则对程序1进行编译,程序段2被忽略。其中else部分可以没有。注意:忽略掉的程序段也要符合语法规则。

   
1

点赞

刚表态过的朋友 (1 人)

发表评论 评论 (3 个评论)

回复 bkhzw6 2016-9-30 15:27
:lol

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 3

    粉丝
  • 0

    好友
  • 3

    获赞
  • 1

    评论
  • 访问数
关闭

站长推荐 上一条 /1 下一条


小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-28 10:45 , Processed in 0.016491 second(s), 13 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部