您好,登錄后才能下訂單哦!
verilog HDL程序中的兩個系統任務,$readmemb和$readmemh,從文件中讀取數據到存儲器。其格式如下:
(1)$readmemb("<數據文件名>",<存儲器名>);
(2)$readmemb("<數據文件名>",<存儲器名>,<起始地址>);
(3)$readmemb("<數據文件名>",<存儲器名>,<起始地址>,<終止地址>);
(1)$readmemh("<數據文件名>",<存儲器名>);
(2)$readmemh("<數據文件名>",<存儲器名>,<起始地址>);
(3)$readmemh("<數據文件名>",<存儲器名>,<起始地址>,<終止地址>);
被讀取的文件中只能包含:空白位置(空格、換行、制表格(tab)),注釋行(//形式的和/*...*/形式的都可以)、二進制和二六進制數據。
被讀取的文件中不能包含位寬書名和格式說明,對于$readmemb系統任務,每個數必須是二進制,對于$readmemh系統任務,每個數必須是十六進制。數字中可以有不定值x或X和高阻值z或Z,還可以有下畫線(_)。另外,數字必須用空白位置或注釋行來分隔。
任務會從指定的地址依次將讀取到的數據存入寄存器(或寄存器數組),但當地址出現在數據文件中時,其格式是字符“@”后跟上十六進制數據,如:@hhhh。當讀取中遇到地址說明符,會將地址后的數據存放到相應的地址中。
如:文件init.dat內容如下:
@002
11111111 01010101
00000000 10101010
@006
1111zzzz 00001111
verilog程序如下:
reg [7:0] meme[0:7];
$readmemb("init.data",meme);
則寄存器中的內容如下:
meme[0]=xxxxxxxx;
meme[1]=xxxxxxxx;
meme[2]=11111111;
meme[3]=01010101;
meme[4]=00000000;
meme[5]=10101010;
meme[6]=1111zzzz;
meme[7]=00001111;
如果程序如下:
reg [15:0] meme[0:7]; //一個地址存儲16bit數據
$readmemb("init.data",meme);
則結果如下:
meme[0]=xxxxxxxxxxxxxxxx;
meme[1]=xxxxxxxxxxxxxxxx;
meme[2]=11111111_01010101;
meme[3]=00000000_10101010;
meme[4]=xxxxxxxxxxxxxxxx;
meme[5]=xxxxxxxxxxxxxxxx;
meme[6]=1111zzzz_00001111;
meme[7]=xxxxxxxxxxxxxxxx;
則依次從文件中讀取16bit的數據存儲到寄存器的一個地址中。
補充說明:
(1)系統任務聲明語句中和數據文件中都沒有地址說明,則默認的存放地址為存儲器定義語句中的起始地址,數據文件里的數據被連續存存放到該存儲器中,直到存儲單元存滿為止或者數據文件里的數據存完。
(2)如果系統任務中說明了存放的起始地址,沒有說明存放的結束地址,則數據從起始地址開始存放。
(3)如果數據文件里的數據個數和系統任務中起始地址和結束地址的數據個數不同的話,會提示出錯信息。
(4)reg [7:0] meme[0:7] //地址為0-7 存儲器定義的起始地址和結束地址
$readmemb("init.dat",meme,3,6) // 系統任務中定義的起始地址和結束地址
@006 //數據文件中的地址
其中數據文件中地址必須在系統任務中定義的范圍內,系統任務中定義的地址必須在存儲器定義的地址范圍內。優先考慮數據文件中的地址>系統任務中定義的起始地址和結束地址>存儲器定義的起始地址和結束地址.
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。