如何在凿子中获取 UInt() 的大小?

How to get size of UInt() in chisel?

也许这很简单,但我不能简单地找到如何在 Chisel 中获取 UInt() 值的位大小?

我知道如何通过声明设置尺寸:

val a = UInt(INPUT, 16)

但是要获得 'a' 尺寸,是否有像 :

这样的 属性
val size = a.?

或:

val size = width(a)

几件事。首先,看起来您正在使用 Chisel 2 语义。您可能应该使用 Chisel 3 语义,这意味着您应该编写

val a = Input(UInt(16.W))

快速回答是您可以获得如下宽度:

val theWidth = if(io.in0.widthKnown) io.in0.getWidth else -1

或使用匹配

val theWidth = io.in0.widthOption match {
  case Some(w) => w
  case None => -1 // you decide what you want the unknown case to be.
}

你现在在 Scala 变量 theWidth 中有了宽度的值,它是一个 Int,if 或 match 必须是使用是因为原则上宽度可能是未定义的。

较长的答案是您应该谨慎执行此操作。 theWidth 在电路生成时进行评估,如果正在使用宽度推断(如果您正在询问凿子类型的宽度通常是这种情况),您将看不到它因为宽度推断是在详细说明电路并由 Firrtl 编译器处理后完成的。

您可以将想要知道的宽度作为电路的参数,并使用它代替 widthOption。有点像。

class X(ioWidth: Int) extends Module {
  val io = IO( new Bundle {
    val in0 = Input(UInt(ioWidth.W))
    ...
  })

  val reg = Reg(UInt((ioWidth * 2).W)) // using width parameter here.
  ...
}