メンバシップ演算子 inside
概要
分類や特徴
- 演算子。
- 条件式に使います。真/偽を返します。
- 論理合成も出来るらしいが、右辺がリテラル値でないと厳しいとか。
存在意義、使いどころ
ネガティブな要素
例
基本
if( num inside {8'h00,8'h01,0'h02} )
numが8'h00~8'h02の時真、それ以外で偽。以下と等価。
if( (num==8'h00)||(num==8'h01)||(num==8'h02) )
集合に信号を使う
wire[7:0] num;
reg [7:0] r_th0;
reg [7:0] r_th1;
reg [7:0] r_th2;
if( num inside {r_th0,r_th1,r_th2} )
定数でなくてもOK.
numがr_th0,r_th1,r_th2のいずれかと等しい場合に真。
配列に含まれるかどうかを評価する
reg [7:0] r_data [0:31];
if( 8'h02 inside {r_data} )
r_data[0]~r_data[31]の中に8'h02が含まれるなら真。
左辺が定数だとちょっとキモイ・・・
?によるドントケア表現
if( addr inside {4'b100?} )
addrが4'b1000,4'b1001,4'b100x,4'b100zの場合に真。
アドレスデコーダーとかに使うのか?casezと微妙に違うらしい。
これはcasez文に似ているが、重要な違いがある。casez文は、比較の両側にあるZ値をドントケア・ビットとして扱う。
indide演算子は、集合内のZ値だけをドントケア・ビットとして扱う。
insideキーワードの前にある第1オペランド内のビットは、ドントケア・ビットとして扱わない。
上の例でいうと、{3'b00?}としたときにaddr[3]はドントケアになるわけではない(1'b0と比較する)ということだろうか。試してませんが。
最終更新:2008年11月24日 18:29