目录
一、$readmemb/$readmemh
二、$fopen,$fwrite,$fclose
三、仿真验证
四、参考
一、$readmemb/$readmemh
$readmemb和$readmemh用来从文件中读取数据到存储器中。读取的内容只包括:空白位置(空格、换行、制表格(tab和form-feeds),注释行、二进制或十六进制的数字。
数字中不能包含位宽说明和格式说明,其中readmemb要求每个数字是二进制数,readmemh要求每个数字必须是十六进制数字。数字中不定值x或X,高阻值z或Z,和下划线(_)的使用方法和代表意义与一般Verilog HDL程序中的用法一致。
在Verilog语法中,一共有以下六种用法:
- (1)$readmemb("<数据文件名>",<存储器名>);
- (2)$readmemb("<数据文件名>",<存储器名>,<起始地址>);
- (3)$readmemb("<数据文件名>",<存储器名>,<起始地址>,<终止地址>);
- (4)$readmemh("<数据文件名>",<存储器名>);
- (5)$readmemh("<数据文件名>",<存储器名>,<起始地址>);
- (6)$readmemh("<数据文件名>",<存储器名>,<起始地址>,<终止地址>);
二、$fopen,$fwrite,$fclose
$fwrite用来向文件中写入数据。与文件读取不同,文件写入需要打开文件,写入,最后关闭文件。操作流程如下:
handle = $fopen("D:/file.txt","w");//按照写操作打开文件,得到对应的句柄,作为文件操作标识;其中,文件路径间隔为“/”而不是“\”
$fwrite(handle,"%d\n",data);//按照十进制格式写入数据到handle对应文件中,只能逐个写入(即data不能是数组)
$fclose(handle);//关闭文件,至此文件操作结束
三、仿真验证
验证流程:
新建文件num.txt,存入0-10共11个二进制数;
测试文件中,将num.txt中的数据按照二进制格式读入到寄存器;
再将寄存器中的数据反序按照10进制存入num2.txt。
测试文件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | `timescale 1ns / 1ps module file_test( ); reg [3:0]data[0:15]; reg [3:0]data2[0:15]; integer handle1; integer i=0; initial begin $readmemb("F:/vivado_files/num.txt",data); handle1 = $fopen("F:/vivado_files/num2.txt","w"); repeat(16) begin $fwrite(handle1,"%d\n",data[15-i]); i = i+1; end $fclose(handle1); end endmodule |
num.txt文件如下:
读取结果如下:

num2.txt文件如下:

四、参考
verilog中$readmemb和$readmemh的使用