使用 Systemverilog 读取然后打印二进制文件。第一个字节读取并打印正常,trouble\w 字节在遇到的 ms 位位置包含 1
Using Systemverilog to read then print binary file. First bytes read & print ok, trouble\w byte containing a 1 in the ms bit position encountered
下面的 Systemverilog 代码是一个单文件测试台,它使用 $fread 将二进制文件读入内存,然后打印内存内容。二进制文件是 16 个字节,下面包含它的视图(这是我希望 Systemverilog 代码打印的内容)。
打印的输出符合我对前 6 (0-5) 个字节的预期。那时预期的输出是 0x80,但是打印输出是一个以 0xef 开头的 3 字节序列,这不在刺激文件中。在这 3 个字节之后,输出再次匹配刺激。似乎当读取的二进制字节的第 7 位为 1 时,就会发生错误。几乎就像数据被视为已签名一样,但事实并非如此,它的二进制数据打印为十六进制。内存被定义为无符号类型逻辑。
这类似于 post 中的 question/answer:
Read binary file data in Verilog into 2D Array。
但是我的代码在 $fopen 语句中没有同样的问题(我使用“rb”),所以
解决方案不适用于此问题。
Systemverilog 规范 1800-2012 在第 21.3.4.4 节读取二进制数据中指出 $fread 可用于读取二进制文件并继续说明如何操作。我相信此示例符合该部分中所述的内容。
代码已在 EDA Playground 上 post 编辑,以便用户可以看到并 运行。
https://www.edaplayground.com/x/5wzA
您需要登录 运行 并下载。登录是免费的。它提供
访问用于 HDL 仿真的行业标准工具的完整基于云的版本。
还在 EDA Playground 上尝试了 运行ning 3 个不同的模拟器。它们都产生相同的结果。
已尝试重新安排 stim.bin 文件,使 0x80 值出现在文件的开头而不是中间。在那种情况下,错误也会发生在测试台打印输出的开头。
也许Systemverilog代码没有问题,问题出在二进制文件上?我提供了 emacs hexl 模式为其内容显示的屏幕截图。另一个观众也看了它,它看起来一样。您可以在 EDA Playground 上 运行ning 时下载它,以便在另一个编辑器中检查它。二进制文件由 GNU Octave 生成。
宁愿有一个使用 Systemverilog $fread 而不是其他东西的解决方案,以便调试原始文件而不是解决它(学习)。这将被开发成一个 Systemverilog 测试台,它将从 Octave/Matlab 中生成的二进制文件中读取的激励应用于 Systemverilog DUT。由于文件访问速度,二进制文件IO是首选。
为什么 Systemverilog 测试平台为 mem[6] 打印 0xef 而不是 0x80?
module tb();
// file descriptors
int read_file_descriptor;
// memory
logic [7:0] mem [15:0];
// ---------------------------------------------------------------------------
// Open the file
// ---------------------------------------------------------------------------
task open_file();
$display("Opening file");
read_file_descriptor=$fopen("stim.bin","rb");
endtask
// ---------------------------------------------------------------------------
// Read the contents of file descriptor
// ---------------------------------------------------------------------------
task readBinFile2Mem ();
int n_Temp;
n_Temp = $fread(mem, read_file_descriptor);
$display("n_Temp = %0d",n_Temp);
endtask
// ---------------------------------------------------------------------------
// Close the file
// ---------------------------------------------------------------------------
task close_file();
$display("Closing the file");
$fclose(read_file_descriptor);
endtask
// ---------------------------------------------------------------------------
// Shut down testbench
// ---------------------------------------------------------------------------
task shut_down();
$stop;
endtask
// ---------------------------------------------------------------------------
// Print memory contents
// ---------------------------------------------------------------------------
task printMem();
foreach(mem[i])
$display("mem[%0d] = %h",i,mem[i]);
endtask
// ---------------------------------------------------------------------------
// Main execution loop
// ---------------------------------------------------------------------------
initial
begin :initial_block
open_file;
readBinFile2Mem;
close_file;
printMem;
shut_down;
end :initial_block
endmodule
二进制刺激文件:
实际输出:
Opening file
n_Temp = 16
Closing the file
mem[15] = 01
mem[14] = 00
mem[13] = 50
mem[12] = 60
mem[11] = 71
mem[10] = 72
mem[9] = 73
mem[8] = bd
mem[7] = bf
mem[6] = ef
mem[5] = 73
mem[4] = 72
mem[3] = 71
mem[2] = 60
mem[1] = 50
mem[0] = 00
更新:
运行 实验是为了测试二进制文件在上传到 EDA playground 的过程中是否被修改。这些步骤中没有涉及 Systemverilog 代码,它只是一个文件 upload/download.
步骤:
(使用https://hexed.it/创建和查看二进制文件)
- Create/save 十六进制模式的二进制文件 80 00 80 00 80 00 80 00
- 创建新游乐场
- 将新创建的二进制文件上传到新的 playground
- 选中操场上的'download files after run'框
- 拯救游乐场
- 运行游乐场
- Save/unzip操场上的成绩运行
- 查看二进制文件,在我的例子中已经修改了
upload/download。结果截图如下所示:
这个实验是在两个不同的 Windows 工作站上进行的。
基于这些结果和评论,我将关闭此问题,并认为这不是 Systemverilog 问题,而是与 EDA 游乐场的 upload/dowload 二进制文件有关。感谢评论的人。
测试台产生的意外输出是由于对上传到 EDA 操场的二进制激励文件 during/after 进行了修改。 Systemverilog 测试平台按预期执行以打印二进制文件的内容。
此结论基于社区评论和更新问题末尾提供的实验结果。给出了详细的步骤,方便其他人重复实验。
下面的 Systemverilog 代码是一个单文件测试台,它使用 $fread 将二进制文件读入内存,然后打印内存内容。二进制文件是 16 个字节,下面包含它的视图(这是我希望 Systemverilog 代码打印的内容)。
打印的输出符合我对前 6 (0-5) 个字节的预期。那时预期的输出是 0x80,但是打印输出是一个以 0xef 开头的 3 字节序列,这不在刺激文件中。在这 3 个字节之后,输出再次匹配刺激。似乎当读取的二进制字节的第 7 位为 1 时,就会发生错误。几乎就像数据被视为已签名一样,但事实并非如此,它的二进制数据打印为十六进制。内存被定义为无符号类型逻辑。
这类似于 post 中的 question/answer: Read binary file data in Verilog into 2D Array。 但是我的代码在 $fopen 语句中没有同样的问题(我使用“rb”),所以 解决方案不适用于此问题。
Systemverilog 规范 1800-2012 在第 21.3.4.4 节读取二进制数据中指出 $fread 可用于读取二进制文件并继续说明如何操作。我相信此示例符合该部分中所述的内容。
代码已在 EDA Playground 上 post 编辑,以便用户可以看到并 运行。 https://www.edaplayground.com/x/5wzA 您需要登录 运行 并下载。登录是免费的。它提供 访问用于 HDL 仿真的行业标准工具的完整基于云的版本。
还在 EDA Playground 上尝试了 运行ning 3 个不同的模拟器。它们都产生相同的结果。
已尝试重新安排 stim.bin 文件,使 0x80 值出现在文件的开头而不是中间。在那种情况下,错误也会发生在测试台打印输出的开头。
也许Systemverilog代码没有问题,问题出在二进制文件上?我提供了 emacs hexl 模式为其内容显示的屏幕截图。另一个观众也看了它,它看起来一样。您可以在 EDA Playground 上 运行ning 时下载它,以便在另一个编辑器中检查它。二进制文件由 GNU Octave 生成。
宁愿有一个使用 Systemverilog $fread 而不是其他东西的解决方案,以便调试原始文件而不是解决它(学习)。这将被开发成一个 Systemverilog 测试台,它将从 Octave/Matlab 中生成的二进制文件中读取的激励应用于 Systemverilog DUT。由于文件访问速度,二进制文件IO是首选。
为什么 Systemverilog 测试平台为 mem[6] 打印 0xef 而不是 0x80?
module tb();
// file descriptors
int read_file_descriptor;
// memory
logic [7:0] mem [15:0];
// ---------------------------------------------------------------------------
// Open the file
// ---------------------------------------------------------------------------
task open_file();
$display("Opening file");
read_file_descriptor=$fopen("stim.bin","rb");
endtask
// ---------------------------------------------------------------------------
// Read the contents of file descriptor
// ---------------------------------------------------------------------------
task readBinFile2Mem ();
int n_Temp;
n_Temp = $fread(mem, read_file_descriptor);
$display("n_Temp = %0d",n_Temp);
endtask
// ---------------------------------------------------------------------------
// Close the file
// ---------------------------------------------------------------------------
task close_file();
$display("Closing the file");
$fclose(read_file_descriptor);
endtask
// ---------------------------------------------------------------------------
// Shut down testbench
// ---------------------------------------------------------------------------
task shut_down();
$stop;
endtask
// ---------------------------------------------------------------------------
// Print memory contents
// ---------------------------------------------------------------------------
task printMem();
foreach(mem[i])
$display("mem[%0d] = %h",i,mem[i]);
endtask
// ---------------------------------------------------------------------------
// Main execution loop
// ---------------------------------------------------------------------------
initial
begin :initial_block
open_file;
readBinFile2Mem;
close_file;
printMem;
shut_down;
end :initial_block
endmodule
二进制刺激文件:
实际输出:
Opening file
n_Temp = 16
Closing the file
mem[15] = 01
mem[14] = 00
mem[13] = 50
mem[12] = 60
mem[11] = 71
mem[10] = 72
mem[9] = 73
mem[8] = bd
mem[7] = bf
mem[6] = ef
mem[5] = 73
mem[4] = 72
mem[3] = 71
mem[2] = 60
mem[1] = 50
mem[0] = 00
更新: 运行 实验是为了测试二进制文件在上传到 EDA playground 的过程中是否被修改。这些步骤中没有涉及 Systemverilog 代码,它只是一个文件 upload/download.
步骤: (使用https://hexed.it/创建和查看二进制文件)
- Create/save 十六进制模式的二进制文件 80 00 80 00 80 00 80 00
- 创建新游乐场
- 将新创建的二进制文件上传到新的 playground
- 选中操场上的'download files after run'框
- 拯救游乐场
- 运行游乐场
- Save/unzip操场上的成绩运行
- 查看二进制文件,在我的例子中已经修改了
upload/download。结果截图如下所示:
这个实验是在两个不同的 Windows 工作站上进行的。 基于这些结果和评论,我将关闭此问题,并认为这不是 Systemverilog 问题,而是与 EDA 游乐场的 upload/dowload 二进制文件有关。感谢评论的人。
测试台产生的意外输出是由于对上传到 EDA 操场的二进制激励文件 during/after 进行了修改。 Systemverilog 测试平台按预期执行以打印二进制文件的内容。
此结论基于社区评论和更新问题末尾提供的实验结果。给出了详细的步骤,方便其他人重复实验。