verilog系统任务对文件的读写操作

来源:互联网 发布:众筹平台数据统计 编辑:程序博客网 时间:2024/05/30 05:09

 几个简单的系统任务,$readmemb,$readmemh,$fopen,$fdisplay;基本上就可以完成对文件的读写操作。

一、读任务
 在verilog语言中有两个系统任务$readmemb,$readmemh可以用来从文件中读取数据到存储器中。这两个任务可以在仿真的任何时刻被执行使用,其使用方法如下:$readmemb
1,$readmemb("<数据文件名(路径地址和文件名)>",<存储器名>);
2,   $readmemb("<数据文件名>",<存储器名>,<起始地址(存储器的地址)>);
3,   $readmemb("<数据文件名>",<存储器名>,<起始地址>,<结束地址>);
$readmemh
4,$readmemh("<数据文件名(路径地址和文件名)>",<存储器名>);
5,   $readmemh("<数据文件名>",<存储器名>,<起始地址(存储器的地址)>);
5,   $readmemh("<数据文件名>",<存储器名>,<起始地址>,<结束地址>);
这里需要注意的是:
1,存储器的空间要足够,如设定[7:0] remember[0:15];即是初始化了一个15个字长为8位的存储器;
2,文件中的数据是一次读到寄存器中的,仿真中通常使用数据文件来做信号源。并且读数据总是从文件起始地址读到结束地址结束,存储器容量要足够;
3,文件应为标准数据文件,如果文件只存放数据就默认第一个数据地址为初始地址;若第一个数据设定
@002
   11111111 10101011
@004
  10xz0011   1100101x
第0,和第1个数据没有写,系统读进存储器时默认为 xxxx_xxxx;
4,文件若只写文件名需要将文件放置在默认文件路径下,可以通过modelsim->file->changedirectory来更改。
二、写任务
  这里写任务用$fopen和$fdisplay两个系统任务完成,其中前者用来得到文件句柄,所谓句柄就是用来打开这个文件的读写通道,这里笔者在modelsim环境下试验了一下一旦用$fopen打开文件就会将文件清空。因此要读文件最好用$readmemb任务,写文件再用$fopen,注意最好新建个新文件来写,以免重要数据被清空。
 用$fopen取得想要写文件的句柄handle,然后我们desc=handle|1;(目的最低位置1)这样写文件时trancript框中也同样会输出;
用$fdisplay(desc,"display=%b",remember[k]);通过for语句就可以将原文件中的数据写到另一个文件中去了;
例子如下:
module rewr_test();
  reg [7:0]mem[0:15];
  integer k,handle2,desc;
  initial
    begin
      handle2=$fopen("file2.dat");
      $readmemb("file1.dat",mem);
      desc=handle2 |1;
      $display("handle2=%b desc=%b",handle2,desc);
      for(k=0;k<=15;k=k+1)
      begin
        $fdisplay(desc,"%b",mem[k]);
      end
    end
endmodule


  handle2是文件句柄,打开第一个文件句柄值为32‘h0000_0002;desc最后一位置1,transcript对话框中也有相应输出,打开文件发现file1.dat和file2.dat两文件一致。