補足 - z,xに対する比較演算子とcase

[] [] []


(1) 比較演算子

!=====1,0の他にz,xも比較できる関係演算子で、論理合成向けの記述では使わないがテストベンチでは==でなく===を使う。

a === b // z,xを含めて一致ならば1

a !== b // z,xを含めて不一致ならば1

a == b // z,xを含むときは不定値(x)になる

a != b // z,xを含むときは不定値(x)になる

) a0でなかったらFAILという場合

if(a!=0) $display("--FAIL");と書くとax(不定値)のとき(a!=0)xになるのでifが不成立になってしまいFAILを見落とすが、

if(a!==0) $display("--FAIL ");と書くとax(不定値)のとき(a!==0)1になるのでifが成立し、FAILと検出できる。

(2) case

case(in) // z,xを含めて一致したときに実行する

0 : <in=0のとき実行>

1 : <in=1のとき実行>

x : <in=xのとき実行 (通常使わない)>

z : <in=zのとき実行 (通常使わない)>

default: <out=x;と書けばin=xのときoutxが伝搬する>

 

casez(in) // zdon't careとして扱う

0 : <in=0,zのとき実行>

1 : <in=1,zのとき実行>

x : <in=x,zのとき実行 (通常使わない)>

z : <in=0,1,z,xのとき実行 (don't care)>

? : <zの代わりに?と書いてもよい>

default: <out=x;と書けばin=xのときoutxが伝搬する>

 

casex(in) // z,xdon't careとして扱う

0 : <in=0,z,xのとき実行>

1 : <in=1,z,xのとき実行>

x : <in=0,1,z,xのとき実行 (don't care)>

z : <in=0,1,z,xのとき実行 (don't care)>

default: <out=x;と書いてもin=xのときoutxが伝搬するとは限らない>

don't careを使う場合はcasezcasexも使えるが、不定値xを伝搬させるという意味でcasezを使った方がよいと言われている。もっとも、xを伝搬させるためにif文ではelsexの代入を書いたりはしないので、あまり気にしなくてもよい。

) 優先度付きエンコーダ

casez(in)

4'b1???: out=2'd0;

4'b01??: out=2'd1;

4'b001?: out=2'd2;

4'b0001: out=2'd3;

endcase


[] [] []