$display、$write;$fopen、$fdisplay、$fclose;$strobe

$display和$write任务

  • 格式: $display(p1,p2,...pn);     $write(p1,p2,...pn);
  • p1通常称为"格式控制”;p2~pn称为“输出列表”;
  • 这两个任务的作用基本相同。$display在结束后自动换行,$write不会自动换行。所以,当想让消息在一行显示时,用$write
  • 在$display和$write中,输出格式控制要用双引号括起来。
  • 下表给出几种常用的输出格式:
输出格式 说明
%h或%H 16进制
%d或%D 10进制
%o或%O 8进制
%b或%B 2进制
%c或%C ASCII码
%v或%V 输出网络型数据信号强度
%m或%M 输出等级层次的名字
%s或%S 字符串
%t或%T 以当前的时间格式
%e或%E 指数形式
%f或%F 以10进制形式输出实型数
%g或%G 以指数或10进制的形式输出实型数 

其中:%v %m %t的具体情况可见:http://blog.51cto.com/lihaichuan/981060

换码序列及功能

换码序列 功能
\n 换行
\t 右移一个制表符
\\ 字符\
\" 双引号字符"
\o 1~3位八进制数代表的字符
%% 百分号%

在$display()中可以通过在%和表示进制的字符之间插入一个0来自动调整显示输出数据宽度的方式。eg:

$display("d=%0h a=%0h",data,addr);

