为什么要用?
在使用数字图像IC设计中,往往需要测试所设计的图像处理模块的功能,此时模块的输入端数据时序要求比较复杂,因此需要通过testbench按照一定的时序关系读取外部的文件中的数据,或者模块计算完后需要将输出的数据导出到外部文件中进行存储。
Verilog 提供了很多可以对文件进行操作的系统任务
文件开、关:$fopen , $fclose , $ferror
文件写入 :$fdisplay , $fwrite , $fstrobe , $fmonitor
字符串写入:$sformat , $swrite
文件读取 :$fgetc , $fgets , $fscanf , $fread
文件定位 :$fseek , $ftell , $feof , $frewind
存储器加载:$readmemh , $readmemb
如何使用?
- 文件打开: fd = $fopen("filename",mode)
其中 fd : 为返回的32bit文件描述符 (打开错误时fd为0)
filename : 打开文件的名字
mode : 用于指定文件的打开方式
r 只读打开一个文本文件,只允许读数据。
w 只写打开一个文本文件,只允许写数据。如果文件存在,则原文件内容会被删除。如果文件不存在,则创建新文件。
a 追加打开一个文本文件,并在文件末尾写数据。如果文件如果文件不存在,则创建新文件。
rb 只读打开一个二进制文件,只允许读数据。
wb 只写打开或建立一个二进制文件,只允许写数据。
ab 追加打开一个二进制文件,并在文件末尾写数据。
r+ 读写打开一个文本文件,允许读和写
w+ 读写打开或建立一个文本文件,允许读写。如果文件存在,则原文件内容会被删除。如果文件不存在,则创建新文件。
a+ 读写打开一个文本文件,允许读和写。如果文件不存在,则创建新文件。读取文件会从文件起始地址的开始,写入只能是追加模式。
rb+ 读写打开一个二进制文本文件,功能与 "r+" 类似。
wb+ 读写打开或建立一个二进制文本文件,功能与 "w+" 类似。
ab+ 读写打开一个二进制文本文件,功能与 "a+" 类似。
- 文件关闭: fd = $fclose(fd)
其中 fd : 需要关闭的对应文件 - 文件写入
$fdisplay(fd, arguments) ; 按顺序或条件写文件,自动换行
$fwrite(fd, arguments) ; 按顺序或条件写文件,不自动换行
$fstrobe(fd, arguments) ; 语句执行完毕后选通写文件
$fmonitor(fd, arguments) ; 只要数据有变化就写文件
例子:$fdisplay(fd, "New data1: %h", fd) ;
- 字符串写入
$swrite(reg, list_of_arguments) ;
按顺序或条件写字符串到变量 reg 中
len = $sformat(reg, format_str, arguments) ;
按格式 format_str 写字符串到变量 reg 中格式与 $display 指定格式时一致不建议省略第二个参数 format_str可返回字符串长度 len。 - ★★★文件读取
按字符读文件 c = $fgetc( fd ) ;
按字符格式将 fd 数据输出给变量 c,c 位宽最少为 8
按字符写缓冲区 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 变量填充满一次数据后便会停止读取