1.文件指针定义
一般使用integer进行定义
integer file,file1;
file = $fopen("数据文件1.txt","r"); //只读
file1 = $fopen("数据文件2.txt","w"); //只写
文件操作模式 | 功能 |
---|---|
r | 只读打开一个文本文件,只允许读数据。 |
w | 只写打开一个文本文件,只允许写数据。如果文件存在,则原文件内容会被删除。如果文件不存在,则创建新文件。 |
a | 追加打开一个文本文件,并在文件末尾写数据。如果文件如果文件不存在,则创建新文件。 |
rb | 只读打开一个二进制文件,只允许读数据。 |
wb | 只写打开或建立一个二进制文件,只允许写数据。 |
ab | 追加打开一个二进制文件,并在文件末尾写数据。 |
r+ | 读写打开一个文本文件,允许读和写 |
w+ | 读写打开或建立一个文本文件,允许读写。如果文件存在,则原文件内容会被删除。如果文件不存在,则创建新文件。 |
a+ | 读写打开一个文本文件,允许读和写。如果文件不存在,则创建新文件。读取文件会从文件起始地址的开始,写入只能是追加模式。 |
rb+ | 读写打开一个二进制文本文件,功能与 “r+” 类似。 |
wb+ | 读写打开或建立一个二进制文本文件,功能与 “w+” 类似。 |
ab+ | 读写打开一个二进制文本文件,功能与 “a+” 类似。 |
一般我们在写测试文件的时候,输入量大并且较复杂的时候就需要将数据打印出来,一般我都是使用MATLAB进行打印,存成TXT格式,而在测试时,需要将读出的数据存到寄存器数组当中,然后再将寄存器数组的数据输入到例化模块的输入端中。
2.将数据文件的数据读入寄存器中
2.1语法
在看这些操作之前需要先说明一下选择结构以及循环结构的一些简单的语法的,这些实际上与C语言类似,都是if、for、while这些,只不过C语言中是将两行以及两行以上的代码用{}来加以说明,而在verilog测试代码中是begin end来说明的
if( xx )
begin
xxx;
end
else
begin
xxx;
end
for(i = 0; i <= xxx ; i++)
begin
xxx;
yyy;
end
while( xx )
begin
xxx;
end
2.2读数据
所以一般我们要将数据存到寄存器时可以用下面的方法(以下代码与上面代码属于同一个文件中,所以一些参数或指针在前面定义了的在下面就不定义了)(同时也要注意,所有的寄存器和wire定义不能在initial中定义,要在外面进行定义)
parameter data_with = 8;
parameter addr_with = 6
integer temp;
integer i;
reg [data_with-1:0] orig_data[0:addr_with-1];// addr_with是地址宽度,data_with是数据宽度
initial
for(i=0 ; i <= addr_with-1 ; i=i+1)
begin
temp = $fscanf(file,"%d",orig_data[i]); //每次读取一个数据,以空格或回车以及tab为区分。
end
begin
当然,如果不知道数据有多少,在读数据的时候一般需要判断数据是否读取结束
while(!$feof(file)) //结束返回1,否则返回0
begin
...;
end
5.仿真数据存入外部文件中
一般我们将复杂的数据写入寄存器中,然后经过一些处理之后就可以将数据输入到例化模块中了,有些时候我们需要将仿真输出的数据打印出来进行分析。
reg dataout;
$fwrite(file1,"data is success :%d\n",dataout); //%d就是数据类型。其他方式与C语言类似
或者一次写入多个数据
reg dataout1,dataout2,dataout3,dataout4;
$fwrite(file1,"data is success :%d , %d , %d , %d\n",dataout1,dataout2,dataout3,dataout4); //%d就是数据类型。其他方式与C语言类似
4.关闭文件和打印信息
在读取完数据之后一定要关闭文件
$fclose(file);
当然我们在测试debug的时候需要知道程序运行到哪里去了,因此每处理完一组数据的时候就需要打印一些信息,帮助我们了解代码的运行情况。
打印信息的代码如下
$display("Running testbench"); //假设前面的数据已经准备好了,我们就可以开始正常的仿真代码了。
5.仿真顺序说明
在这些仿真操作代码中,在#xx这种代码之间的代码,相对于实际的仿真是没有延时的,也就是在仿真中属于某一时刻。
下面例子:
initial
begin
rst = 0;
clk = 0;
en = 0; //上面这三行是在时刻 0 进行赋值的
#20
rst = 1; //下面这三行是在时刻 20 进行赋值的
en = 1;
end