基于UVM方法的一种数据与参照数据文件对比监控打印System Verilog代码

数据对比纯干货代码!
可以直接用!

这个代码很清晰而且简洁,是我现在正在使用的一个版本,这个代码是很基础的。
代码大概的操作按代码顺序解释一下:
先判断数据是否有脉冲以及是否有仿真结束标志。
然后用函数开始对参照的数据文件按行来读取,一直到文件读到末尾,当文件读到末尾的时候打印结束语。
当文件在读的时候,将仿真数据与参照文件中的数据按行进行对比,不符合的时候将具体情况打印出来。
对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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值