为什么 Bool(true) != Bool(true) 在 chisel3 中?

Why Bool(true) != Bool(true) in chisel3?

如果我 运行 在我的 sbt project 中使用 scala 控制台并像这样导入 chisel3 包:

$ sbt 
sbt:CIC> console
scala> import chisel3._
import chisel3._
scala> 

那么如果我声明两个 Bool 变量,它们是不相等的:

scala> val value1 = true.B
value1: chisel3.Bool = Bool(true)

scala> val value2 = true.B
value2: chisel3.Bool = Bool(true)

scala> value1 == value2
res0: Boolean = false

scala> value1.==(value2)
res3: Boolean = false

scala> value1.`==`(value2)
res4: Boolean = false

scala> value1
res5: chisel3.Bool = Bool(true)

scala> value2
res6: chisel3.Bool = Bool(true)

正常吗?

注意:我尝试使用硬件相等 === 但没有成功:

scala> value1 === value2
chisel3.internal.ChiselException: Error: Not in a UserModule. Likely cause: Missed Module() wrap, bare chisel API call, or attempting to construct hardware inside a BlackBox.
  at chisel3.internal.throwException$.apply(Error.scala:155)
  at chisel3.internal.Builder$.forcedUserModule(Builder.scala:494)
  at chisel3.internal.Builder$.pushOp(Builder.scala:558)
  at chisel3.Bits.compop(Bits.scala:206)
  at chisel3.UInt.do_$eq$eq$eq(Bits.scala:617)
  at .$anonfun$res1(<console>:17)
  at chisel3.internal.prefix$.apply(prefix.scala:49)
  at .$anonfun$res1(<console>:17)
  at chisel3.internal.plugin.package$.autoNameRecursively(package.scala:52)
  ... 31 elided

scala> 

这是错误还是正常行为?

我需要在我的 tester2 测试台中比较一些 Bool() 值。

我发现使用相等的解决方案是使用.litValue:

scala> value1.litValue == value2.litValue
res2: Boolean = true

但它仍然是一种奇怪的行为。

简短的回答是,虽然我们可能应该像人们对文字所期望的那样使平等发挥作用,但它并不那么明确一个人可能会想的决定。

考虑到 Chisel 作为硬件生成器语言的主要目的,编写 Chisel 从根本上讲是 元编程,我们必须推理两个不同的阶段:Chisel 细化时间(又名 Scala 运行-时间),以及您生成的用于模拟和综合的实际硬件。

== returns Scala Boolean 所以它只在详细说明时有意义,对生成的 Verilog 没有任何意义。 Chisel 提供 === 其中 returns 一个 chisel3.Bool 这是将显示在 Verilog 中的硬件值。

根据 WiresRegs== 思考并没有真正意义,因为这些硬件组件在详细说明期间没有静态可知的值。因此,在 Chisel3 中,== 实现了 引用相等性 ,即。仅当两个对象是完全相同的对象时才为真。

现在正如我在开头所说的那样,有一种说法认为我们至少应该让 == 对文字起作用,即使它不适用于 Wires 这样的硬件组件。这不是 100% 清楚这是否是正确的举动,因为它可能会使人们感到困惑,有时他们使用 ==(仅对文字),有时他们使用 ===(对其他所有内容)。由于要测试像 chiseltest 这样的库,我倾向于同意我们应该让 == 为文字工作,但我只想指出在这一点上存在分歧。