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

上の記述で、クロックの立ち上がりの直前にa=0、b=1だった。立ち上がりの後のaとbの値はどうなるか。

always @(posedge clk) begin
    a <= b;
    b <= a;
end
  1. Aa=1、b=0(入れ替わる)
  2. Ba=1、b=1
  3. Ca=0、b=0
答えと解説を見る

正解:A. a=1、b=0(入れ替わる)

ノンブロッキング代入では、2つの右辺(bの古い値1とaの古い値0)を先に評価してから、aに1、bに0を同時に書き込むので、値が入れ替わります。回路としては、2つのフリップフロップの出力を互いの入力につないだ形です。ブロッキング代入(=)で書くと、1行目でaが1になり、2行目のbには新しいaの1が入って、両方とも1になってしまいます。

  • A. 正しい。右辺はどちらも古い値で評価されます。
  • B. これは「=」で書いた場合の結果です。
  • C. 値が失われることはありません。
この分野を解く 分野ページへ

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

  1. 2段のシフトレジスタのつもりで、上のようにブロッキング代入(=)で書いた。起こる問題として正しいものはどれか。
  2. Verilogで代入の種類を使い分けるときの一般的なガイドラインとして正しいものはどれか。
  3. Verilogで「always @(*)」と書く意味として正しいものはどれか。
  4. 組み合わせ回路のつもりで上のように書いた。起こりうる問題として正しいものはどれか。
  5. 組み合わせ回路のつもりで上のように書くと、論理合成で何ができるか。