4

レジスタの数ビットのみを比較する必要があり、他のビットは気にしないというシナリオがあるとします。eq、3 ビット レジスタ (A[2:0]) の最初と最後のビットをチェックする必要があり、中央のビットは気にしません。たとえば、比較ベクトルは 3'b1X0 (パラメーター) です。

  1. これを行う最も簡単な方法は、関心のあるすべてのビットを選択し、AND を選択して制御信号を生成することです。 if ((A[2]==1) & ((A[0]==0))ここで、ifステートメント内の条件が制御信号です。

  2. もう 1 つの方法は、casex ステートメントを使用することですcasex(A) begin 3'b1?0: ... , ... endcase

  3. 1番目と2番目の方法を使用せずにこの種の操作を行うために使用できるifx-elsexステートメントのようなものはありますか?

ありがとう!

4

3 に答える 3

2

(A[2]==1)は論理式で&あり、ビットごとの演算子ですが、どちらも機能しますが、&&論理 and 演算子を使用する方がセマンティクスとして優れています。&&これは、が短絡演算子である他のほとんどの言語とは少し異なります。

論理的にはあなたが望むものですがif ((A[2]==1) && ((A[0]==0))、ビット単位の式に減らすことができます:

if ( ~A[0] & A[2] ) 

注意: casex の使用は避けてください。不明な部分はシミュレーションで x と一致します。casez代わりに ?を使用してみてください。don't care に一致させるために引き続き使用できます。

内部をcasezと比較して更新

Case ステートメントは、大規模な if elsif else チェーンを回避するためにほとんどの言語で使用されるクリーンな制御構造です。内部操作は、x を don't care '?' に一致させます。値。これにより、シミュレーションの失敗を隠すことができるため、使用するのが悪いと考えられている casex と同様の使用法になります。

casez(sel)
  4'b1??? a= 3'd4;
  4'b01?? a= 3'd3;
  4'b001? a= 3'd2;
  4'b0001 a= 3'd1;
  4'b0000 a= 3'd0;  
endcase

if (sel inside {4'b1???})
  a= 3'd4;
else if (sel inside {4'b01??})
  a= 3'd3;
else if (sel inside {4'b001?})
  a= 3'd2;
...

上記は実際にはcasexと同じです(ただし、より詳細です)casexの代わりに次のものも使用できると思います:

case(sel) inside
  4'b1??? a= 3'd4;
  4'b01?? a= 3'd3;
  4'b001? a= 3'd2;
  4'b0001 a= 3'd1;
  4'b0000 a= 3'd0;  
endcase

しかし、その後、私はcasexを使用することはありません.

于 2013-06-18T21:54:44.053 に答える
0

私が知っている演算子で、「?」を使用できるものはありません。または等価比較内の 'x' を使用してそれらを無視します。

あなたが言及しなかった別の代替手段は、ビットマスクを使用して、関心のあるビットのみを選択することです。ビット数が多い場合、各ビットを個別にテストするよりもコンパクトになります。

のみを気にする場合はA == 3'b1?0、次のように記述できます。

if((A & 3'b101) == 3'b100)

于 2013-06-18T21:24:19.140 に答える