ハードウェア記述言語と検証

上の記述でラッチができてしまう理由と、対策の組み合わせとして正しいものはどれか。

always @(*) begin
    case (sel)
        2'b00: y = a;
        2'b01: y = b;
        2'b10: y = c;
    endcase
end
  1. Acaseの中で3つの入力を使っているため。入力を2つに減らす
  2. Bsel=2'b11のときにyへの代入がないため。default節を加えて、すべての場合に値を決める
  3. 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. フリップフロップになり、別の回路になってしまいます。
この分野を解く 分野ページへ

ハードウェア記述言語と検証のほかの問題

  1. 組み合わせ回路のalwaysブロックで、意図しないラッチを防ぐためによく使われる書き方はどれか。
  2. 次のVerilogの記述のうち、論理合成で回路にならず無視されるもの(シミュレーション用の記述)はどれか。
  3. 上のように8ビットのdの中の1の数を数える記述を論理合成すると、どのような回路になるか。
  4. 上の記述のリセットの種類と動作として正しいものはどれか。
  5. 同期リセットと非同期リセットの違いとして正しいものはどれか。