メンバシップ演算子 inside

概要

分類や特徴

  • 演算子。
  • 条件式に使います。真/偽を返します。
  • 論理合成も出来るらしいが、右辺がリテラル値でないと厳しいとか。

存在意義、使いどころ

  • ソースの可読性up

ネガティブな要素

  • 使っている人があまりいない
  • 論理合成に不安

基本

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と比較する)ということだろうか。試してませんが。


Top > 言語 > verilog > リファレンス > inside
link_pdfプラグインはご利用いただけなくなりました。























-

最終更新:2008年11月24日 18:29