2017-10-10 103 views
3

也许这很容易,但我不能简单地找到如何获得凿子中的UInt()值的比特大小?如何在凿子中获取UInt()的大小?

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

val a = UInt(INPUT, 16) 

但要获得 'A' 的大小,有没有像一个属性:

val size = a.? 

或者:

val size = width(a) 

回答

3

一些事情。首先,看起来你正在使用凿子2语义。你或许应该使用凿子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 if必须使用匹配,因为宽度原则上可能是未定义的。

较长的答案是,你应该小心要做到这一点。 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. 
    ... 
} 
+0

谢谢。我使用凿子2是因为它是一个旧项目。但在我的新项目中,我现在使用的是凿子3。 – FabienM