2017-06-29 55 views
1

它被定義爲UInt是無符號整數的類型。但在這種情況下,MSB似乎仍然是一個標誌。例如,最相關的質量保證是Chisel UInt negative value error,其中找出瞭解決方法,但沒有解決問題。你能否讓我瞭解'爲什麼'?爲什麼鑿UInt(32.W)不能採取一個無符號的數字位[32]碰巧是1?

UInt似乎chisel3/chiselFrontend/src目錄/主/斯卡拉/ chisel3 /核心/ Bits.scala,但我不明白的細節進行定義。 UInt是從Bits衍生而來,Bits是從scala的Int派生而來的?

回答

1

簡單的答案是,這是由於Scala如何評估事物。 考慮像

val x = 0xFFFFFFFF.U 

此語句會導致錯誤的例子。 UInt文字由BigInts內部表示,但0xFFFFFFFF是一個指定的Int值。 0xFFFFFFFF等價於Int值-1。 -1 Int值被轉換爲BigInt -1並且-1.U是非法的,因爲.U文字創建方法不會接受負值。 添加L修復此問題,因爲0xFFFFFFFL是一個正值Long值。

0

問題是Scala 只有已經有符號整數,它沒有無符號整數類型。來自REPL

scala> 0x9456789a 
res1: Int = -1806272358 

因此,鑿子只能看到負數。 UIs顯然不能是負面的,所以鑿子報告錯誤。

如果您想將解碼爲UInt的負數的原始2的補碼錶示解釋爲UInt,則您總是可以從SInt投射到UInt。例如。

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