Menu Close

Verilog 文件操作-$fopen,$fclose

在Verilog 仿真工程中, 有时我们需要从操作系统上得到相关的数据,有时需要将仿真数据保存到操作系统中。由于操作系统上的数据都是以文件方式保存的,这就需要Verilog 仿真的系统函数来完成相应的操作。本文我们主要讨论Verilog 仿真文件操作中的打开,关闭操作。$fopen,$fclose,$ferror。 关于Verilog 仿真中的文件操作,只能在仿真中使用, 不能用于FPGA 的综合。

$fopen:

语法:

integer <file_desc>;
<file_desc> = $fopen("<file_name>", "<file_mode>");
  • file_desc :为文件的句柄,反映文件打开是否成功, 如果file_des == 0, 文件打开失败; 如果file_des != 0, 文件打开成功。
  • file_name : 是在操作系统中的文件名称。
  • file_mode:  是以什么样非方式打开操作系统中的文件。

file_mode 列表:

file_mode 描述
r 打开ASCII文本文件(文件必须存在,而且只能读文件内容)
rb 打开Binary 二进制文件(文件必须存在, 而且只能读文件内容)
w 为写操作,打开全新的ASCII文本文件,删除之前就存在这个文件。(只能对文件写操作)
wb 为写操作,打开全新的Binary 二进制文件,删除之前就存在这个文件。(只能对文件写操作)
a 打开ASCII文本文件,位置在打开的文件结尾处。(可以在打开的文件后, 继续添加文件内容)
ab 打开Binary 二进制文件,位置在打开的文件结尾处。(可以在打开的文件后, 继续添加文件内容)
r+ 打开ASCII文本文件(可以对文件进行读写操作)

举例:

integer fd;
fd = $fopen("test.txt", "r");
if(fd != 0)
begin
    $display ("Could not open File");
    $stop;
end

定义文件句柄 fd;

打开文件test.txt,以文本方式只读打开;打开的test.txt 必须在仿真工程的缺省目录中。

如果文件打开失败,显示输出错误信息。

integer fd;
fd = $fopen("c:/my_prj/test.txt", "r");
if(fd != 0)
begin
    $display ("Could not open File");
    $stop;
end

以文本方式打开c 盘下,my_prj 目录中的test.txt文件。这样就可以重定向文件的位置,注意,这里使用的是’/‘  而不是’\‘ 来定位文件。一般情况下, 打开文件时,需要检查打开的文件句柄,以确定文件是否打开成功。

 

$fclose:

语法:

$fclose(<file_desc>);

file_desc 为文件句柄, 这个句柄为之前使用$fopen 系统函数所打开的文件句柄。

$fclose 是将已经打开的文件,关闭掉。

`timescale 1ns / 1ps
module sim_tb();
localparam FILE_NAME = "../../../led_sim.sim";
integer file_handle = 0;

initial 
begin
    file_handle = $fopen(FILE_NAME,"r");
    $display("file_handle = %d ",file_handle);
    if(!file_handle)
    begin
        $display("Could not open File \r");
        $stop;
    end
 
    $fclose(file_handle);    
end

endmodule

首先,使用$fopen 打开文件; 文件使用结束后, 使用$fclose 关闭文件。

`timescale 1ns / 1ps

module sim_top();

integer fd0 = 0;
integer fd1 = 0;    
localparam FILE_NAME = "../../../led_sim.sim";
initial 
begin
    fd0 = $fopen(FILE_NAME,"r");
    $display("fd0 = %d ",file_handle);
    if(!fd0)
    begin
        $display("Could not open fd0 file \r");
        $stop;
    end

    fd1 = $fopen("test.txt", "r");
    if(fd1 == 0)
    begin
        $display("Could not open fd1 file");
        $stop;
    end

 
    $fclose(fd0);    
    $fclose(fd1);
    
end

endmodule在

 

在仿真中, 可以打开很多文件, 在各个文件的使用后, 可以根据需要的顺序关闭,不一定按照打开文件的顺序执行。

注意:

Verilog‐1995中在文件的输入/输出操作方面功能非常有限,并且规定同时打开的I/O文件数不能多于31个。

Verilog‐2001增加了新的系统任务和函数,并且规定同时打开的文件数目为230个。

Posted in FPGA, FPGA, Verilog, Verilog, 教材与教案, 文章

发表评论

相关链接