ハードウェア記述言語と検証
上の記述のリセットの種類と動作として正しいものはどれか。
always @(posedge clk or negedge rst_n)
if (!rst_n) q <= 0;
else q <= d;
- A同期リセットで、rst_nが0の状態でクロックが立ち上がったときにだけqが0になる
- B非同期リセットで、rst_nが0になるとクロックを待たずにすぐqが0になる
- Crst_nが1になるとqが0になる
答えと解説を見る
正解:B. 非同期リセットで、rst_nが0になるとクロックを待たずにすぐqが0になる
センシティビティリストに「negedge rst_n」が含まれているので、rst_nが1から0に変わった瞬間にもブロックが実行され、クロックに関係なくqが0になります。これが非同期リセットです。名前の「_n」は0で有効になる負論理の信号を表す慣習です。クロックが止まっていてもリセットできる利点がありますが、リセットを解除するタイミングには注意が必要です。
- A. リセットのエッジもきっかけになっているので、同期ではありません。
- B. 正しい。センシティビティリストにリセットのエッジがあります。
- C. _nは0のときに有効(負論理)という意味です。