为什么 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 中的硬件值。
根据 Wires
和 Regs
、==
思考并没有真正意义,因为这些硬件组件在详细说明期间没有静态可知的值。因此,在 Chisel3 中,==
实现了 引用相等性 ,即。仅当两个对象是完全相同的对象时才为真。
现在正如我在开头所说的那样,有一种说法认为我们至少应该让 ==
对文字起作用,即使它不适用于 Wires
这样的硬件组件。这不是 100% 清楚这是否是正确的举动,因为它可能会使人们感到困惑,有时他们使用 ==
(仅对文字),有时他们使用 ===
(对其他所有内容)。由于要测试像 chiseltest
这样的库,我倾向于同意我们应该让 ==
为文字工作,但我只想指出在这一点上存在分歧。
如果我 运行 在我的 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 中的硬件值。
根据 Wires
和 Regs
、==
思考并没有真正意义,因为这些硬件组件在详细说明期间没有静态可知的值。因此,在 Chisel3 中,==
实现了 引用相等性 ,即。仅当两个对象是完全相同的对象时才为真。
现在正如我在开头所说的那样,有一种说法认为我们至少应该让 ==
对文字起作用,即使它不适用于 Wires
这样的硬件组件。这不是 100% 清楚这是否是正确的举动,因为它可能会使人们感到困惑,有时他们使用 ==
(仅对文字),有时他们使用 ===
(对其他所有内容)。由于要测试像 chiseltest
这样的库,我倾向于同意我们应该让 ==
为文字工作,但我只想指出在这一点上存在分歧。