如果输出列表中表达式的值包含有不确定的值或高阻值,其结果输出遵循以下规则:
(1).在输出格式为十进制的情况下:
• 如果表达式值的所有位均为不定值,则输出结果为小写的x。
• 如果表达式值的所有位均为高阻值,则输出结果为小写的z。
• 如果表达式值的部分位为不定值,则输出结果为大写的X。
• 如果表达式值的部分位为高阻值,则输出结果为大写的Z。
(2).在输出格式为十六进制和八进制的情况下:
• 每4位二进制数为一组代表一位十六进制数,每3位二进制数为一组代表一位八进制数。
• 如果表达式值相对应的某进制数的所有位均为不定值,则该位进制数的输出的结果为小写的
x。
• 如果表达式值相对应的某进制数的所有位均为高阻值,则该位进制数的输出结果为小写的z。
• 如果表达式值相对应的某进制数的部分位为不定值,则该位进制数输出结果为大写的X。
• 如果表达式值相对应的某进制数的部分位为高阻值,则该位进制数输出结果为大写的Z。
对于二进制输出格式,表达式值的每一位的输出结果为0、1、x、z。下面举例说明:
语句输出结果:

 $display("%d",'bx);        // 输出结果为:x

 $display("%h",'bx0_1010);           //输出结果为:xxXa

$display("%h %o",'b001x_xx10_1x01,12'b001_xxx_101_x01); //结果为:XXX1x5X

$display("%h %o",12'b001x_xx10_1x01,12'b001_xxx_101_x01); 输出结果为:XXX 1x5X

注意:因为$write在输出时不换行,要注意它的使用。可以在$write中加入换行符\n,以确保明确的
输出显示格式。

文件输出

  • 文件可以用系统任务$fopen打开;

  • 用法:$fopen("<文件名>");              用法:<文件句柄>=$fopen("<文件名>");
  • 任务$fopen返回一个被称为多通道描述符的32位值。多通道描述符中只有一位被设置为1。标准输出有一个多通道描述符,其最低位(第0位)被设置为1。标准输出也被称为通道0.标准通道一直开放。
  • 由于标准输出将描述符的最低位占用,同时描述符的第31位是保留位。所以,使用多通道2描述符最多可以同时开30个文件。
  • 注意:用$fopen打开文件会将原来的文件清空,若要读数据就用$readmemb,$readmemh就可以了,这个语句不会清空原来文件中的数据。
    用$fopen的情况是为了取得句柄,即文件地址,也就是写文件时用$fdisplay(desc,"display1");时才用。$readmemb和$readmemh会在Verilog的一些系统任务(二)。
  • 系统任务$fdisplay、$fmonitor、$fwrite和$fstrobe都用于写文件。

  • $fdisplay和$fmonitor任务的用法:    $fdisplay/$fmonitor(<文件描述符>,p1,p2,...,pn);

下面是一个对文件打开和写文件的例子:

 module files;
integer handle1,handle2,handle3;
// 标准输出一直是打开的:descriptor=32'h0000_0001;(bit0 set 1)
initial
begin
handle1=$fopen("file1.out"); // handle1=32'h0000_0002(bit1 set 1)
handle2=$fopen("file2.out"); // handle2=32'h0000_0004(bit2 set 1)
handle3=$fopen("file3.out"); // handle3=32'h0000_0008(bit3 set 1)
end
integer desc1,desc2,desc3;
initial
begin
# desc1=handle1|; // 按位或;desc1=32'h0000_0003
$fdisplay(desc1,"Display 1"); // 写到文件file1.out和标准输出stdout desc2=handle2|handle1; // desc2=32'h0000_0006
$fdisplay(desc2,"Display 2"); // 写道文件file1.out和file2.out desc3=handle3; // desc3=32'h0000_0008
$fdisplay(desc3,"Display 2"); // 只写到文件file3.out # $fclose(handle1);
$fclose(handle2);
$fclose(handle3);
end
endmodule
  • 显示层次

  • 通过任何显示任务,例如$display、$write、$monitor或者$strobe任务中的%m选项的方式可以显示任何级别的层次。
  • 选通显示

  • 选通显示由关键字为$strobe的系统任务完成。这个任务与$display任务大体上相同。但是如果使用strobe语句,那么$strobe语句总是在其他同时刻的其他赋值语句执行完成以后才执行。
  • 用处:$strobe提供了一种同步机制,他可以确保所有在同一时钟沿赋值的其他语句在执行完毕以后才显示数据。
  • 例子如下:
    always @(posedge clock)
    begin
    a=b;
    c=d;
    end always @(posedge clock)
    $ strobe ("Displaying a=%b,c=%b",a,c);

    如果使用的是display,那么忧郁两个always块同时运行,会出现无法找到display是在前一个always赋值语句之前还是之后执行。而顺序不同会产生不同的结果。但是当使用了strobe后,则strobe语句是在同时刻的所有语句的最后执行。那么,就可以确保是在赋值完毕后才进行输出操作。

Verilog的一些系统任务(一)的更多相关文章

  1. Verilog的一些系统任务(二)

    $monitor 任务$monitor提供了监控和输出参数列表中的表达式或变量值的功能. 格式: $monitor(p1,p2,...,pn);   $monitor;        $monitor ...

  2. verilog语法实例学习(1)

    本文档中通过verilog实例来学习verilog语法.Verilog是一种硬件描述语言,它具有并发性和时序性.并发性是指不同硬件模块的同时操作,时序性是指信号的赋值或操作在时钟的边沿进行.由于作者本 ...

  3. 【FPGA篇章五】FPGA函数任务:对讲解函数与任务专题展开详解

    欢迎大家关注我的微信公众账号,支持程序媛写出更多优秀的文章 任务和函数也属于过程块,多用于仿真文件设计中,使用两者的目的有所区别: 函数(function):对输入的值执行一些处理,返回一个新的值. ...

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

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

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

    1)系统任务:$monitor   格式: $monitor(p1,p2,p3...pn); $monitor; $monitoron; $monitoroff; 任务$monitor提供了监控输出列 ...

  6. Verilog学习笔记设计和验证篇(五)...............层次化事件队列

    详细的了解层次化事件队列有助于理解Verilog的阻塞赋值和非阻塞赋值功能.所谓层次化事件队列指的是用于调度仿真时间的不同Verilog事件队列.在IEEE的5.3节中定义了层次化事件队列在逻辑上分为 ...

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

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

  8. 【verilog】fdisplay中如何保存有符号形式

    2014-01-02 10:10:29 参考:http://xilinx.eetop.cn/viewthread-275584 使用系统任务$signed,如 $fdisplay(fp, " ...

  9. 对Verilog 初学者比较有用的整理(转自它处)

    *作者: Ian11122840    时间: 2010-9-27 09:04                                                              ...

随机推荐

  1. Python学习---装饰器的学习1210

    装饰器的基础 学习前提: 作用域 + 函数的理解 + 闭包  [学习,理解] 代码编写原则: 对修改开放对扩展开放 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前 ...

  2. Eclipse导出可运行的jar包并运行

    https://blog.csdn.net/kpchen_0508/article/details/49275407 程序运行的第二种方式:

  3. #Alpha Scrum6

    Alpha Scrum6 牛肉面不要牛肉不要面 Alpha项目冲刺(团队作业5) 各个成员在 Alpha 阶段认领的任务 林志松:督促和监督团队进度 陈彬:博客编写 吴沂章.林锃寒:代码功能完善 林志 ...

  4. Hadoop Spark 基础教程

    0x01  Hadoop 慕课网 https://www.imooc.com/learn/391 Hadoop基础 慕课网 https://www.imooc.com/learn/890 Hadoop ...

  5. 动画的分类:属性(几何)动画、内容(视频)动画:gpu vs cpu

    属性动画通过gpu根据属性来呈现: 内容动画通过cpu解码内容按照时间呈现给gpu: (或者gpu直接解码现实?)

  6. HDFS 读取、写入、遍历文件夹获取文件全路径、append

    版权声明:本文为博主原创文章,未经博主同意不得转载.安金龙 的博客. https://blog.csdn.net/smile0198/article/details/37573081 1.从HDFS中 ...

  7. 【LGP2045】方格取数加强版

    题目 还纠结了一下是费用流还是最小割 最终还是决定让最小割去死吧 我们的问题就是让一个点的点权只被计算一次 考虑拆点 将所有点拆成入点和出点,入点向出点连流量为\(1\)的边 每一个出点往下连能到达的 ...

  8. [POI2006]TET-Tetris 3D

    题目 二维线段树板子题啊 但是惊讶的发现我不会打标记 毕竟内层是线段树不能\(pushup\)也不能\(pushdown\) 于是考虑一下标记永久化 其实非常显然\(mx_i\)表示区间最大值,\(t ...

  9. 包不包含__declspec(dllimport)的判定

    按照MSDN说明,当链接dll的导出函数时,只需要包含头文件和lib,__declspec(dllimport)修饰符不是必须的,但加上该修饰能使导出函数的调用效率更高.那么,究竟原因是什么? 不使用 ...

  10. ubuntu16.04 Detectron目标检测库配置(包含GPU驱动,Cuda,Caffee2等配置梳理)

    Detectron概述 Detectron是Facebook FAIR开源了的一个目标检测(Object Detection)平台. 用一幅图简单说明下Object Detection.如Mask R ...