2016-10-31 10 views
1

私は4ビットのベクトルを持っています。ベクトルのベクトルの1ビットが1であるかどうかをチェックしたいのですが、基本的には最初の反復は、ベクトルからの最初のビットが1であるかどうかをチェックし、次の反復チェックで2番目のビットが1であるかどうかを確認します。Chiselでのビットベクトルの比較

以下に示すswitch文で試してみましたが、必要なように動作しません。

for(i <- 0 until ways) { //ways = 3 
     switch(current_way(i)){ 
     is(UInt(1)){ 
     way_dout(i) := way.io.dout((i+1)*line_size-1,i*line_size) 
     } 
    } 

ありがとうございます。

答えて

1

を、あなたは(?つまり、どのような種類がcurrent_way、way_dout、および方法である)私達にあなたの変数のあなたのインスタンスを表示する必要があります。


ここにはいくつかのアプローチがあります。ひとつのアイデアはこれです:

val ways_vector = Wire(Vec(num_ways, Bool()) 
val way_dout = Wire(init=Vec.fill(num_ways){UInt(0, width = line_size)}) 
... 
// set values of ways_vector... 
... 
for (i <- 0 until num_ways) { 
    when (ways_vector(i)) { 
    ... 
    } 
} 

しかしforループは醜いです。マップはより明確に自分の意思を示しています。

val way_dout = 
    ways_vector.zipWithIndex.map{ case (w, i) => 
    Mux(w, 
     way.io.dout((i+1)*line_size-1, i*line_size), 
     UInt(0))} 

zipWithIndexはScalaのイズムであり、ハードウェア設計に素晴らしい多くの電力をもたらします。

0

way_dout(i)は、current_way(i)が設定されている場合はway.io.doutの値から選択し、それ以外の場合はゼロにします。あなたはこのような何か行うことができます。私たちはあなたに最高の答えを与えるのを助けるために、FYI

for(i <- 0 until ways) { //ways = 3 
    way_dout(i) := current_way(i) & way.io.dout((i+1)*line_size-1,i*line_size) 
} 
+0

返信いただきありがとうございます。あなたのやり方もうまくいかないようです。だから、current_wayは4ビットのベクトルであり、各繰り返しに対して、LSBから始まる各ビットを一度にチェックしたいと思う。ビットが1の場合、way_dout(i)はway.io.dout(...)からデータを取得します。そうでなければ、way_dout(i)に0を格納します。 – user2466860

+0

@ user2466860私はコードをテストしていませんでしたが、あなたはちょうど言ったことをしなければなりません。コンパイル/エラボレーション時にエラーが発生しますか?なぜそれがうまくいかないのか説明できますか? – Kamyar