在Chisel中使用UInt,SInt Bits类型有什么区别?

问题描述 投票:0回答:2

我知道SInt用于有符号数字,而UInt用于无符号数字,所以如果我使用SInt代替UInt,它会推断符号扩展例如?

我感到困惑的另一件事是Bits和UInt类型之间的区别。有人可以向我澄清这个吗?

使用Chisel进行设计时,一直使用UInt是否安全?

chisel
2个回答
2
投票

你可以在任何地方使用UInt,对于初学者,可以说你应该这样做。但是使用更合适的类型允许您键入检查您的设计,这样您就不会错误地使用不适用于您的类型的操作符/函数。


0
投票

有些设计可以使用每个数字使用UInt,但有时需要使用SInt。

例如,假设您从内存中加载了两个uint8值,然后将差异存储在内存中。没有办法判断这种差异是积极的还是消极的。

1)01111011(123) - 00010110(22)= 01100101(101)所以你会存储01100101

2)00010110(22) - 11110111(123)= 10011011(-101)所以你会存储10011011

当您在一段时间后加载这些数字时,除非您将其作为SInt加载,否则无法判断10011011是数字155还是-101。您应该确保结果适合输出并且不会被截断。

package StackOverflow

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)
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.