FPGA杂记

如何用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等常用的文件,有兴趣的小伙伴可以自行测试。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值