在Verilog仿真工程中,有时我们需要从系统上得到相关的数据,有时需要将仿真数据保存到操作系统中,由于台式机可以读取或存储数据到本地硬盘。由于操作系统上的数据都是以文件方式保存,这就需要利用Verilog仿真系统函数来完成相应的操作。
本文我们主要讨论Verilog仿真文件操作中的常用操作。关于Verilog仿真中的文件操作,只能在仿真中使用,不能用于FPGA的综合,因此一般用于testbench文件中。
Verilog文件操作具体用法见菜鸟教程,点击本字段即可
$fopen
语法:
integer <file_desc>; //integer变量,用于存储文件打开后的整数值,用于操作文件的句柄
<file_desc> = $fopen("<file_name>", "<file_mode>");
- file_desc:文件的句柄,反应文件打开是否成功,如果file_desc==0,文件打开失败;如果file!=0,文件打开成功
- file_name:要打开的文件名
- file_mode:指定以什么样的方式打开
file_mode列表
注意:
1.使用方式中"b"后缀表示进行操作的对象为二进制文件,但是在很多系统中对二进制并不去做区分
2.如果$fopen()中未指定文件访问方式,那么该文件将默认为以可写方式被打开
$fclose
语法:
task $fclose(integer file_descriptor)
如果使用$fopen打开文件后程序中并没有执行$fclose的话(特别是对文件的写操作),
那么只有在仿真器关闭后,相应的内容才会更新至对应的文件中,因为,
建议在编写程序时,$fopen和$pclose成对出现。
$feof
feof是检测流上的文件结束符的函数,如果文件结束,则返回非0值,否则返回0
一般在文件操作中经常使用feof()判断文件是否结束
integer file_conf;
file_conf = $fopen(filename, "r");
while(!$feof(file_conf))begin
...
end
$fgets
<integer> = $fgets(<string_reg>, <file_desc>)
integer c;
reg [*:0] line
c = $fgets(line, file_conf)
- integer:定义一个整型数值,用来保存读取文件的当前行有多少个字节。如果读出的字节为0,表示文件读取结束或者读取错误(空行也能读取到一个字节)
- string_reg:声明字符串变量,用来保存从文件中读取的数据
- file_desc:为打开的文件句柄
$sscanf
将字符串按照某个模板格式进行扫描,其字符串格式和C语言中的printf()函数类似
$sccanf的三个参数,第一个是扫描对象,第二个是扫描格式,第三个是提取出来的参数。它是具有返回值的,如果扫描不成功则返回0,如果扫描成功,每提取一个数据(即args的个数),则返回值加1。提取不会改变str值,除非将str作为args。