利用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文件中。