为什么Chisel UINT(32.W)无法拿出一个无符号的数字[32]恰好是1



可以定义UInt是无符号整数的类型。但是在这种情况下,MSB似乎仍然是一个迹象。例如,最相对的质量质量检查是凿子UINT负值误差,它可以解决解决方法,但没有原因。你能启发我关于"为什么"?

UInt似乎是在Chisel3/chiselfrontend/src/main/scala/chisel3/core/bits.scala中定义的,但我无法理解细节。 UInt是否源自位,钻头来自 scala的int?

简单的答案是,这是由于Scala如何评估事物。考虑一个例如

的例子
val x = 0xFFFFFFFF.U

此语句导致错误。UINT文字由Bigint代表,但是0xffffffff是指定int值的。0xffffffff等效于int值-1。-1 int值转换为bigint -1和-1.u是非法的,因为.U字面创建方法将不接受负值。添加 l 解决此问题,因为0xfffffffl是一个正值。

问题是Scala 已签名整数,它没有无符号的整数类型。从repl

scala> 0x9456789a
res1: Int = -1806272358

因此,凿子只看到负数。UINT显然不会是负面的,因此凿子报告了错误。

,如果您希望RAW 2的补充表示为UINT,则可以随时将其从Sint到UINT。例如

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

最新更新