補足 - 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)になる |
例) aが0でなかったらFAILという場合
if(a!=0) $display("--FAIL");と書くとaがx(不定値)のとき(a!=0)もxになるのでifが不成立になってしまいFAILを見落とすが、
if(a!==0) $display("--FAIL ");と書くとaがx(不定値)のとき(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のときoutへxが伝搬する> |
casez(in) // zをdon'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のときoutへxが伝搬する> |
casex(in) // z,xをdon'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のときoutへxが伝搬するとは限らない> |
don't careを使う場合はcasezもcasexも使えるが、不定値xを伝搬させるという意味でcasezを使った方がよいと言われている。もっとも、xを伝搬させるためにif文ではelseにxの代入を書いたりはしないので、あまり気にしなくてもよい。
例) 優先度付きエンコーダ
casez(in) 4'b1???: out=2'd0; 4'b01??: out=2'd1; 4'b001?: out=2'd2; 4'b0001: out=2'd3; endcase |