Verilog的系统任务----$fopen、$fclose和$fdisplay, $fwrite,$fstrobe,$fmonitor

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

文章目录

        概述

        $fopen

        $fdisplay, $fwrite,$fstrobe,$fmonitor

        $fclose

        仿真测试

        总结与参考


概述

        在这篇文章(Verilog的系统任务----$readmemh和$readmemb)中,介绍了Verilog的系统任务$readmemh和$readmemb的用法,利用这两个系统任务,可以实现从文件中读取数据到仿真中数组的功能。

        无独有偶,有时候在仿真时,我们同样需要将获取的数据写入文件中,以便后续的分析和利用。下面这三类系统任务可以用来实现对文件的写入操作:

  • $fopen:打开指定文件
  • $fclose:关闭指定文件
  • $fdisplay, $fwrite,$fstrobe,$fmonitor:对指定文件进行特定的写入操作

$fopen

        系统任务$fopen可以用来打开指定的文件(以便后续对其进行写入操作),其返回值为integer变量,表示当前文件的句柄值,获取句柄值后,后续就可以根据句柄值对不同的文件进行写入操作。即

integer        handle1;                                 //定义句柄1

handle1 = $fopen("file_name",type)       //以指定类型(type)的方式来打开文件,并将其返回值赋给handle1

        type指定了打开文件的类型,可以是以下种类:

Verilog的系统任务----$fopen、$fclose和$fdisplay, $fwrite,$fstrobe,$fmonitor

        通常情况下,我们使用 w 来作为类型值,即以对一个ASCII文本文件进行写操作的方式来打开该文件 (txt)。

        比如,我们在如下路径新建一个TXT文件file_test1.txt:

Verilog的系统任务----$fopen、$fclose和$fdisplay, $fwrite,$fstrobe,$fmonitor

        然后就可以用下述的方法将其打开:

integer        handle1;                                                           //定义句柄1

handle1 = $fopen("D:/file_test/file_test1.txt","w");          //以w类型(写)的方式来打开文件,并将其返回值赋给handle1


$fdisplay, $fwrite,$fstrobe,$fmonitor

        这4个函数都可以对指定文件进行打印或写入操作,其用法与对应的$display, $write,$strobe,$monitor几乎一致。建议参考:Verilog中的系统任务(显示/打印类)--$display, $write,$strobe,$monitor_孤独的单刀的博客-CSDN博客_verilog打印Verilog中的系统任务(显示/打印类)--$display, $write,$strobe,$monitorhttps://wuzhikai.blog.csdn.net/article/details/125340502        区别在于$display等函数是直接在仿真中进行打印,而$fdisplay等函数是对指定文件进行打印,需要通过句柄来指定是对具体哪个文件进行操作。如:

//指定句柄并打开文件

        reg                data;

        integer        handle1;                                                         //定义句柄1

        handle1 = $fopen("D:/file_test/file_test1.txt","w");       //以w类型(写)的方式来打开文件,并将其返回值赋给handle1

//对指定文件写入数据

        $fdisplay(handle1,"%d\n",data);                                    //按照十进制格式写入数据到handle1对应的文件中,只能逐个写入


$fclose

        $fclose系统任务用来关闭指定文件,关闭后即无法对该文件进行操作。其格式如下:

$fclose(handle1);        //关闭文件file_test1,至此文件操作结束


仿真测试

        首先新建两个TXT文件来后续对其写入数据,其名称和路径如下:

Verilog的系统任务----$fopen、$fclose和$fdisplay, $fwrite,$fstrobe,$fmonitor

         

        然后,编写一个testbench实现以下功能:

  • 构建计数器1:从0000-1111循环计数;将0000开始的10个值写入文件file_test1.txt,然后关闭文件写入功能
  • 构建计数器2:从1111-0000循环计数;将1111开始的10个值写入文件file_test2.txt,然后关闭文件写入功能
