如何在 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
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