ModelSim中将仿真数据/波形/wave保存到txt文件的方法

利用ModelSim进行仿真时,有时需要将数据导出用其他工具如Matlab进行分析,这时可以用fwrite函数来实现,具体方法如下:
假设data_o为256bit位宽的数据,现需要将其保存到txt文件中,每行保存一个有效数据,valid_o为其对应的有效标志信号。

wire			valid_o			 ;//待保存数据有效标志信号,高电平有效
wire	[255:0]	data_o			 ;//待保存数据

reg				valid_flag = 1'b0;
reg		[255:0]	wr_txt			 ;
always@(posedge iclk)begin
	if(valid_o)begin
		valid_flag <= ~valid_flag;
		wr_txt	    <= data_o;
	end else begin
		valid_flag <= valid_flag;
		wr_txt	    <= wr_txt;
	end
end

integer w_file; // w_file 是一个文件描述,需要定义为 integer 类型
//initial w_file = $fopen("/home/work/output_file/data_o.txt");//Linux系统下文件保存路径示例
initial w_file = $fopen("E:/work/output_file/data_o.txt");//win系统下文件保存路径示例

always@(valid_flag) begin//仅在valid_flag变化的情况下才将wr_txt写入文件
	$fwrite(w_file,"%h\n",wr_txt);// %h 十六进制保存,\n:换行符
end

注上述方法保存的txt文件中第一行数据可能出现无效的数值:xxxxxx,可手动删除

最终文件示例如下图所示:
在这里插入图片描述
去掉上述第一行无效数值的方法:

wire			valid_o			 ;//待保存数据有效标志信号,高电平有效
wire	[255:0]	data_o			 ;//待保存数据

reg				valid_flag = 1'b0;
reg		[255:0]	wr_txt			 ;
always@(posedge iclk)begin
	if(valid_o)begin
		valid_flag <= 1'b1;
		wr_txt	    <= data_o;
	end else begin
		valid_flag <= 1'b0;
		wr_txt	    <= wr_txt;
	end
end

integer w_file; // w_file 是一个文件描述,需要定义为 integer 类型
//initial w_file = $fopen("/home/work/output_file/data_o.txt");//Linux系统下文件保存路径示例
initial w_file = $fopen("E:/work/output_file/data_o.txt");//win系统下文件保存路径示例

always@(posedge iclk) begin//仅在valid_flag变化的情况下才将wr_txt写入文件
	if(valid_flag)
		$fwrite(w_file,"%h\n",wr_txt);// %h 十六进制保存,\n:换行符
end

2021年7月22日更新:

发现一个bug,实时运行时或停止仿真但不关闭ModelSim,如果数据量(行数)不是64的整数倍的话,最后一部分数据无法写入到txt中,即txt保存的数据量始终是64的整数倍。--------导致这种情况的具体原因未知待查

暂时未测试如果手动关闭ModelSim后最后一部分数据是否会被写入txt文件中。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值