一、$readmemb/$readmemh
$readmemb和$readmemh用來從文件中讀取數據到存儲器中。
其中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);//關閉文件,至此文件操作結束
三、仿真驗證
驗證流程:
(1)新建文件num.txt,存入0-10共11個二進制數;
(2)測試文件中,將num.txt中的數據按照二進制格式讀入到寄存器;
(3)再將寄存器中的數據反序按照10進制存入num2.txt
`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
