一次将一个字节写入 SystemVerilog 中的二进制文件
Write one byte at a time to a binary file in SystemVerilog
我想写一个二进制文件(意味着它需要在十六进制编辑器中打开)。我想在 SystemVerilog 中一次写入一个字节。我目前一次只能写入 32 位(4 字节)。这对我不起作用。这是我正在使用的代码:
task t_Write_File(input string i_File_Name);
int n_File_ID;
n_File_ID = $fopen(i_File_Name, "wb");
for (int i=0; i<n_Active_Rows; i++)
begin
for (int j=0; j<n_Active_Cols; j++)
begin
$fwrite(n_File_ID, "%u", r_Frame[i][j]);
end
end
$fclose(n_File_ID);
endtask : t_Write_File
这里的问题是 r_Frame 是字节,所以它填充了数据(到 32 位)。我不想填充。
您需要将字节打包成 32 位单元(4 字节)。你可以在你最里面的 for-loop
task t_Write_File(input string i_File_Name);
int n_File_ID;
bit [32:0] buffer;
int index;
n_File_ID = $fopen(i_File_Name, "wb");
for (int i=0; i<n_Active_Rows; i++)
begin
for (int j=0; j<n_Active_Cols; j++)
begin
buffer[8*(index++) +:8] = r_Frame[i][j];
if (index == 4) begin
index = 0;
$fwrite(n_File_ID, "%u", buffer);
end
end
end
$fclose(n_File_ID);
endtask : t_Write_File
只需使用“%c”而不是“%u”,如
for (int j=0; j<n_Active_Cols; j++)
begin
$fwrite(n_File_ID, "%c", r_Frame[i][j]);
end
答案改编自here。
我想写一个二进制文件(意味着它需要在十六进制编辑器中打开)。我想在 SystemVerilog 中一次写入一个字节。我目前一次只能写入 32 位(4 字节)。这对我不起作用。这是我正在使用的代码:
task t_Write_File(input string i_File_Name);
int n_File_ID;
n_File_ID = $fopen(i_File_Name, "wb");
for (int i=0; i<n_Active_Rows; i++)
begin
for (int j=0; j<n_Active_Cols; j++)
begin
$fwrite(n_File_ID, "%u", r_Frame[i][j]);
end
end
$fclose(n_File_ID);
endtask : t_Write_File
这里的问题是 r_Frame 是字节,所以它填充了数据(到 32 位)。我不想填充。
您需要将字节打包成 32 位单元(4 字节)。你可以在你最里面的 for-loop
task t_Write_File(input string i_File_Name);
int n_File_ID;
bit [32:0] buffer;
int index;
n_File_ID = $fopen(i_File_Name, "wb");
for (int i=0; i<n_Active_Rows; i++)
begin
for (int j=0; j<n_Active_Cols; j++)
begin
buffer[8*(index++) +:8] = r_Frame[i][j];
if (index == 4) begin
index = 0;
$fwrite(n_File_ID, "%u", buffer);
end
end
end
$fclose(n_File_ID);
endtask : t_Write_File
只需使用“%c”而不是“%u”,如
for (int j=0; j<n_Active_Cols; j++)
begin
$fwrite(n_File_ID, "%c", r_Frame[i][j]);
end
答案改编自here。