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指定了打开文件的类型,可以是以下种类:

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

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

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

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文件来后续对其写入数据,其名称和路径如下:

         

        然后,编写一个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个数据

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

 

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


总结与参考

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

        参考资料1:IEEE Standard for Verilog® Hardware Description Language(IEEE Std 1364™-2005)


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

  • 25
    点赞
  • 144
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Verilog中,$fwrite是一个文件写入函数。它用于将数据以指定格式写入到文件中。引用和引用中提到了Verilog中常见的文件操作函数,如$readmemb、$fopen、$fwrite和$fclose。$fwrite函数需要两个参数:文件句柄和要写入的数据。文件句柄是通过$fopen函数获取的,用于指定要写入的文件。数据可以是一个变量、表达式或字符串,可以使用格式说明符来指定写入数据的格式。 例如,如果要将一个整数data_out写入名为result.txt的文件中,可以使用以下Verilog代码: integer fouti; fouti = $fopen("result.txt"); // 打开文件 $fwrite(fouti, "%d", data_out, "\n"); // 写入数据 $fclose(fouti); // 关闭文件 上述代码中,首先使用$fopen函数打开result.txt文件并获取文件句柄。然后,使用$fwrite函数将data_out以%d的格式写入文件中,并在末尾添加一个换行符。最后,使用$fclose函数关闭文件。 请注意,Verilog中的文件操作函数通常用于仿真环境,用于在仿真过程中读取和写入数据到文件中,而不是用于硬件设计。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [【Verilog语法006】$fwrite文件操作](https://blog.csdn.net/qq_32752869/article/details/120088163)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Verilog部分系统函数用法](https://blog.csdn.net/weixin_38621214/article/details/83791445)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孤独的单刀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值