为什么 chisel UInt(32.W) 不能取 bit[32] 恰好为 1 的无符号数?

why chisel UInt(32.W) can not take a unsigned number which bit[32] happens to be 1?

定义UInt为无符号整数类型。但在这种情况下,MSB 似乎仍然是一个标志。例如,最相关的 QA 是 Chisel UInt negative value error,它可以解决问题,但不知道为什么。你能给我讲讲 'why' 吗?

UInt 似乎在 chisel3/chiselFrontend/src/main/scala/chisel3/core/Bits.scala 中定义,但我无法理解细节。是 UInt 派生自 Bits 而 Bits 派生自 Int of scala?

简单的答案是,这是由于 Scala 评估事物的方式所致。 考虑一个像

这样的例子
val x = 0xFFFFFFFF.U

该语句导致错误。 UInt 文字在内部由 BigInts 表示,但 0xFFFFFFFF 是一个指定的 Int 值。 0xFFFFFFFF 相当于 Int 值 -1。 -1 Int 值转换为 BigInt -1 并且 -1.U 是非法的,因为 .U 文字创建方法不会接受负值。 添加 L 解决了这个问题,因为 0xFFFFFFFL 是一个正长值。

问题是 Scala 只有 有符号整数,它没有无符号整数类型。来自 REPL

scala> 0x9456789a
res1: Int = -1806272358

因此,凿子只能看到负数。 UInts显然不能为负所以Chisel报错。

如果您希望将负数的原始 2 补码表示形式解释为 UInt,则始终可以从 SInt 转换为 UInt。例如

val a = -1.S(32.W).asUInt
assert(a === "xffffffff".U)