数据对比纯干货代码!
可以直接用!
这个代码很清晰而且简洁,是我现在正在使用的一个版本,这个代码是很基础的。
代码大概的操作按代码顺序解释一下:
先判断数据是否有脉冲以及是否有仿真结束标志。
然后用函数开始对参照的数据文件按行来读取,一直到文件读到末尾,当文件读到末尾的时候打印结束语。
当文件在读的时候,将仿真数据与参照文件中的数据按行进行对比,不符合的时候将具体情况打印出来。
对sim_end进行边沿判断以及查看是否文件已经读取到末尾,如果没有读取到末尾打印文件状态。
//数据声明,参数定义以及传输
module data_monitor #(
parameter file_name = "",
parameter COM_WIDTH = 2,
parameter DATA_WIDTH = 2,
parameter FORMAT = ""
) (
input clk,
input data_strb,
input [DATA_WIDTH-1:0] data,
input sim_end,
output err
);
reg [DATA_WIDTH-1:0] exp_data;
reg warn;
integer err_cnt;
integer file_ptr;
integer fstatus;
integer eofstatus;
integer line_cnt;
//代码
initial begin
file_ptr = $fopen(file_name,"r"); //find the file, open the data file
fstatus = $rewind(file_ptr); // read the content of data file
fstatus = !$fscanf(file_ptr,FARMAT,exp_data); //write the data to exp_data
warn = 0;
eofstatus = 0;
err_cnt = 0;
line_cnt = 0;
end
assign err = !(err_cnt == 0);
always @(posedge clk) begin
if(data_strb & !sim_end) begin
line_cnt = line_cnt + 1;
if(eofstatus & !warn) begin
$display("FILE %s EOF reached", file_name);
warn <= 1; //aviod the display EOR again
end
else begin
if(data != exp_data || eofstatus != 0) begin
if(eofstatus == 0)
err_cnt <= err_cnt +1;
if(eofstatus == 0)
$display("%0d: %m: data:%h expected:%h @ %d",$time,data,exp_data,line_cnt);
end
end
fstatus <= !$fscanf(file_ptr,FORMAT,exp_data);
eofstatus <= $feof(file_ptr);
end
end
reg sim_end_a;
always@(posedge clk) begin
sim_end_a <= sim_end;
if((!sim_end_a && sim_end) && (eofstatus == 0)) begin
$display("FILE %s EOF not reached @ %d",file_name,line_cnt - 1);
end
end
endmodule