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

How to allocate contiguous memory for dynamic multidimensional arrays in SystemVerilog?

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

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

这工作正常,但不使用动态数组:

// 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

这使用动态数组 (r_Frame) 但不起作用

// 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 之前声明为我的 class 的局部变量,如下所示:

int r_Frame[][];

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

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

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

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

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