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 回答
在动态数组上使用
$fread
是标准中的open issue . 对于多维动态数组来说甚至更成问题,因为无法知道如何对数组进行整形 . 更复杂的是,SystemVerilog并没有真正的多维数组;相反,它有数组数组 . 这意味着每个索引维度可以具有不同的大小 .您可以先尝试分配数组,然后再调用
$fread
.这是我必须最终实施的解决方案 . 基本上我一次一行地读取文本文件到n_Temp,这只是一个大的临时数组结构 . 然后我一次将它放入多维动态数组r_Frame中的一个值 . 尽管之前为r_Frame调用了
new
并设置了尺寸,但$fread
并未将值写入r_Frame . 我不得不使用临时变量来完成这个额外的步骤以使其工作 . 此外,我还必须编写一个endian swap函数来将little-endian数据文件转换为big-endian格式 .