2017-10-10 4 views
3

おそらく簡単ですが、チゼルのUInt()値のビットサイズを取得する方法を簡単に見つけることはできません。チゼルでUInt()のサイズを取得するには?

は私が宣言によってサイズを設定する方法を知っている:

val size = a.? 

または::

val size = width(a) 

val a = UInt(INPUT, 16) 

しかし、 '' サイズを取得するには、のようなプロパティがあります

答えて

3

いくつかのことがあります。まず、Chisel 2のセマンティクスを使用しているようです。おそらく、あなたは速い答えはあなたのような幅を得ることができている

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

書き込みしなければならないことを意味するチゼル3セマンティクスを使用する必要があります。

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

ますのスラック変数の幅の値がであり、これはInt、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

ありがとうございました。私はchisel2を使用しています。これは古いプロジェクトだからです。しかし私の新しいプロジェクトでは、私は現在chisel3を使用しています。 – FabienM

関連する問題