FPGA开发中Testben读取外部文件的方式
1. 文件读写的作用
为什么需要使用Verilog语言读取/写入文件呢,主要是由于我们有时候需要将数据准备和分析的工作从Testbench中隔离出来,便于协同工作,需要调试一些寄存器的值,就需要通过文本中获取数据,然后来调试Verilog程序;这些文本信息可以通过C/C++、Excel表格、Matlab等工具,因此,在代码测试的时候会文件的输入和输入的语法有助于你分析你的程序逻辑是否正确。
2. Testbench文件包括哪些操作
(1)打开文件
系统函数$fopen用于打开一个文件,将文件和integer指针关联,语法如下:
integer file_point = $fopen(file_name); 这里的 file_name 是一个路径,文件名存储的路径,用双引号“”包括。
你可以使用相对路径也可以使用绝对路径,一般将文件放在工程testbench文件同一级的目录下,你只需要在双引号之中写入文件名即可。
(2)关闭文件
系统任务$fclose用于关闭一个文件,格式如下:
$fclose(file_point);
(3) 从文件中读取数据
从文件中读取数据有两类方法,第一类为$fscanf系统任务,第二类为$readmemb 和 $readmemh,上述两种任务都可以从文本文件中读取数据,并将数据加载到存储器,被读取的文件可以包含空白空间、注释、二进制(如$readmemb)或十六进制(如$readmemh)数字,每个数字用空白空间隔离
下面将一下两种类型的语法
【$fscanf】
integer file, count;
count = $fscanf(file, format, args);
【$readmemb 】
readmemb( "文件名", 存储器名, 起始地址,终止地址);
【$readmemh】
readmemh( "文件名", 存储器名, 起始地址,终止地址);
3、文件操作的实例
写一个从文件中读取数据的操作,以十六进制方式读取一个文本文件1.txt中的内容:
readmemh_demo.v 文件
`timescale 1ns/1ps
module readmemh_demo;
parameter data_period = 4; //每个数据占据4个字节
parameter data_num = 15; // 读取数据的个数
parameter BUF_SIZE = 32; // 保证能存放字符的最大值,位宽
// read_buf
reg [BUF_SIZE-1:0] read_buf[0:data_num -1];
reg [BUF_SIZE-1:0] data;
// 读取文本信息,采用$readmemh,将文本信息放到read_buf中
initial $readmemh("1.txt", read_buf);
// 显示读取的内容
integer i = 0;
initial begin
#(data_period);
$display("Content of read_buf after reading data file:");
for(i = 0; i<data_num; i = i+1)begin
#(data_period);
data = read_buf[i];
$display("%d:%h", i, read_buf[i]);
end
end
endmodule
创建modelsim工程
编译-》运行仿真-》run all
结果如下:
这时候的文本内容为:
波形图: