原文网站: 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个。