文章目录
- 简介
- 三种使用格式解读
- 1、不指定变量地址
- 2、只指定变量起始地址
- 3、同时指定变量的起始地址和结束地址
- 参考资料
- 补充:什么是数组和存储器变量
简介
$readmemh和$readmemb是两个系统,被用来从指定文件中读取数据到寄存器数组或者RAM、ROM中。除了可以在仿真的任何时刻被执行使用外,根据综合工具的不同,也可以用来对RAM或者ROM进行初始化(Vivado支持)。
$readmemh中的h表示十六进制。
$readmemb中的b表示二进制。
使用格式如下,以$readmemb为例,$readmemh相同:
-
$readmemb(“数据文件名”,数组型/存储器型变量)
-
$readmemb (“数据文件名”,数组型/存储器型变量,变量的起始地址)
-
$readmemb (“数据文件名”,数组型/存储器型变量,变量的起始地址,变量的结束地址)
数据文件名:
可以读取txt、v等格式文件。文件的数据必须是二进制和十六进制,而不是说会将文件里的数据转换成二进制和十六进制。
地址写相对地址或绝对地址。但一定注意地址需要使用反斜杠 / 来表示层级。
例如绝对路径: **$readmemh(“F:/test/data.txt”,mem_test); **
相对地址是相对与工程位置的XX.sim\sim_1\behav\xsim的文件夹位置。直接将数据文件放入该文件夹地址内则 **$readmemh(“data.txt”,mem_test); **
三种使用格式解读
1、不指定变量地址
即:$readmemh(“F:/test/data.txt”,mem_test);
设reg [7:0] mem_test [9:0]; 数据被依次对应变量的最小地址开始填写,即第一个数据放入mem_test[0],第二个数据放入mem_test[1]直到放到mem_test[9],如果文件中没有十个数则后面的不被赋值。
设reg [7:0] mem_test [9:1]; 数据被依次对应变量的最小地址开始填写,即第一个数据放入mem_test[1],第二个数据放入mem_test[2]直到放到mem_test[9],如果文件中没有九个数则后面的不被赋值。
若reg [7:0] mem_test [9:0];和reg [7:0] mem_test [0:9];中9和0的书写顺序不一样,但读文件的顺序仍是先放入mem_test[0]的顺序。即[9:0]和 [0:9]不影响每个mem_test 的值,其他使用格式同样遵循。
2、只指定变量起始地址
即:$readmemh(“F:/test/data.txt”,mem_test,3);
设reg [7:0] mem_test [9:0]; 则前面0,1,2不被赋值,第一个数据放入mem_test[3],依次类推。
3、同时指定变量的起始地址和结束地址
即:$readmemh(“F:/test/data.txt”,mem_test,3,8);
设reg [7:0] mem_test [9:0]; 则前面0,1,2,9不被赋值,第一个数据放入mem_test[3],依次类推到mem_test[8]。
参考资料
本文大部分总结于前辈博客,只给出结论,若要代码验证请参看http://t.csdn.cn/R5smI。
补充:什么是数组和存储器变量
什么是数组和存储器变量