如何在凿子中获取 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.
...
}
也许这很简单,但我不能简单地找到如何在 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.
...
}