verilog中读写文件操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Buyi_Shizi/article/details/52614221

简述

在verilog设计验证中,我们经常需要从文件中读取验证数据,有些数据是文本文件,有些数据是二进制文件。但是verilog读写文件的操作和软件语言还是有不同的,下面就具体总结一下verilog中的读写文件的操作。

读写二进制文件

不管是读写二进制文件还是读写文件文件,都要把读取到的数据放入到硬件设计中某个寄存器或者存储器中,这是verilog和软件语言读写文件最大的不同。
其实verilog读写文件的过程和普通的软件语言大同小异,都分为下面几步:

  • 打开文件

  • 重定位文件(可选)

  • 文件读写操作

  • 关闭文件

下面是一个具体的读文件的实例:

initial
begin
always @( negedge rstn_i or posedge clk_i )
begin
if ( rstn_i == 1’b0 )
begin
data_i <= {DW{1’b0}};
file_id = fopen(../2test/2data/paramdatabend.bin,r);readnum=0;exchangenum=0;endelseif(eni==1b1)beginif(readnum!=PACKAGENUM)beginreadnum<=readnum+1;endelsebeginreadnum<=1;exchangenum<=exchangenum+1;endr= fread( data_i, file_id );
end
if( read_num == PACKAGE_NUM-1 )
begin
//en_i <= 1’b0;
// fclose(fileid);//fileid= fopen( “../2-test/2-data/param_data_bend.bin”,”r” );
r = fseek(fileid,exchangenumMATRIXLENFW/8,SEEKSET);r= fread( weight_compare, file_id );
#10;
if( weight_compare == weight )
display(weightdatacheck\033[31mpassed\033[0m.);else display( “weight data check \033[31mfailed\033[0m.” );
end

在上面的程序中,我们是打开了一个二进制文件param_data_bend.bin,然后进行读取操作$fread(data_i, file_id ),注意这个fread的参数顺序和网上说的都不一样,就这一点耽误了我很长时间,第一个应该是变量,第二个是文件句柄。由于在上面的程序中,数据不是一次性读完,所以我们又有一个重定位的操作$fseek(file_id,exchange_num*MATRIX_LEN*FW/8,SEEK_SET),这里也是有一点必须要注意,就是fseek函数必须有返回值,狗则vcs一直编译不通过,对于这个我也是非常费解,为何还会有这样奇葩的规定。
上面就是关于verilog读取二进制数据的具体过程,读取文本文件会在以后总结。

猜你喜欢

转载自blog.csdn.net/Buyi_Shizi/article/details/52614221
今日推荐