Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 在verilog中从二进制文件读取n个字节直到文件结束_File_Io_Verilog - Fatal编程技术网

File 在verilog中从二进制文件读取n个字节直到文件结束

File 在verilog中从二进制文件读取n个字节直到文件结束,file,io,verilog,File,Io,Verilog,我有一个二进制文件。我需要每次从中读取512位,直到文件结束,并将其作为输入传递给我的设计。我正在使用readmemh/readmemb读取文件。但是我们必须在readmemh作为参数传递之前指定内存数组的大小。因此,如果我们不知道寄存器的深度,我们如何读取完整的二进制文件 reg [511:0]packet[1:0]; $readmemh("abc.bin",packet); //this abc.bin has 237kb size 内存“数据包”的深度应该是多少?对于这种类型的连续数据

我有一个二进制文件。我需要每次从中读取512位,直到文件结束,并将其作为输入传递给我的设计。我正在使用readmemh/readmemb读取文件。但是我们必须在readmemh作为参数传递之前指定内存数组的大小。因此,如果我们不知道寄存器的深度,我们如何读取完整的二进制文件

reg [511:0]packet[1:0]; 
$readmemh("abc.bin",packet); //this abc.bin has 237kb size

内存“数据包”的深度应该是多少?

对于这种类型的连续数据处理,$readmemh方法并不理想

相反,我将使用与标准编程语言相同的方法: 打开一个文件,从中读取所需的数据,然后关闭该文件。这样,您可以处理许多兆字节大小的文件,但不需要很多兆字节的存储空间

fd = $fopen(filename,"rb");
if (fd==0)
begin
   $display("%m @%0t: Could not open file '%s'",$time,filename);
   $stop;     
end
else
begin
   $display("%m @%0t: Opened %s for reading",$time,filename);
   file_is_open = 1'b1;
end

if (file_is_open)
  value= $fgetc(fd);
警告:
这使用一个二进制文件。$readmemh使用ASCII文件。如果需要,您可以读取ASCII文件,但是您必须自己编写一个小的Verilog函数来完成ASCII到十六进制的转换

您有几个选择

  • 如果文件有可能的最大大小,只需声明具有所需最大大小的数组。其余元素将被
    $readmemh
    保留为未初始化(
    X
  • 编译设计时,使用数组大小在命令行上传递参数或宏定义。这些命令将取决于您使用的工具
  • 使用
    $fscanf(fd,“%h”,value)
    一次读取一行,而不是将整个文件读入数组。
    值可根据需要应用于输入


你能澄清一下:你有一个真正的二进制文件,还是一个包含1和0个字符的ASCII文件?你知道最大可能深度吗?我的文件包含十六进制值。我用matlab将一个图像转换成十六进制,并在这里输入该文件。嗨,dave_59,我的十六进制文件每行包含8位。我需要将前512位读入一个寄存器,并将其作为设计的输入。然后是接下来的512位,依此类推。。如果我使用readmemh或fscanf读取,并且寄存器是512位寄存器,那么它在MSB上给出除最后8位以外的所有零。我怎样才能改变它?从一开始就掌握所有这些信息会有帮助。请参阅更新的示例
do begin
  repeat (64) begin
    code = $fscanf(fd,"%h", value); // get byte
    pattern = {pattern,value};      // shift into pattern
  end
  send_to_dut(pattern);
end while (code == 1);