代码之家  ›  专栏  ›  技术社区  ›  FabienM

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

  •  3
  • FabienM  · 技术社区  · 7 年前

    也许这很容易,但我无法简单地找到如何在凿子中获得UInt()值的位大小?

    我知道如何通过声明设置大小:

    val a = UInt(INPUT, 16)
    

    但要获得“a”大小,是否有如下属性:

    val size = a.?
    

    或:

    val size = width(a)
    
    1 回复  |  直到 7 年前
        1
  •  6
  •   Chick Markley    7 年前

    有几件事。首先,看起来您使用的是凿子2语义。你可能应该使用凿子3语义,这意味着你应该写作

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

    快速答案是,你可以得到如下宽度:

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

    或使用match

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

    现在,在 斯卡拉 变量 宽度 如果是Int,则必须使用if或匹配,因为宽度原则上可能未定义。

    更长远的答案是,你应该小心不要这样做。 在电路生成时进行评估,如果使用宽度推断(通常是询问凿子类型的宽度时的情况),您将无法看到它,因为宽度推断是在详细阐述电路并由 Firrtl公司

    您可以将想要知道的宽度设置为电路的参数,并使用该宽度而不是宽度选项。差不多吧。

    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.
      ...
    }