Verilog 文件操作:$readmemh和$readmemb的使用

文章目录

  • 简介
  • 三种使用格式解读
    • 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。

补充:什么是数组和存储器变量

什么是数组和存储器变量

Verilog 文件操作:$readmemh和$readmemb的使用_第1张图片

Verilog 文件操作:$readmemh和$readmemb的使用_第2张图片

你可能感兴趣的:(Verilog语法,fpga开发,Verilog,Verilog语法)