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

上のように8ビットのdの中の1の数を数える記述を論理合成すると、どのような回路になるか。

always @(*) begin
    count = 0;
    for (i = 0; i < 8; i = i + 1)
        count = count + d[i];
end
  1. A8クロックかけて1ビットずつ数える順序回路になる
  2. Bループが8回分に展開され、足し算の回路が並んだ組み合わせ回路になる
  3. Cforループは合成できないので、エラーになる
答えと解説を見る

正解:B. ループが8回分に展開され、足し算の回路が並んだ組み合わせ回路になる

HDLのforループは、ソフトウェアのように同じ回路を繰り返し使うのではなく、論理合成で回数分の回路に展開されます。この例では8回分の足し算の回路が並んだ組み合わせ回路になり、1クロックのうちに全部を計算します。ループの回数が多いと回路が大きく、遅延も長くなるので注意が必要です。時間をかけて少ない回路で計算したいなら、クロックで動く状態機械として書きます。

  • A. クロックを使っていないので、時間をかけて数える回路にはなりません。
  • B. 正しい。繰り返しの回数が決まっているので展開できます。
  • C. 回数が固定のforループは合成できます。
この分野を解く 分野ページへ

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

  1. 上の記述のリセットの種類と動作として正しいものはどれか。
  2. 同期リセットと非同期リセットの違いとして正しいものはどれか。
  3. 非同期リセットを使う回路で、リセットの解除(0から1への変化)を2段のフリップフロップでクロックに同期させてから各回路に配る理由として正しいものはどれか。
  4. HDLで書く状態機械(ステートマシン)の基本的な構成として正しいものはどれか。
  5. 上の状態機械の記述で、2つ目のalwaysブロックの先頭に「next = state;」を書いている理由として正しいものはどれか。