Verilog 中 == 和 === 有什么区别?

问题描述 投票:0回答:5

有什么区别:

if (dataoutput[7:0] == 8'bx) begin

if (dataoutput[7:0] === 8'bx) begin 

执行

dataoutput = 52'bx
后,第二个给出1,但第一个给出0。为什么? (0或1为比较结果。)

verilog system-verilog hdl
5个回答
43
投票

Verilog 中的某些数据类型,例如

reg
,是 4 态的。这意味着每一位可以是 4 个值之一:0,1,x,z。

使用“大小写相等”运算符

===
,比较 x,结果为 1。

使用

==
,比较的结果不为0,如你所说;相反,根据 IEEE Std (1800-2009) 第 11.4.5 节“相等运算符”,结果是 x:

对于逻辑相等和逻辑 不等式运算符(== 和 !=),if, 由于未知或高阻抗位 在操作数中,关系是 不明确,那么结果应为 1 位未知值 (x)。


23
投票

在 Verilog 中:

  • == 测试逻辑相等(测试 1 和 0,所有其他结果将结果为 x)
  • === 测试 4 状态逻辑相等性(测试 1、0、z 和 x)

7
投票

== 用于比较位(0 或 1) === 用于比较所有 4 个状态 (0, 1, x, z)

== 可以合成为硬件(x 或非门),但 === 不能合成,因为 x 不是数字中的有效逻辑电平,它实际上具有 0 和 1 之间的电压。 z 是本身没有任何逻辑,它显示电路断开。


0
投票

正如许多人已经评论的那样,如果信号有 X,“正常”比较运算符可能会导致未知的状态/答案。因此,如果您从可以提供 U 或 X 状态的 RAM 进行比较,并且想要真正检查匹配,那么您应该使用“===”和“!==”运算符。

参见 systemverilog 参考文档中的图片。


0
投票

我会添加一些使用指南(其他答案没有给出)。

回顾:什么是四值?

  • 0 - 逻辑低
  • 1 - 逻辑高电平
  • X - 未指定/未确定
  • Z - 高 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 时可能是不确定的,但不应在该时间之后发生。当然,您也可以将这些操作员的检查添加到测试工具中。

© www.soinside.com 2019 - 2024. All rights reserved.