當需要對大量數據進行仿真驗證時,可使用文件的讀寫方式驗證;
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