欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

7.2 Verilog 文件操作 |-实例

最编程 2024-01-09 16:24:51
...
   //(3) write string
   reg [299:0] str_swrite, str_sformat;
   reg [63:0] str_buf ;
   integer    len, age ;
   initial begin
      #20 ;
      str_buf   = "runoob!" ;
      age       = 9 ;

      //$swrite 指定格式写包含变量的字符串
      $swrite(str_swrite, "%s age is %d", str_buf, age) ;
      $display("%s", str_swrite);
      //$swrite 直接写不含有变量的字符串
      $swrite(str_swrite, "years ", "old.") ;
      $display("%s", str_swrite);
      //$swrite 不指定格式写包含变量的字符串,不建议
      $swrite(str_swrite, age) ;
      $display("$swrite err test: %d", str_swrite);

      $display();
     //$sformat 指定格式写包含变量的字符串
      $sformat(str_sformat, "I have learnt in %s", str_buf) ;
      $display("%s", str_sformat);
      //$sformat 直接写不含有变量的字符串,并获取字符串长度
      len = $sformat(str_sformat, "for 4 years!") ;
      $display("%s", str_sformat);
      $display("$sformat len: %d", len);
      //$sformat 直接一次写多个不含有变量的字符串,不建议
      $sformat(str_sformat, "for", "4", "years!") ;
      $display("$sformat err test: %s", str_sformat);
   end

忽略打印信息的空格,调试信息输出如下:

由此可知,$sformat 与 $swrite 用法可以一致,例如 $sformat 可采用指定格式的写字符串,或只写一次不含变量的字符串。此时 $sformat 相当于在第二个参数中未指定变量类型,所以第三个参数应该忽略不写。

$swrite 还可以一次写多个不包含变量的字符串,而 $sformat 不允许如此调用。

也建议,使用 $swrite 写包含变量的字符串时要指定变量类型,否则结果可能不可预测。

文件读取

系统任务 调用格式及说明  
按字符读文件 c = $fgetc( fd ) ;  
  按字符格式将 fd 数据输出给变量 c,c 位宽最少为 8
读取错误时 c 值为 EOF(-1),可以用 $ferror 检查错误类型
 
按字符写缓冲区 code = $ungetc(c, fd ) ;  
  向文件 fd 缓冲区写字符 c
c 值在下次调用 $fgetc 时返回,文件 fd 自身内容不会发生变化
正常写缓冲时返回值 code 为 0,发生错误时返回值 code 为 EOF
 
按行读文件 code = $fgets(str, fd)  
  按字符连续读,直至变量 str 被填满,或一行内容读取完毕,或文件结束
正常读取时返回值 code 为读取行数(次数),发生错误时 code 为 0
 
按格式读文件 code = $fscanf(fd, format, args) ;  
  按格式 format 将文件 fd 中的数据读取到变量 args 中
format 可参考 $display 指定格式说明
读取一次的停止条件为空格或换行
读取发生错误时返回值 code 为 0
 
按格式读字符串 code = $sscanf(str, format, args) ;  
  按格式 format 将字符串型变量 str 读取到变量 args 中
调用格式方法和 $fscanf 一致
 
按二进制读文件 code = $fread(store, fd, start, count) ;  
  按二进制数据流格式将数据从文件 fd 读取到数组或寄存器变量 store 中
start 为文件起始地址,count 为读取长度
若 start/count 未指定,数据会全部填充至变量 store 中
若 store 为寄存器类型,则 start/count 参数无效,store 变量填充满一次数据后便会停止读取
 
以"文件写入"仿真中的文件 DATA_RD.HEX 为读取的参考文件,进行举例,该文件内容如下。
c0dec0de
5555aaaa
12345678
aaaa5555
New data1: 80000003
New data2: 00000000
New data3: 00000000

$fgetc,$ungetc 调用举例