ハードウェア記述言語と検証
上の記述でラッチができてしまう理由と、対策の組み合わせとして正しいものはどれか。
always @(*) begin
case (sel)
2'b00: y = a;
2'b01: y = b;
2'b10: y = c;
endcase
end
- Acaseの中で3つの入力を使っているため。入力を2つに減らす
- Bsel=2'b11のときにyへの代入がないため。default節を加えて、すべての場合に値を決める
- Calways @(*)を使っているため。always @(posedge clk)に変える
答えと解説を見る
正解:B. sel=2'b11のときにyへの代入がないため。default節を加えて、すべての場合に値を決める
selは2ビットで4通りの値をとりますが、2'b11の場合が書かれていないので、そのときyは前の値を保つ必要があり、ラッチができます。「default: y = 0;」のように残りのすべての場合の値を決めるか、caseの前でyにデフォルトの値を代入しておけば、組み合わせ回路になります。条件の書き漏れによるラッチは、HDLの初心者がよく出会う誤りです。
- A. 入力の数は原因ではありません。
- B. 正しい。すべての場合を網羅する必要があります。
- C. フリップフロップになり、別の回路になってしまいます。