Menu
Coddy logo textTech

always ブロック

CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 46/90。

プロシージャルブロック(手続き型ブロック)とは、C言語やPythonといったソフトウェアプログラミング言語のように、ステートメントが順番に1つずつ実行されるコードのブロックです。Verilogには、initial(1回だけ実行)とalways(繰り返し継続して実行)という2つのプロシージャルブロックがあります。まずは always ブロックから見ていきましょう。

always block継続的に実行されます — シミュレーションが開始されると永久に繰り返されます。これはフリップフロップ、counterCombinationalロジックなど、実行し続ける必要があるハードウェアを記述するために使用されます。

基本構文:

always @(sensitivity_list) begin
  // 繰り返し実行されるコード
end

@(sensitivity_list) は、ブロックをいつ実行するかを指示します。これがない場合(かつ内部に #5 のようなディレイがない場合)、ブロックは無限ループに陥り、シミュレーションがフリーズします。

always block の example: Counter

以下は、always block を使用して counter を作成する方法の example です。

module counter (
  input clk,
  output reg [3:0] count
);
  always @(posedge clk) count <= count + 1;
endmodule

このコードの仕組み

パーツ意味
alwaysこのコードを永久に繰り返し実行する
@(posedge clk)クロックが0から1に変化する(立ち上がりエッジ)のを待つ
count <= count + 1count の現在の値を取得し、1を加えて、元に保存する

このblockはクロックの立ち上がりエッジ(rising edge)ごとに実行されます。毎回、countが 1 ずつ増加します。

感度リスト @(posedge clk) は、連続的にではなく、クロックエッジでのみ実行するように指示します。これがないと、ループは遅延なしで永続的に実行されてしまいます。

複数の信号を持つ Always ブロック

特定の信号を列挙できます:

always @(a or b) begin
  out = a & b;
end

これは a または b が変更されたときに実行されます。

challenge icon

チャレンジ

このモジュールを動作させるために、不足している always ブロックを追加してください。

動作の仕組み:

  • クロックの立ち上がりエッジごとに、out1 は 0 から 1、または 1 から 0 へトグル(反転)します
  • out2out1 に追従します(out1 と同じ値になります)

行うこと:

  1. always @(posedge clk) ブロックを追加します
  2. 内部で、out1 をトグルさせます(out1 = ~out1 を使用します)
  3. out2out1 と等しくします

自分で試してみよう

module toggler (
  input clk,
  output reg out1,
  output reg out2
);

  initial begin
    out1 = 0;
    out2 = 0;
  end

  // TODO: posedge clk の always ブロックを追加
  // out1 はクロックごとにトグルする
  // out2 は out1 に従う

endmodule
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

基礎のすべてのレッスン