当需要对大量数据进行仿真验证时,可使用文件的读写方式验证;
1.仿真文件读取($readmemb,$readmemh)
1.1二进制文件读取
(1)$readmemb("<数据文件名>",<存储器名>);
(2)$readmemb("<数据文件名>",<存储器名>,<起始地址>);
(3)$readmemb("<数据文件名>",<存储器名>,<起始地址>,<终止地址>);
1.2十六进制文件读取
(1)$readmemb("<数据文件名>",<存储器名>);
(2)$readmemb("<数据文件名>",<存储器名>,<起始地址>);
(3)$readmemb("<数据文件名>",<存储器名>,<起始地址>,<终止地址>);
eg:
reg [7:0] bl_test_data[0:383];//定义寄存器数组用来缓存需要读取文件中的数据
initial
begin
$readmemh("H:/sim/bl_data/tem_filter_data_file_hex.txt",bl_test_data); //初始化时从 H:/sim/bl_data/tem_filter_data_file_hex.txt 中把数据读出并缓存到寄存器数组当中;
end
2.仿真文件写入($fopen,$fwrite, $fclose)
(1)$fopen ("<数据文件名>")打开文件;
(2) $fwrite (文件指针,"%h ",需写入的数据);//其中文件指针需要提前定义,%h表示十六进制,%d表示十进制,$fwrite与$fdisplay的区别是fwrite不自动换行可加n来换行,fdisplay可自动换行;$fwrite(“%d\n”)和$fdisplay(“%d”) 效果一样
(3)$fclose(文件指针);关闭文件,关闭后文件写入无效,写不进去;
(4)display(“need display data = %d ”,j);数据打印
eg
initial begin:block_0
integer lsf_data_hex;//定义数据指针lsf_data_hex
integer lsf_data_dex;//定义数据指针lsf_data_dex
integer j;
lsf_data_hex = $fopen ("H:/sim/dig_bl/lsf_data_hex.txt");//初始化时打开文件lsf_data_hex,文件不存在时自动生成文件;
lsf_data_dex = $fopen ("H:/sim/dig_bl/lsf_data_dex.txt");//初始化时打开文件lsf_data_dex,文件不存在时自动生成文件;
forever begin
@(posedge video_clk_in);
if(write_test_start)begin//满足条件是往文件中写入相关数据
for(j=0;j<8294400;j=j+1)begin
$fwrite (lsf_data_hex,"%h ",lsf_data_rd_mem[j]);
$fwrite (lsf_data_dex,"%d ",lsf_data_rd_mem[j]);
$display ("%d",j);
if(j == 8294399)begin//当写入文件的个数达到需求是关闭文件,后续的数据将写不进去,除非再次打开文件
$fclose (lsf_data_hex);
$fclose (lsf_data_dex);
end
end
end
end
end