有什么区别:
if (dataoutput[7:0] == 8'bx) begin
和
if (dataoutput[7:0] === 8'bx) begin
执行
dataoutput = 52'bx
后,第二个给出1,但第一个给出0。为什么? (0或1为比较结果。)
Verilog 中的某些数据类型,例如
reg
,是 4 态的。这意味着每一位可以是 4 个值之一:0,1,x,z。
使用“大小写相等”运算符
===
,比较 x,结果为 1。
使用
==
,比较的结果不为0,如你所说;相反,根据 IEEE Std (1800-2009) 第 11.4.5 节“相等运算符”,结果是 x:
对于逻辑相等和逻辑 不等式运算符(== 和 !=),if, 由于未知或高阻抗位 在操作数中,关系是 不明确,那么结果应为 1 位未知值 (x)。
在 Verilog 中:
== 用于比较位(0 或 1) === 用于比较所有 4 个状态 (0, 1, x, z)
== 可以合成为硬件(x 或非门),但 === 不能合成,因为 x 不是数字中的有效逻辑电平,它实际上具有 0 和 1 之间的电压。 z 是本身没有任何逻辑,它显示电路断开。
我会添加一些使用指南(其他答案没有给出)。
回顾:什么是四值?
我们通常喜欢在前两个领域进行操作。
对于模拟,您可以有意将值设置为“X”状态。这些值在综合中不存在。在模拟测试中使用
!==
和 ===
非常好,因为它会处理这些值。
大多数综合逻辑是内部的,不使用高 Z 值。合成期间不能出现“X”值;尽管它可能是未知的 0/1 值。因此,对于合成,在大多数情况下最好选择
==
和 !=
。
gtkwave 工具包有一个“lxt2miner”程序,可用于查找复位周期之外的“X”模拟信号。我有这样的构建规则,
$(CHECK_DEFINED) : %.check : %.lxt
$(INFO) ------- Mining $^ ----------
$(Q)lxt2miner $^ -c 2> /dev/null | grep x$$ | grep '^#[^0]' || true
因此,当应用重置时,值在 t=0 时可能是不确定的,但不应在该时间之后发生。当然,您也可以将这些操作员的检查添加到测试工具中。