FPGA開發中Testben讀取外部檔案的方式
1. 檔案讀寫的作用
為什麼需要使用Verilog語言讀取/寫入檔案呢,主要是由於我們有時候需要將資料準備和分析的工作從Testbench中隔離出來,便於協同工作,需要除錯一些暫存器的值,就需要通過文字中獲取資料,然後來除錯Verilog程式;這些文字資訊可以通過C/C++、Excel表格、Matlab等工具,因此,在程式碼測試的時候會檔案的輸入和輸入的語法有助於你分析你的程式邏輯是否正確。
2. Testbench檔案包括哪些操作
(1)開啟檔案
系統函式$fopen用於開啟一個檔案,將檔案和integer指標關聯,語法如下:
integer file_point = $fopen(file_name); 這裡的 file_name 是一個路徑,檔名儲存的路徑,用雙引號“”包括。
你可以使用相對路徑也可以使用絕對路徑,一般將檔案放在工程testbench檔案同一級的目錄下,你只需要在雙引號之中寫入檔名即可。
(2)關閉檔案
系統任務$fclose用於關閉一個檔案,格式如下:
$fclose(file_point);
(3) 從檔案中讀取資料
從檔案中讀取資料有兩類方法,第一類為$fscanf系統任務,第二類為$readmemb 和 $readmemh,上述兩種任務都可以從文字檔案中讀取資料,並將資料載入到儲存器,被讀取的檔案可以包含空白空間、註釋、二進位制(如$readmemb)或十六進位制(如$readmemh)數字,每個數字用空白空間隔離
下面將一下兩種型別的語法
【$fscanf】
integer file, count;
count = $fscanf(file, format, args);
【$readmemb 】
readmemb( "檔名", 儲存器名, 起始地址,終止地址);
【$readmemh】
readmemh( "檔名", 儲存器名, 起始地址,終止地址);
3、檔案操作的例項
寫一個從檔案中讀取資料的操作,以十六進位制方式讀取一個文字檔案1.txt中的內容:
readmemh_demo.v 檔案
`timescale 1ns/1ps module readmemh_demo; parameter data_period = 4; //每個資料佔據4個位元組 parameter data_num = 15; // 讀取資料的個數 parameter BUF_SIZE = 32; // 保證能存放字元的最大值,位寬 // read_buf reg [BUF_SIZE-1:0] read_buf[0:data_num -1]; reg [BUF_SIZE-1:0] data; // 讀取文字資訊,採用$readmemh,將文字資訊放到read_buf中 initial $readmemh("1.txt", read_buf); // 顯示讀取的內容 integer i = 0; initial begin #(data_period); $display("Content of read_buf after reading data file:"); for(i = 0; i<data_num; i = i+1)begin #(data_period); data = read_buf[i]; $display("%d:%h", i, read_buf[i]); end end endmodule
建立modelsim工程
編譯-》執行模擬-》run all
結果如下:
這時候的文字內容為:
波形圖: