ModelSim和matlab同为两款强大的软件,前者工作的重心在于硬件设计的仿真,后者则是强大的数学分析,当硬件系统处理的信号比较复杂时,就可能会涉及到使用matlab来对ModelSim仿真输出的结果进行分析处理的情况,这是两款软件的联合仿真就显得尤为重要。
本文介绍一种以“文本文件”为媒介的联合仿真过程,即通过文件读写的方式实现二者的交互。比如通过matlab软件生成测试数据并写入.txt文件中,由ModelSim软件通过内部函数(如fscanf)将文件中的数据依次读入系统内模拟数字信号的采样值进行处理;ModelSim对数据完成处理后,将最终的结果再次通过系统函数(如fdisplay)将数据写入.txt文件中,由matlab软件读取进行后期信号分析处理。
本博客层转载过一篇文章通过文件读写方式实现Matlab和Modelsim的联合仿真,(http://5460521xp.blog.163.com/blog/static/69087569201052111923399/),里面详细讲解了联合仿真的具体实现过程,这里不再重复赘述。
本文重点介绍一种更实用的ModelSim读写.txt文件的方法。
读文件:
以待读取数据为16bit为例。
integer fid_in;
integer data_in_int;
fid_in = $fopen("real_input.txt","r");
always @ (posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
data_in <= 16'd0;
end
else
begin
rc_x = $fscanf(fid_in,"%d",data_in_int);
data_in <= data_in_int;
end
end
系统函数将数据以32bit整型格式读入内存中,由于多位宽数据向少位宽数据赋值时,综合工具默认将多位宽数据的低位赋给少位宽数据,因此数据得以以原始大小传入ModelSim的输入数据寄存器内。
由于为了方便大家使用,同样附上matlab写.txt的代码:
fid = fopen('data_in.txt','w');
fprintf(fid,'%d\n',data_in);
fclose(fidro);
需要注意的时,matlab生成数据的设置位宽(其量化值对应的位宽)应同ModelSim内仿真要求的数据位宽相一致,这样才能保证数据的大小不会在传输中出现误差。
写文件:
以待写入数据位宽16bit为例。
parameter MAXVAL_c = 2**(16 -1);
parameter OFFSET_c = 2**(16);
initial
fid = $fopen("data_output.txt");
end
integer data_int;
always @ (posedge clk)
begin
if(data_valid)
begin
data_int = data;
$fdisplay(fid, "%d", (data_int < MAXVAL_c) ? data_int : data_int - OFFSET_c);
end
end
其中参数MAXVAL_c 为数据以补码形式表示时,向上溢出的临界值,即16bit位宽的数据转换成整型数据(integer,高位补零转成32位整型数据),当转换结果大于或等于MAXVAL_c 时,表示数据溢出。
实际上,只有16bit的数据为负数时,才会出现上述所提到的溢出情况,这个时候就要对其进行修正,使得matlab或者其他软件在读取转换后的整型数据时仍然能得到原始的数据值。这时就用到了偏移量OFFSET_c,直接整型转换后的结果减去OFFSET_c就得到了32位整型数据表示的原始数据值。
将待写入数据进行了以上整型转换后就可以直接写入.txt文件中。matlab软件可以使用load命令直接从txt文件中读取上述数据,得到最初的处理输出结果。
matlab读取命令为:data= load('data_output.txt');