verilog常用系统任务和函数

这篇具有很好参考价值的文章主要介绍了verilog常用系统任务和函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在FPGA开发中编写仿真测试激励文件(testbench),经常会用到verilog的系统函数,使用系统函数非常方便,本文总结了常用的系统函数,并提供了说明和使用示例。

一、文件操作

1、打开文件$fopen和关闭文件$fclose

integer fp;
fp = $fopen("file_path/file_name","wb");
$fclose(fp);

打开文件$fopen函数

第1个参数:文件路径,绝对路径和相对路径均可。

第2个参数:

定义

含义

r

读操作

w

写操作

a

在文件末尾追加

rb,wb,ab

以二进制的方式读、写、追加,推荐方式

返回值:0表示打开文件成功,非0值表示打开文件失败

关闭文件$fclose:参数是$fopen返回的整型变量。

2、写入文件:$fwrite,$fdisplay,$fmonitor,$fstrobe

 $fdisplay(fp,"%d", dout);
 $fwrite(fp,"%d", dout);
 $fmonitor(fp, "%h", $time);
 $fstrobe(fp, "%h", 16'h78)

$fdisplay等函数是将数据写入到指定文件中,第一个参数是文件指针,第二个参数是写入数据格式,第三个参数是写入数据。

写入数据格式:

%d

十进制格式

%c

单字符格式

%x

16进制格式

说明:

$fdisplay 调用即执行,可以自动换行,

$fwrite调用即执行,换行则需写成“%d\n”。

$fmonitor只有在变量发生变化时,才会写入文件,在initial中调用一次即可。

$fstrobe语句执行完毕后写文件

3、读取文件:$fread,$readmemb,$readmemh,$fget

读取文件函数,需要设定存储器用来存储数据,存储器可设定为二维数组。

(1)$fread函数
$fread(mem, fd, start, count) 

参数说明:mem是存储数组或寄存器变量 ,fp为文件指针,start 为文件起始地址,count 为读取长度。若 start和count省略,数据会全部填充至变量 mem。

(2)$readmemb和$readmemh函数
$readmemh("file_path/file_name",mem,start, end);
$readmemb("file_path/file_name",mem,start, end);

$readmemb是以2进制读取,$readmemh是以16进制读取

参数说明:file_path/file_name为文件路径,mem是存储数组或寄存器变量 ,start 为起始地址,end 为结束低至。若 start和end省略,数据会全部填充至变量 mem。

(3)$fgetc函数和 $fgets函数

$fgetc( fd ) ,按字符读取文件,每次执行读取8bit。

$fgets(str, fd),按行读取文件,每次执行读取一行。

localparam FILE_LEN = 1000;
localparam WIDTH = 8;
integer num, i;
reg [WIDTH-1:0] mem [0:FILE_LEN-1];
reg [WIDTH-1:0] mem_r;
reg [31:0]   mem_load [3:0] ;
reg [99:0]   line_buf [9:0] ;
//方法1
$fread(mem,fp,0,FILE_LEN);//数组型读取
$fread(mem_r,fp);//单个寄存器
//方法2
$readmemb("file_path/file_name", mem);
$readmemb("file_path/file_name", mem,0,FILE_LEN-1);
$readmemh("./DATA_WITHNOTE.HEX", mem_load);
//方法3
mem[0] = $fgetc(fp);
for(i=0;i<FILE_LEN;i=i+1) begin
   mem[i] = $fgetc(fp);  
end
//方法4
for(i=0;i<9;i=i+1) begin
   $fgets(line_buf[i], fd); 
end

4、文件定位

pos = $ftell( fd ) ; 获取文件位置函数,返回文件当前位置距离文件首部的偏移量,偏移量为字节。

$fseek(fd, offset, type) ; 重定位函数,offset 为偏移量,type 为偏移参考地址,0表示文件起始位置,1表示当前位置,2表示文件末尾地址。

$rewind( fd ) ; 等价于 $fseek( fd, 0, 0) ,重新将文件指针的位置指向文件首部

$feof(fd) ; 文件末尾检测函数,检测到文件末尾时返回值为 1,否则为 0。

pos  = $ftell(fd);
$fseek(fd, 6, 0) ; //重定位到文件起始后的第6个地址
$fseek(fd, 6, 1) ; //重定位到当前地址后的第6个地址
$rewind(fd);//重新将文件指针的位置指向文件首部

二、显示/打印类

用于在终端显示打印出信息,常用函数:$display,$strobe,$monitor

$display("<string>", variables);
$strobe("<string>", variables);

输出格式:

%h 十六进制格式输出 %c ASCII 码格式输出

%d 十进制格式输出 %e 指数格式输出

%o 八进制格式输出 %f 浮点数 (real 型) 格式输出

%b 二进制格式输出 %t 当前时间格式输出

%s 字符串格式输出 %m 当前层次访问路径输出

转义字符:

\n

换行符

%%

百分号"%"

\t

制表符(Tab 键)

\0

八进制代表的字符

\\

反斜杠"\"符

\0x

十六进制代表的字符

\"

双引号

说明:

$display不管是阻塞赋值还是非阻塞赋值,直接打印结果。

$strobe执行等到非阻塞赋值完成后再打印结果。

$monitor用于变量的持续监测,只要变量发生变化,就会打印显示。

三、其它

1、随机数产生函数

$random,用于产生随机数

//num为范围在 -(b-1):(b-1) 中的随机数, b为十进制整数
num = $random%b;
//产生随机正整数, 在 0:(b-1) 中的随机数
num = {$random}%b

2、仿真过程控制函数

$finish表示结束当前仿真,$stop表示暂停当前仿真。

$finish;
$stop;

3、显示仿真时间

$time返回整数时间值,$realtime返回实数时间值,都是以仿真开始时的仿真时间为参考。 文章来源地址https://www.toymoban.com/news/detail-741975.html

$display($time,“ dout=%d”,dout);

到了这里,关于verilog常用系统任务和函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA开发——VHDL实现各类触发器

    小编最近在学习时序电路的VHDL设计,通过此文对触发器和VHDL相关知识进行总结,以便日后进行复习、查阅。本文首先回顾了各类触发器的基本知识包括特性方程、状态图等,最后通过VHDL来实现各类触发器。 在实际的数字系统中往往包含大量的存储单元,而且经常要求他们在

    2024年02月04日
    浏览(37)
  • 基于FPGA的Lorenz混沌系统verilog开发,含testbench和matlab辅助测试程序

    目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 将vivado的仿真结果导入到matlab显示三维混沌效果:     vivado2019.2 matlab2022a testbench如下所示:        洛伦兹混沌系统是一种非线性动力系统,最初由爱德华·洛伦兹(Edward

    2024年02月11日
    浏览(31)
  • 基于FPGA的3位二进制的乘法器VHDL代码Quartus 开发板

    名称:基于FPGA的3位二进制的乘法器VHDL代码Quartus  开发板(文末获取) 软件:Quartus 语言:VHDL 代码功能: 3位二进制的乘法器 该乘法器实现两个三位二进制的乘法,二极管LED2~LED0显示输入的被乘数,LED5~LED3显示乘数,数码管显示相应的十进制输入值和输出结果 本代码已在开

    2024年02月21日
    浏览(39)
  • Verilog中的任务Task和函数Function

    task和function说明语句分别用来定义任务和函数。 利用任务和函数可以把一个很大的程序模块分解成许多较小的任务和函数便于理解和调试。 输入、输出和总线信号的值可以传入、传出任务和函数。任务和函数往往还是大的程序模块中在不同地点多次用到的相同的程序段。 学

    2023年04月26日
    浏览(27)
  • day10-verilog---模块的调用,任务和函数

    在做模块划分时,通常会出现这种情形,某个大的模块中包含了一个或多个功能子模块,verilog是通过 模块调用 或称为 模块实例化 的方式来实现这些子模块与高层模块的连接的 调用模块实例化的一般形式为: 模块名参数列表实例名(端口列表); 其中参数列表是传递到子

    2024年02月02日
    浏览(29)
  • Verilog语法之任务Task与函数Function

    目录 1、概述 2、任务 task 2.1、任务的定义 2.2、一个task例子 3、函数 function 3.1、函数的定义 3.2、一个function例子 4、任务与函数的异同 5、总结与参考         与C语言中的函数类似,在Verilog代码中,通过把代码分成小的模块或者使用 任务(task) 和 函数(function) ,可把一

    2024年02月15日
    浏览(25)
  • 基于FPGA的3位十进制密码锁VHDL代码Quartus DE2-115开发板

    名称:基于FPGA的3位十进制密码锁VHDL代码Quartus  DE2-115开发板(文末获取) 软件:Quartus 语言:VHDL 代码功能: 借助EDA工具和设计方法,学习硬件描述语言VHDL用编程的方法来设计电路,在QUARTUSⅡ软件环境中,基于EDA实验室的开发装置DE2-115,其FPGA芯片型号为EP4CE115F29C7,进行电

    2024年03月13日
    浏览(39)
  • 文件操作以及相关的函数fwrite,fread,fseek,ftell,rwind,feof

    🐶博主主页:@ᰔᩚ. 一怀明月ꦿ  ❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++ 🔥座右铭: “不要等到什么都没有了,才下定决心去做” 🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀 目录 🐰文件

    2024年02月04日
    浏览(25)
  • FPGA基础知识-任务和函数

    目录 学习目标 学习内容 1.任务和函数的区别 2.任务 3.函数 学习时间 学习总结 1.理解任务和函数之间的区别。 2.理解定义任务所需的条件,学会任务的声明和调用。 3.理解定义函数所需的条件.学会函数的声明和调用。 提示:这里可以添加要学的内容      在 Verilog中,任务

    2024年02月10日
    浏览(30)
  • Verilog概述一:Verilog HDL和 VHDL详细对比

    当前比较流行的硬件设计语言有两种,即 VHDL 与 Verilog HDL,两者各有优劣,也各有相当多的拥护者。 VerilogHDL和VHDL都是完备的HDL设计和验证语言,具有完整的设计方法和设计规范。 HDL (hardware description language) 硬件描述语言 具有特殊功能结构能够对硬件逻辑电路的功能进行描

    2024年02月02日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包