在 Chisel 中使用 UInt 和 SInt Bits 类型有什么区别?
What is the difference between using UInt, SInt Bits types in Chisel?
我知道 SInt 用于有符号数,而 UInt 用于无符号数,所以如果我使用 SInt 而不是 UInt,它会推断出符号扩展名吗?
另一件让我感到困惑的事情是 Bits 和 UInt 类型之间的区别。有人可以向我澄清一下吗?
在使用 Chisel 进行设计时一直使用 UInt 是否安全?
您可以在任何地方使用 UInt,对于初学者来说,可以说您应该这样做。但是使用更合适的类型可以让您对设计进行类型检查,这样您就不会错误地使用不适用于您的类型的 operator/function。
有些设计可以对每个数字使用 UInt,但有时需要使用 SInt。
例如,假设您从内存中加载两个 uint8 值,然后将差值存储回内存中。无法判断这种差异是正数还是负数。
1) 01111011 (123) - 00010110 (22) = 01100101 (101) 所以你会存储 01100101
2) 00010110 (22) - 11110111 (123) = 10011011 (-101) 所以你会存储 10011011
当您在一段时间后加载这些数字时,无法判断 10011011 是数字 155 还是 -101,除非您将其作为 SInt 加载。您应该确保结果适合输出并且不会被截断。
package Whosebug
import chisel3._
class UIntSInt extends Module {
val io = IO(new Bundle {
val x = Input(UInt(8.W))
val y = Input(UInt(8.W))
val z = Output(SInt(9.W))
})
io.z := (io.x -& io.y).asSInt
}
class UIntSIntUnitTest(c: UIntSInt) extends chisel3.iotesters.PeekPokeTester(c) {
poke(c.io.x, 22)
poke(c.io.y, 124)
println(s"Result: ${peek(c.io.z)}")
}
object UIntSIntTest extends App {
chisel3.iotesters.Driver.execute(args, () => new UIntSInt) {
c => new UIntSIntUnitTest(c)
}
}
我知道 SInt 用于有符号数,而 UInt 用于无符号数,所以如果我使用 SInt 而不是 UInt,它会推断出符号扩展名吗?
另一件让我感到困惑的事情是 Bits 和 UInt 类型之间的区别。有人可以向我澄清一下吗?
在使用 Chisel 进行设计时一直使用 UInt 是否安全?
您可以在任何地方使用 UInt,对于初学者来说,可以说您应该这样做。但是使用更合适的类型可以让您对设计进行类型检查,这样您就不会错误地使用不适用于您的类型的 operator/function。
有些设计可以对每个数字使用 UInt,但有时需要使用 SInt。
例如,假设您从内存中加载两个 uint8 值,然后将差值存储回内存中。无法判断这种差异是正数还是负数。
1) 01111011 (123) - 00010110 (22) = 01100101 (101) 所以你会存储 01100101
2) 00010110 (22) - 11110111 (123) = 10011011 (-101) 所以你会存储 10011011
当您在一段时间后加载这些数字时,无法判断 10011011 是数字 155 还是 -101,除非您将其作为 SInt 加载。您应该确保结果适合输出并且不会被截断。
package Whosebug
import chisel3._
class UIntSInt extends Module {
val io = IO(new Bundle {
val x = Input(UInt(8.W))
val y = Input(UInt(8.W))
val z = Output(SInt(9.W))
})
io.z := (io.x -& io.y).asSInt
}
class UIntSIntUnitTest(c: UIntSInt) extends chisel3.iotesters.PeekPokeTester(c) {
poke(c.io.x, 22)
poke(c.io.y, 124)
println(s"Result: ${peek(c.io.z)}")
}
object UIntSIntTest extends App {
chisel3.iotesters.Driver.execute(args, () => new UIntSInt) {
c => new UIntSIntUnitTest(c)
}
}