最近遇到项目中需要对外部信号进行处理后再进行输出,首先使用FPGA的仿真器对需要处理的信号进行了采样(采样速率100K),采样的目的是为了能够尽量真实的还原仿真过程中的激励。想法是通过建立testbench文件对该记录进行读取。
Verilog对文件进行读取的函数与C语言用法差不多,这里用的是 $fopen 、$ fread、$fclose。完成对信号文件的打开、读取、关闭。
integer fd;
fd = $fopen(FILE_TXT, “r“);
fd是一个$fopen返回的文件句柄(如果打开文件成功的话),如果不成功则返回零;
FILE_TXT文件路径的字符串;如 “D:==/Program Files (x86)/==data.txt”;注意其中的分隔符 “/” 与Windows系统下的分隔符并不一样,Windows下是“\”,使用错会打开文件失败。当然也可以使用相对路径**" …/ "**
“r”,是文件操作(同样是字符串)。r代表读,w代表写,“rb”代表读bin文件。
integer status;
status = $fread(,);
status = $fread(,, );
status = $fread(,, , );
status = $fread(,, , );
eg:
integer status;
reg input_a[7:0];
status = $fread(input_a,fd, 1, 2 );
status:读文件返回状态(正常读成功返回读到的字节数),不成功返回0。
上述式中的例子,意思是读取fd文件到寄存器input_a[1],input_a[2]中。
$fclose(fd);//关闭文件
`timescale 1ns/1ps
module tb_demo(
);
reg sys_clk; //时钟
reg sys_rst_n; //复位
reg Ua_two;
integer handlea,i;
wire Ua_two_tb;
wire Ub_two_tb;
wire Uc_two_tb;
initial
begin
sys_clk <= 1'b0;
sys_rst_n <= 1'b0;
#30
sys_rst_n <= 1'b1;
end
always #20 sys_clk <= ~sys_clk;
//1ns = 10^(-9)
//100k = 10^(-5)
//ipg 10^(4)
initial
begin
handlea = $fopen("J:/procm/UA_two.txt","r");
if(handlea == 0)
begin
$display("\n*********************open faild****************\n");
$stop;
end
$display("handlea: %h\n",handlea);
i=0;
repeat(8192) //txt有8291行
begin
$fscanf(handlea,"%b\n",Ua_two);
$display("%d : Ua_two: %h\n",i,Ua_two);
#1000;
i=i+1;
end
$fclose(handlea);
$finish;
end
demo demo_inst(
.sys_clk (sys_clk ),
.sys_rst_n (sys_rst_n ),
.Ua_two (Ua_two ),
.Ua_two_tb (Ua_two_tb )
);
endmodule
文件中数据形式为(UA_two.txt):
1
0
1
1
1
0
0
此时使用$fread进行读取会读取到行尾的\0。因此这里使用==$fscanf()==进行格式化读取。
$fscanf(handlea,"%b\n",Ua_two);
//handlea 为$fopen打开的文件句柄
//"%b\n"为格式化读取的格式
//Ua_two,读取到的reg