Verilog X态的检测

文章讲述了在Verilog编程中,x态信号的产生、特性以及如何在仿真过程中检测和处理dut数据输出中的x态。作者介绍了比较运算符和位运算对x态的处理方式,并给出了两种不同的错误检测方法:使用ref数据对比和利用逻辑运算判断x态输出。
摘要由CSDN通过智能技术生成

x态带来的问题

仿真代码时,如果模块输出信号或内部某些关键寄存器出现x态需要及时检测。
我个人常用的对比dut和ref输出信号的语句为:

wire       Error;
reg [31:0] Error_Cnt;
//--------------------------
assign Error = !(dut.data_o==ref.data_o);
always@(posedge clk) begin
	if(Error) Error_Cnt <= Error_Cnt+1'b1;
end
initial begin
	wait(tb_case.complete); // 代码中没有体现tb_case的内容,该信号指示仿真结束。
	if(Error_Cnt>0) $display("/n === Failed === /n");
	else $display("/n === Passed === /n");
	#10 $finish;
end

但当dut.data_o中有部分或全部bit为x态时,Error=1’bx,但此时Error_Cnt不会加1,这导致仿真结束后会打印Passed标志仿真成功。

解决办法

x态信号的一些特征:

引用自:Verilog基础:仿真时x信号的产生和x信号对于各运算符的特性

比较运算符<、<=、>、>=、===、!==、==、!=

对于<、<=、>、>=、==、!=,它们的比较结果是0或1,但是如果操作数中存在x,比较结果为x。
  对于===、!==,它们严格比较两个操作数中的x,因此结果只能为0或1。

b = 3'b111;
c = 3'b0x1;    
$display("result is %b",b<c);//结果为x
 
b = 3'b0x1;
c = 3'b0x1;    
$display("result is %b",b===c);//结果为1

位运算操作符&、|、^、~^、~

位运算符按位对操作数进行操作,注意对于这些运算符,某位的x不会影响其他非x位的结果。且x与1为x,x与0为0,x或1为1,x或0为x。对于异或、同或和取反运算,x位的结果是x。

b = 3'b0x1;
c = 3'bx11;    
$display("result is %b",b&c);//结果为0x1
 
b = 3'b0x1;
c = 3'bx11;    
$display("result is %b",b^c);//结果为xx0

x和z的逻辑运算真值表

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

有效判断x态输出

  • 有ref的情况下:
wire       Error;
reg [31:0] Error_Cnt;
//--------------------------
assign Error = !(dut.data_o===ref.data_o);
always@(posedge clk) begin
   if(Error) Error_Cnt <= Error_Cnt+1'b1;
end
initial begin
   wait(tb_case.complete);
   if(Error_Cnt>0) $display("/n === Failed === /n");
   else $display("/n === Passed === /n");
   #10 $finish;
end
  • 没有ref的情况下:
wire Data_Xor;
wire Data_IsX;
integer file;
//--------------------------
assign Data_Xor = ^dut.data_o;
assign Data_IsX = Data_Xor !==0 && Data_Xor !==1;
initial file = $fopen("./Data_IsX.log","w");
initial begin
  while(start_en) begin // 代码中未体现start_en信号,该信号指示仿真开始
  	if(Data_IsX) begin
  		$fdisplay(file,"Data_o is X!"); // 将信息写入文件file中
  		#10 $fclose(file);
  		#10 $finish; // 如果输出信号出现x态,则停止仿真
  	end
  end
end
  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值