如何用Testbench生成.bin文件和.coe文件
写在前面
FPGA程序固化的时候可能会遇到固化成功但程序不能正常执行的问题,这时候就需要把烧写到flash中.bin文件读出来和原始的.bin文件进行比对;通常原始的.bin文件对于调试人员来说是杂乱且无序的,不利于比对,这时就非常需要一个合适的.bin文件(内容由调试人员规定)来帮助我们减少工作量,方便比对以提高调试效率。
有很多方式可以自制.bin文件,常用的有python、c、matlab等,但对于一个逻辑工程师来说,Testbench往往更方便有效(ps:逻辑工程师桌面可能没有matlab但一定有vivadio和quartus )。
一、基础知识
1.$fopen()函数
integer <file_desc>; //定义文件句柄
<file_desc> = $fopen("<file_name>", "<file_mode>"); //打开文件
- file_name : 是在操作系统中的文件名称(包含文件路径和文件名称)
- file_mode: 是以什么样非方式打开操作系统中的文件
| file_mod | 含义 |
|---|---|
| r | 只读打开一个文本文件,只允许读数据(文本文件必须存在) |
| w | 只写打开一个文本文件,只允许写数据(新内容会覆盖旧内容,没有则新建) |
| a | 追加打开一个文本文件,并在文件末尾写数据(新内容追加在末尾,没有则新建) |
| rb | 只读打开一个二进制文件,只允许读数据 |
| wb | 只写打开或建立一个二进制文件,只允许写数据 |
| ab | 追加打开一个二进制文件,并在文件末尾写数据 |
| r+ | 读写打开一个文本文件,允许读和写 |
| w+ | 读写打开或建立一个文本文件,允许读写(如果文件存在,则原文件内容会被删除。如果文件不存在,则创建新文件) |
| a+ | 读写打开一个文本文件,允许读和写(不存在则新建;读取文件会从文件起始地址的开始,写入只能是追加模式) |
| rb+ | 读写打开一个二进制文本文件,功能与 “r+” 类似 |
| wb+ | 读写打开或建立一个二进制文本文件,功能与 “w+” 类似 |
| ab+ | 读写打开一个二进制文本文件,功能与 “a+” 类似 |
2.$fclose()函数
integer <file_desc>; //定义文件句柄
<file_desc> = $fopen(<file_name>, "<file_mode>"); //打开文件
...
$fclose(<file_desc>); //执行完操作后关闭文件
//在仿真中,可以打开很多文件,在各个文件的使用后,可以根据需要的顺序关闭
3.fwrite()函数
$fwrite(<file_desc>,"%h\n",data);
//按照16进制格式写入数据到file_desc对应文件中,只能逐个写入(即data不能是数组)
二、生成一个.bin文件
1.Testbench代码
`timescale 1ns/1ps
module tb_top();
localparam DATA_NAME = "H:/fpga/doc/data.bin"; //指定文件路径和文件名
integer fdata; //定义文件句柄
reg [7:0] data [15:0];
initial begin
fdata = $fopen(DATA_NAME,"w"); //只读方式打开文件
for(integer j=0;j<16'hfff0;j=j+ 'd16)begin
$fwrite(fdata,"%8h", j);
$fwrite(fdata,"h\:\ ");
for(integer k=0;k< 'd16;k=k+ 'd1)begin
data[k] = k + j;
$fwrite(fdata,"%2h\ ", data[k]);
end
$fwrite(fdata,"\;\n");
end
$fclose(fdata);
end
endmodule
2.运行结果


三、生成一个vivado ram/rom初始化文件
1.Testbench代码
localparam TDATA_PATH = "H:/suchang/learn_su/udp_test0/udp_test/doc/tdata.coe";
integer fdtdata;
logic [7:0] data_pattern [15:0];
logic[7:0] current_pattern =0;
initial begin
fdtdata = $fopen(TDATA_PATH,"a");
$fwrite(fdtdata, "memory_initialization_radix = 16;\n");
$fwrite(fdtdata, "memory_initialization_vector = \n");
for (int j = 0; j < 1024; j++) begin
for (int k = 0; k < 8; k++) begin
data_pattern[k] = current_pattern;
current_pattern = current_pattern +1;
end
pkt_data[j] = {data_pattern[7], data_pattern[6], data_pattern[5], data_pattern[4],
data_pattern[3], data_pattern[2], data_pattern[1], data_pattern[0]};
$fwrite(fdtdata,"%h", pkt_data[j]);
$fwrite(fdtdata,"\,");
$fwrite(fdtdata,"\n");
end
$fclose(fdtdata);
end
2.运行结果


写在后面
没有很复杂的操作,就是简单利用verilog语法中对文件的操作函数,在没有matlab和python等环境下利用Testbench可以很方便的生成一些文件,包括但不限于.bin、.coe等常用的文件,有兴趣的小伙伴可以自行测试。
5802

被折叠的 条评论
为什么被折叠?



