2017-10-10 54 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