在Verilog HDL中如何使用系统任务$readmemb
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Verilog HDL中如何使用系统任务$readmemb相关的知识,希望对你有一定的参考价值。
读取文件的类型有没有要求啊?我写的使*.txt的文件,能不能用啊?
我编写了mem.txt的文件,读到寄存器组memry中,如下写法:
$readmemb("mem.txt",memry);
用modlesim仿真提示
# ** Warning: (vsim-7) Failed to open readmem file "mem.txt" in read mode.
是文件格式不对么?还是没有指名路径啊?我将mem.txt 放在工程目录下了。
$readmemb("<数据文件名>",<存储器名>中的数据文件名是不是应该包括文件的地址啊,比如文件路径为c:\xilinx\mux\mem.txt,是不是应写为
$readmemb("c:\xilinx\mux\mem.txt",memry);
但仍提示Failed to open readmem file "D:Xilinx5.2muxmem.txt" in read mode.
请各位高手指点一下到底应该怎么用这个系统任务啊?
急!!!
module textbench;
reg a,b;
wire [1:0]c;
showbit F1(a,b,c);
reg [1:0] Vmem [3:0];
initial
begin
a=0;b=0;
$readmemb("C:\resource. txt",Vmem);
#100 a,b=Vmem[0];
#100 a,b=Vmem[1];
#100 a,b=Vmem[2];
#100 a,b=Vmem[3];
end
endmodule
我把txt文件放在C盘下也试过了
这两个系统任务用来从文件中读取数据到存储器中。可以在仿真的任何时刻被执行使用,使用格式共六种:
(1) $readmemb(“<数据文件名>”,<存储器名>);
(2) $readmemb(“<数据文件名>”,<存储器名>,<起始地址>);
(3) $readmemb(“<数据文件名>”,<存储器名>,<起始地址>,<结束地址>);
(4) $readmema(“<数据文件名>”,<存储器名>);
(5) $readmema(“<数据文件名>”,<存储器名,<起始地址>>);
(6) $readmema(“<数据文件名>”,<存储器名>,<起始地址>,<结束地址>);
在这两个系统任务中,被读取的数据文件的内容只能包含:空白位置(空格、换行、制表格、注释行、二进制或十六进制的数字。数字中不能包含位宽说明和格式说明,对于$readmemb系统任务,每个数字必须使二进制数字,对于$readmemh系统任务,每个数字必须使十六进制数字。数字中不定值x或X,高阻值z或Z,和在下划线(_)的使用方法及代表的意义与一般Verilog HDL程序中的用法和意义是一样的。另外,数字必须用空白位置或注释行来分隔开。
对于上面6种系统任务格式,需补充说明一下5点:
(1) 如果系统任务声明语句中和数据文件里都没有进行地址说明,则默认存放起始地址为该存储器定义语句中的起始地址。数据文件里的数据被连续存放到该存储器中,直到该存储单元存满为止或数据文件里的数据存完。
(2) 如果系统任务中说明了存放的起始地址,没有说明存放的结束地址,则数据从起始地址开始存放,存到该存储器定义语句中的结束地址为止。
(3) 如果系统任务声明语句中,结束地址和起始地址都进行了说明,则数据文件里的数据按该起始地址开始存放到存储单元中,直到该结束地址,而不考虑该存储器的定义语句的起始地址和结束地址。
(4) 如果地址信息在系统任务和数据文件里面都进行了说明,那么数据文件里的地址必须在系统任务中地址参数声明的范围之内。否则提示错误,并且装载数据到存储器中的操作被中断。
(5) 如果数据文件里的数据个数和系统任务中起始地址及结束地址暗示的数据个数不同的话,也要提示错误信息。 参考技术A 正好我昨天也遇到这个问题,
1. 把文件名改成 *.dat试试。
2. *.data 中的数据个数和你的Vmem的个数要一致,上述程序,dat文件中要有4个数据,多一个少一个好像都不行。
3. $readmemb 是读二进制文件, $readmemh是16进制文件,个人觉得后面一个方便些。
4. 数据文件名那里只写文件名好了,如果找不到,把文件放在同一个工程目录下试试 参考技术B $readmemb函数要求读的是二进制数据文件
$readmemh可以读十六进制数 参考技术C 路径是/ 不是\~ 参考技术D 我来救你,必须必须必须用/,而不是\,你直接复制文件路径是\,是错的,用/就对了,别问我怎么知道的,血的教训
verilog hdl中啥是综合?啥是模拟?
综合(Synthesis),是将RTL电路根据需求转换成门级网表的过程。首先你需要有一段行为级或RTL级HDL代码,然后根据你的需求进行约束(ASIC设计)或根据资源(FPGA)获得相应的门级的网表。模拟/仿真(Simulation),是将当前的代码进行功能验证的过程。通过仿真来确定你的代码在功能上是否正确。对于ASIC设计和高频率的FPGA设计来说,还需要进行PTPX和STA检查,来确定没有时序违例(Timing Violation)。
望采纳~ 参考技术A 综合(Synthesis),是将RTL电路根据需求转换成门级网表的过程。首先你需要有一段行为级或RTL级HDL代码,然后根据你的需求进行约束(ASIC设计)或根据资源(FPGA)获得相应的门级的网表。
模拟/仿真(Simulation),是将当前的代码进行功能验证的过程。通过仿真来确定你的代码在功能上是否正确。对于ASIC设计和高频率的FPGA设计来说,还需要进行PTPX和STA检查,来确定没有时序违例(Timing Violation)。
以上是关于在Verilog HDL中如何使用系统任务$readmemb的主要内容,如果未能解决你的问题,请参考以下文章