ハードウェア記述言語と検証
2段のシフトレジスタのつもりで、上のようにブロッキング代入(=)で書いた。起こる問題として正しいものはどれか。
always @(posedge clk) begin
q1 = d;
q2 = q1;
end
- Aq2には同じエッジで更新されたq1(つまりd)が入り、1段分しか遅れない回路になる
- Bq1とq2の値が永久に0のままになる
- 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. ブロッキング代入では、次の行が新しい値を使ってしまいます。