補足 - 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


[] [] []