verilog modelsim 对文件进行仿真读写

当需要对大量数据进行仿真验证时,可使用文件的读写方式验证;

 

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

posted @ 2021-06-04 19:38  Clark_2021  阅读(2560)  评论(0编辑  收藏  举报