Verilog ,SV文件操作

https://www.runoob.com/w3cnote/verilog2-file.html
经常使用的系统任务主要包括:

  • 文件开、闭:$fopen, $fclose, $ferror
  • 文件写入:$fdisplay, $fwrite, $fstrobe, $fmonitor
  • 字符串写入:$sformat, $swrite
  • 文件读取:$fgetc, $fgets, $fscanf, $fread
  • 文件定位:$fseek, $ftell, $feof, $frewind
  • 存储器加载:$readmemh, $readmemb

一、fopen fclose

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、文件写入

写文件的系统任务主要包括:$fdisplay, $fwrite, $fstrobe, $fmonitor,以及它们对应的自带格式的系统任务 $fdisplayb, $fdisplayh, $fdisplayo 等。

调用格式 任务描述
$fdisplay(fd, arguments) ; 按顺序或条件写文件,自动换行
$fwrite(fd, arguments) ; 按顺序或条件写文件,不自动换行
$fstrobe(fd, arguments) ; 语句执行完毕后选通写文件
$fmonitor(fd, arguments) ; 只要数据有变化就写文件
相对于标准显示任务 $display, $write, $strobe, $monitor,写文件系统任务除了用法格式上需要多指定文件描述符 fd,其余打印条件、时刻特性等均与其对应的显示任务保持一致。
在这里插入图片描述

 $fwrite(file_result[0], "%c",   data[7:0  ] 

//(2) write file
   integer fd ;
   integer err, str ;
   initial begin
      fd = $fopen("./DATA_RD.HEX", "a+");  //末尾追加的方式打开
      err = $ferror(fd, str);
      if (!err) begin
         $fdisplay(fd, "New data1: %h", fd) ;
         $fdisplay(fd, "New data2: %h", str) ;
         $fdisplay(fd, "New data3: %h", err) ;
         //$write(fd, "New data3: %h", err) ; //最后一行不换行打印
      end
      $fclose(fd);
   end

在这里插入图片描述

三、文件读取

file_read_functions ::=
$fgetc ( fd )
| $ungetc ( c , fd )
| $fgets ( str , fd )
| $fscanf ( fd , format , args )
| $sscanf ( str , format , args )
| $fread ( integral_var , fd )
| $fread ( mem , fd [ , [ start ] [ , count ] ] )

在这里插入图片描述

1. $fgetc

$fgetc 从文件中读取一个字符, 每执行一次$fgetc,就从文件中读取一个字符, 文件的指针自动加一。 当读取到文件结束时, $fgetc 返回 -1, 可以通过-1(EOF) 来定位文件读取结束。

A single character can be read from a file using $fgetc. For example:
Example 1:
integer c;
c = $fgetc ( fd );

2. $ungetc

Example 2:
integer code;
code = $ungetc ( c, fd );

$ungetc inserts the character specified by c into the buffer specified by file descriptor fd. The character c shall be
returned by the next $fgetc call on that file descriptor. The file itself is unchanged.

3. $fscanf

按照格式将文件中的数据读到变量中, 格式可以参考$display 中的格式化内容。如果遇到空格或者换行,表示一次读取结束。 读取时,如果发生错误 则返回值为0,正常读取数据时为1, 读取文件结束时为-1。

4. $fread

$fread
integer ;
= $fread(,<file_desc>);
= $fread(,<file_desc>, );
= $fread(,<file_desc>, , );
= $fread(,<file_desc>, , );
integer:整型数值,返回本次$fread 读取的真实字节数量,当返回值为0 ,表示错误读取或者文件结束。
store:将二进制文件中的数据读取到寄存器或者二维数组中。
file_desc:为打开的文件句柄
start: 为二维数组的起始地址
count: 从起始地址开始, 写入二维数组的数量。
在这里插入图片描述

四、文件定位

https://www.runoob.com/w3cnote/verilog2-file.html
在这里插入图片描述

  • 文件定位:$fseek, $ftell, $feof, $frewind

1. $fseek 使用 (转 )

= $fseek(<file_desc>, <offset_value>, <operation_number>);

integer:定义整型变量,用于 f s e e k 的返回值。如果 fseek的返回值。如果 fseek的返回值。如果fseek成功执行,返回0; $fseek执行失败,返回-1。
file_desc:为打开的文件句柄
offset_value:相对于文件的参考指针,偏移的位置, 可以是正数,也可以是负数。
operation_number:定位文件指针的起始位置。 0,文件的起始位置;1,文件的当前位置; 2 文件结束的位置。

`timescale 1ns / 1ps
module sim_top(
 
    );
reg stop_flag = 0;
 
localparam  F_START = 0,
            F_CURR = 1,
            F_END = 2;
            
localparam FILE_TXT = "../../../test.txt";
integer fd;
integer ret;
integer i;
integer pos;
reg [7:0]   fbuf = 0;
initial begin
    i = 0;
    ret = 0;
    fd = $fopen(FILE_TXT, "r");
    if(fd == 0)
    begin
        $display("$open file failed") ;
        $stop;
    end
    $display("\n ============= file opened... ============= ") ;
 
    ret = $fseek(fd, 1,F_START);
    if($signed(ret) == -1)
    begin
        $display("$fseek failed") ;
        $stop;
    end
    
    pos = $ftell(fd);
    $display("pos = %d", pos) ;
 
    fbuf = $fgetc(fd);
 
    pos = $ftell(fd);
    $display("pos = %d", pos) ;
 
    #10;
    $write("%c", fbuf) ;
    i = i + 1;
 
    ret = $fseek(fd, -5,F_END);
    if($signed(ret) == -1)
    begin
        $display("$fseek failed") ;
        $stop;
    end
    
    while ($signed(fbuf) != -1)
    begin
        fbuf = $fgetc(fd);
        #10;
        $write("%c", fbuf);
 
        i = i + 1;
    end
    
    #10;
    $fclose(fd) ;
    $display("\n ============= file closed... ============= ") ;
    stop_flag = 1;
    #100;
    $stop;
end
    
endmodule

ret = $fseek(fd, 1,F_START); 是从文本文件的起始位置,向后偏移一个字节。 然后开始读取文本文件的数据;ret = $fseek(fd, -5,F_END); 是将文件指针定位到文件结束的位置,向前偏移 5 个字节, 然后开始读取文本文件的数据。

2. $ftell使用

获取文件位置
= $ftell(<file_desc>);

  • reg:返回文件当前位置距离文件首部的偏移位置,初始位置为0.
  • file_desc:为打开的文件句柄
  • 这个系统函数的作用是找到当前的位置(距离文件首部),是以字节为单位的。
  • 配合 $fseek 使用。

可以看到,$fseek (fd, 1, F_START); 后 使用 pos = $ftell(fd); 输出为1; 在读取一个字节后(fbuf = $fgetc(fd);), 再使用 pos = $ftell(fd),输出结果为 2。

3. $feof使用

= $feof(<file_desc>);
reg:检查文件指针是否到达文件尾部, 如果到达文件尾部,返回1; 否则返回0;
file_desc:为打开的文件句柄

五、Verilog 显示任务

关键词:$display, $write, $strobe, $monitor

在这里插入图片描述

1. $display,$write

在这里插入图片描述

$display与$write的区别是:$display会在每次显示信息后自动换行,$write不会换行。

2. $strobe

在这里插入图片描述
$strobe
$strobe 为选通显示任务。$strobe 使用方法与 $display 一致,但打印信息的时间和 $display 有所差异。

当许多语句与 $display 任务在同一时间内执行时,这些语句和 $display 的执行顺序是不确定的,一般按照程序的顺序结构执行。

$strobe 则是在其他语句执行完毕之后,才执行显示任务。该时间是当前仿真时间的结束时间

3. $monitor

$monitor 为监测任务,用于变量的持续监测。只要变量发生了变化,$monitor 就会打印显示出对应的信息。

reg [3:0]    cnt ;
   initial begin
      cnt = 3 ;
      forever begin
         # 5 ;
         if (cnt<7) cnt = cnt + 1 ;
      end
   end

   initial begin
      $monitor("Counter change to value %d at the time %t.", cnt, $time);
   end

六、Memory load/dunp tasks

$readmemh和$readmemb

在这里插入图片描述

Verilog文件读写是指在Verilog编程中,读取或写入文件的操作。这些文件可以是文本文件、二进制文件或其他格式的文件。在Verilog中,可以使用$readmemh和$readmemb函数来读取文本文件,$fread和$fwrite函数来读写二进制文件。

$readmemh和$readmemb函数用于读取文本文件中的十六进制或二进制数据。这些函数的语法如下:

$readmemh(filename, arrayname);

$readmemb(filename, arrayname);

其中,filename是要读取的文件名,arrayname是要将数据存储到的数组名。例如,以下代码将从名为“data.txt”的文件中读取十六进制数据,并将其存储到名为“data”数组中:

reg [31:0] data[0:255];

$readmemh("data.txt", data);

$writememb $writememh

在这里插入图片描述

七、Command line input

$test$plusargs 是SystemVerilog中用于获取命令行参数的系统任务。它允许你在运行仿真时从命令行传递参数给仿真器。这在调试和配置仿真环境时特别有用。

以下是一个简单的示例,说明了如何使用 $test$plusargs:

module testbench;

  initial begin
    string arg_value;
 
    if ($test$plusargs("input_file=%s", arg_value)) begin
      $display("Input file specified: %s", arg_value);
      // 在这里可以处理输入文件名
    end else begin
      $display("No input file specified");
    end
  end

endmodule

在这个例子中,$test$plusargs 任务尝试从命令行参数中匹配指定的格式,如果匹配成功,它会将参数值赋给指定的变量,并返回1。如果没有匹配成功,则返回0。

例如,如果你运行仿真器时输入以下命令:

vsim -c -do "run -input_file=test.txt" testbench

那么 $test$plusargs 将匹配 -input_file=test.txt,并将test.txt保存到arg_value中。

希望这个简单的示例能够帮助你理解 $test$plusargs 的使用。如果你有其他问题,欢迎继续提问。

————————————————————————————————————————————————————————
在 SystemVerilog 中,$value$plusargs 是用于从命令行参数中获取一个带有特定格式的字符串值的系统函数。这个函数可以用于从仿真器的命令行中提取特定格式的参数值,然后在仿真过程中使用这些值。

下面是一个简单的示例,展示了如何使用$value$plusargs

module testbench;

  string input_file;
  int debug_level;

  initial begin
    if ($value$plusargs("input_file=%s", input_file)) begin
      $display("Input file specified: %s", input_file);
    end
    if ($value$plusargs("debug_level=%0d", debug_level)) begin
      $display("Debug level specified: %0d", debug_level);
    end
  end
endmodule

在这个例子中,$value$plusargs 函数尝试从命令行参数中匹配指定的格式,并将匹配的值赋给相应的变量。如果匹配成功,则函数返回1;否则返回0。

例如,如果你在运行仿真器时输入以下命令:

vsim -c -do "run -input_file=test.txt +debug_level=2" testbench

那么 $value$plusargs 将匹配 -input_file=test.txt+debug_level=2,并将分别将test.txt保存到input_file中,将2保存到debug_level中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值