fscanf函数的功能,verilog $fscanf
Verilog写testbench时,常用的系统函数有d i s p l a y,display,display,fopen,f c l o s e,fclose,fclose,fwrite和$ fmmonitor。但是,用于读取文件中数据的fread、
fscanf
和fgets相对较少。今天需要读取文件中的二进制数据,每次只读取文件中的一行,输出数据。经过几个小时的折腾,我决定写这篇博文,记录从对系统功能一无所知到正确使用的艰难历程。首先介绍一下fscanf函数的基本功能。网上找到的详细介绍基本都差不多。
$fscanf(文件指针,读取格式,数组)该系统函数每次读取文件中的每一行数据
,这当中需要特别注意一点,每一行只能是数据,例如:0011_0001,如果出现0b0011_0001,则无法正常的读取
,而对于新手来说,不知道为什么,就是觉得很奇怪。甚至有些新手觉得这个系统功能太没用了,其实是自己的无知。纵观这一时期的人类简史,书中提到保持无知是一件重要的事情,但需要转化为追求知识的动力,就像参与科技革命的欧洲人一样;接下来结合自己的理解说说系统功能,
文件指针:指向某一文件的开头
。举个栗子,f_r=$ fopen (xxx.txt , r ),文件指针f_r指向xxx.txt文件的开头。读取格式:%d %b %h为分别表示十进制、2进制、16进制
。数组:存放从xxx.txt读取的数据
比如xxx.txt第一行存储0011_0001,那么数组a=0011_0001。此时,如果数组A中的数据没有被及时处理(写入另一个文件或给寄存器reg1),当读取xxx.txt文件中下一行(1111_1111)的数据时,数组A中先前存储的数据将是覆盖
,即此时数组A中的数据将是1111_1111。诸如此类。使用文件后记得关闭它,并使用fclose系统函数。很好奇fscanf函数的返回值是什么?modelsim仿真结果表明,它应该涉及一次读取数据的次数。例如,count=$ fscanf (fp _ r, % b ,img _ rgb _ dat _ reg)返回值1,一次只读取一个数据。可以肯定的是,和要操作的文件内容绝对没有关系。函数的返回值通常通过以下方式获得:整数=计数;count=$fscanf(fp_r, %b ,reg 1);//fp_r文件指针,%b读取格式,reg1: array这里有一点值得讨论,就是数组。在上一节中,我们谈到了用于存储文件中读取的数据的数组,数组中的数据如果不及时处理就会被覆盖。说到数组,就不得不说说位宽了。例如,reg [7:0]reg1表示定义了一个8位的数组,最多只能存储8位的数据。如果读取的数据少于8位,则在数据前面加零(pro-test)。另一种情况,我们没有测试。我相信我们不会报错。应该是数据位丢失。
这里的数组与readmenb函数的中使用的数组有很大区别
。这里不太讲readmenb。有兴趣的可以查看这个链接的内容:https://blog.csdn.net/weizhl10131729/article/details/78556489.在这里,建议使用python对符合要求的数据进行处理,然后使用Verilog进行一系列操作。罗在讲解一个系统功能之前讲了很多,但是我觉得我应该有一个比较清晰的思路,用我的方式去学习其他的系统功能。本文仅提供一种学习方式。
显然在学习一个函数关键要知道,该函数可以用来做什么,函数的输入是什么,每个参数对应的含义和需要注意的地方、函数的返回值时是什么。
贴上最后一个例子和我学习这个函数时参考的网络资料的链接:https://blog.csdn.net/cxc19890214/article/details/41146531.这个例子来自我写的testbench的部分,有些信号不需要忽略。看