`timescale 1ns / 1ns

module file_test();

reg	[3:0]	cnt1;		//计数器1
reg	[3:0]	cnt2;		//计数器2
reg			clk;		//主时钟
reg			rst_n;		//复位

integer		handle1;	//定义文件1句柄
integer		handle2;	//定义文件2句柄

//初始化赋值
initial begin
	clk <= 1'b0;
	rst_n <= 1'b0;
	#20
	rst_n <= 1'b1;
	#200
	$finish;
end

//打开文件1、文件2
initial begin
	handle1 = $fopen("D:/file_test/file_test1.txt","w");
	handle2 = $fopen("D:/file_test/file_test2.txt","w");	
end

//计数器1从0000-1111循环计数
always @(posedge clk or negedge rst_n) begin
	if(rst_n == 1'b0)
		cnt1 <= 4'b0000;
	else
		cnt1 <= cnt1 + 1'b1;
end

//计数器2从1111-0000循环计数
always @(posedge clk or negedge rst_n) begin
	if(rst_n == 1'b0)
		cnt2 <= 4'b1111;
	else
		cnt2 <= cnt2 - 1'b1;
end

//将计数器1的10个值打印到文件1
always @(posedge clk or negedge rst_n) begin
	if(rst_n == 1'b0)
		;
	else if(cnt1 >4'd9)
		$fclose(handle1);	
	else
		$fdisplay(handle1,"%d",cnt1);		//以10进制的方式将当前的cnt1的值写入文件1
end

//将计数器2的10个值打印到文件2
always @(posedge clk or negedge rst_n) begin
	if(rst_n == 1'b0)
		;
	else if(cnt2 <4'd6)
 		$fclose(handle2);
	else 
		$fdisplay(handle2,"%d",cnt2);		//以10进制的方式将当前的cnt2的值写入文件2
end

always #10 clk = ~clk;		//主时钟20ns

endmodule

        使用vivado自带仿真器进行仿真,仿真结束后,打开两个文本文件,观察其写入数据是否与预期一致。

        文件1:依次写入0-9共10个数据

Verilog的系统任务----$fopen、$fclose和$fdisplay, $fwrite,$fstrobe,$fmonitor

        文件2:依次写入15-6共10个数据 

 Verilog的系统任务----$fopen、$fclose和$fdisplay, $fwrite,$fstrobe,$fmonitor

        对两个文件的数据写入均与预期设计一致。


总结与参考

  • 系统任务$fopen用来打开指定的文件,后续才可以对文件进行操作
  • 系统任务$fclose用来关闭指定的文件,结束对文件的操作
  • 系统任务$fdisplay, $fwrite,$fstrobe,$fmonitor可以用来对文件写入数据、打印文本,其用法基本与对应的系统任务$display, $write,$strobe,$monitor一致,只不过要加上表示对应文件的句柄值

        参考资料1:IEEE Standard for Verilog® Hardware Description Language(IEEE Std 1364™-2005)文章来源地址https://www.toymoban.com/news/detail-470273.html


  • 📣博客主页:wuzhikai.blog.csdn.net
  • 📣本文由 孤独的单刀 原创,首发于CSDN平台🐵
  • 📣您有任何问题,都可以在评论区和我交流📞!
  • 📣创作不易,您的支持是我持续更新的最大动力!如果本文对您有帮助,还请多多点赞👍、评论💬和收藏⭐!

到了这里,关于Verilog的系统任务----$fopen、$fclose和$fdisplay, $fwrite,$fstrobe,$fmonitor的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Verilog的系统任务----$readmemh和$readmemb

            这两个系统任务是用来从指定文件中读取数据到寄存器数组或者RAM、ROM中。除了可以在仿真的任何时刻被执行使用外,根据综合工具的不同,也可以用来对RAM或者ROM进行初始化(Vivado支持)。         使用格式共6种: $readmemb(\\\"数据文件名\\\",数组名) $readmemb (\\\"数

    2024年02月07日
    浏览(21)
  • 【Verilog 教程】6.2Verilog任务

    :任务 任务与函数的区别 和函数一样,任务(task)可以用来描述共同的代码段,并在模块内任意位置被调用,让代码更加的直观易读。函数一般用于组合逻辑的各种转换和计算,而任务更像一个过程,不仅能完成函数的功能,还可以包含时序控制逻辑。下面对任务与

    2024年02月07日
    浏览(32)
  • 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)
  • Verilog 显示任务($display, $write, $strobe, $monitor)

    Verilog 中主要用以下 4 种系统任务来显示(打印)调试信息: $display, $write, $strobe, $monitor。 $display $display 使用方法和 C 语言中的 printf 函数非常类似,可以直接打印字符串,也可以在字符串中指定变量的格式对相关变量进行打印。例如: 如果没有指定变量的显示格式,变量值

    2023年04月15日
    浏览(65)
  • 【C标准库】详解fopen函数 一篇让你搞懂fopen函数

    创作不易,感谢支持! ‾ underline{创作不易,感谢支持! } 创作不易,感谢支持! ​ fopen函数 头文件:stdio.h 功能是打开一个文件,其声明格式是: 文件指针名 = fopen(文件名,使用文件方式) “文件名”是被打开文件的文件名,类型是C风格字符串。 “使用文件方式”是指文

    2024年02月03日
    浏览(28)
  • read/write和fread/fwrite介绍

    UNIX环境下的C 对二进制流文件的读写有两套班子:1) fopen,fread,fwrite ; 2) open, read, write 这里简单的介绍一下他们的区别。 1. fopen 系列是标准的C库函数;open系列是 POSIX 定义的,是UNIX系统里的system call。 也就是说,fopen系列更具有可移植性;而open系列只能用在 POSIX 的操作系

    2024年02月09日
    浏览(29)
  • C语言中fopen的详细用法

    fopen是C语言中用于打开文件的函数,其原型为: 其中,filename是要打开的文件名,mode是打开文件的模式。fopen函数返回一个指向FILE类型的指针,该指针指向打开的文件。 fopen函数的mode参数有以下几种: \\\"r\\\":以只读方式打开文件。文件必须存在,否则打开失败。 \\\"w\\\":以写方式

    2024年02月11日
    浏览(19)
  • C //练习 8-3 设计并编写函数_flushbuf、fflush和fclose。

    练习 8-3 设计并编写函数_flushbuf、fflush和fclose。 注意:代码在win32控制台运行,在不同的IDE环境下,有部分可能需要变更。 IDE工具:Visual Studio 2010   代码块:

    2024年01月22日
    浏览(24)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包