Home Articles

如何在SystemVerilog中为动态多维数组分配连续内存?

Asked
Viewed 1142 times
1

SystemVerilog中是否有一种方法可以创建一个连续分配其内存的动态数组?我正在尝试将数据从文件读入动态数组 . 问题似乎是动态数组不在连续的内存位置,因此文件无法正确读入数组 .

当我声明变量读取文件为非动态数组时它工作正常,所以我认为问题是连续的内存 . 这是代码:

This works fine, but does not use a dynamic array:

// Reads frame from a binary file
task t_Read_File(input string i_File_Name);
  int n_Temp[10][10];
  int n_File_ID;

  n_File_ID = $fopen(i_File_Name, "rb");
  $fread(n_Temp, n_File_ID);
  $fclose(n_File_ID);
  r_Frame = n_Temp;
endtask : t_Read_File

This uses a dynamic array (r_Frame) but does not work

// Reads frame from a binary file
task t_Read_File(input string i_File_Name);
  int n_File_ID;

  n_File_ID = $fopen(i_File_Name, "rb");
  $fread(r_Frame, n_File_ID);
  $fclose(n_File_ID);
endtask : t_Read_File

仅供参考,r_Frame先前被声明为我的类的局部变量,如下所示:

int r_Frame[][];

2 Answers

  • 1

    在动态数组上使用 $fread 是标准中的open issue . 对于多维动态数组来说甚至更成问题,因为无法知道如何对数组进行整形 . 更复杂的是,SystemVerilog并没有真正的多维数组;相反,它有数组数组 . 这意味着每个索引维度可以具有不同的大小 .

    您可以先尝试分配数组,然后再调用 $fread .

    r_Frame = new[10];
    foreach (r_Frame[i]) r_Frame[i] = new[10];
    
  • 0

    这是我必须最终实施的解决方案 . 基本上我一次一行地读取文本文件到n_Temp,这只是一个大的临时数组结构 . 然后我一次将它放入多维动态数组r_Frame中的一个值 . 尽管之前为r_Frame调用了 new 并设置了尺寸,但 $fread 并未将值写入r_Frame . 我不得不使用临时变量来完成这个额外的步骤以使其工作 . 此外,我还必须编写一个endian swap函数来将little-endian数据文件转换为big-endian格式 .

    task t_Read_File(input string i_File_Name);
      int n_Temp[5000]; // arbitrary, large
      int n_File_ID;
      n_File_ID = $fopen(i_File_Name, "rb");
      for (int i=0; i<n_Active_Rows; i++)
        begin
          void'($fread(n_Temp, n_File_ID, , n_Active_Cols));
          for (int j=0; j<n_Active_Cols; j++)
            r_Frame[i][j] = Sim_Support_Pkg::f_Endian_Swap(n_Temp[j]);
        end
      $fclose(n_File_ID);
    endtask : t_Read_File
    

Related