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

2段のシフトレジスタのつもりで、上のようにブロッキング代入(=)で書いた。起こる問題として正しいものはどれか。

always @(posedge clk) begin
    q1 = d;
    q2 = q1;
end
  1. Aq2には同じエッジで更新されたq1(つまりd)が入り、1段分しか遅れない回路になる
  2. Bq1とq2の値が永久に0のままになる
  3. C正しく2段のシフトレジスタになり、問題はない
答えと解説を見る

正解:A. q2には同じエッジで更新されたq1(つまりd)が入り、1段分しか遅れない回路になる

ブロッキング代入では、1行目でq1がすぐにdの値に更新され、2行目のq2には更新後のq1、つまりdが入ります。その結果q2はq1と同じ値になり、シミュレーションでも合成した回路でも1段しか遅れません。「q1 <= d; q2 <= q1;」と書けば、q2にはエッジの前のq1が入り、意図どおり2段のシフトレジスタになります。行の順番を逆にすれば動くこともありますが、間違いのもとになります。

  • A. 正しい。<=で書けば2段になります。
  • B. 値は更新されます。
  • C. ブロッキング代入では、次の行が新しい値を使ってしまいます。
この分野を解く 分野ページへ

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

  1. Verilogで代入の種類を使い分けるときの一般的なガイドラインとして正しいものはどれか。
  2. Verilogで「always @(*)」と書く意味として正しいものはどれか。
  3. 組み合わせ回路のつもりで上のように書いた。起こりうる問題として正しいものはどれか。
  4. 組み合わせ回路のつもりで上のように書くと、論理合成で何ができるか。
  5. 上の記述でラッチができてしまう理由と、対策の組み合わせとして正しいものはどれか。