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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。