Verilog は常にブロックします
always
ブロックは 手続き型 の 1 つです Verilog のブロック。 always ブロック内のステートメントは順番に実行されます。
構文
always @ (event)
[statement]
always @ (event) begin
[multiple statements]
end
always
ブロックは特定のイベントで実行されます。イベントは機密リストによって定義されます。
機密リストとは?
感受性 list は、always ブロックをいつ実行するかを定義する式で、@
の後に指定します。 括弧内の演算子 ( )
.このリストには、値の変更によって常にブロックが実行されるシグナルの 1 つまたはグループが含まれる場合があります。
以下に示すコードでは、always
内のすべてのステートメントが シグナル a または b の値が変化するたびに、ブロック get が実行されます。
// Execute always block whenever value of "a" or "b" change
always @ (a or b) begin
[statements]
end
Always ブロックは何に使用されますか?
always
ブロックを使用して、組み合わせ要素または順次要素を実現できます。フリップフロップのようなシーケンシャル エレメントは、クロックとリセットが提供されるとアクティブになります。同様に、組み合わせブロックは、入力値の 1 つが変化するとアクティブになります。これらのハードウェア ブロックはすべて、互いに独立して同時に動作します。それぞれの間の接続は、データの流れを決定するものです。この動作をモデル化するには、always
ブロックは、機密リスト内のシグナルがアクティブになったときにトリガーされ、何らかのアクションを実行する継続的なプロセスとして作成されます。
次の例では、always ブロック内のすべてのステートメントが、信号 clk のポジティブ エッジごとに実行されます。
// Execute always block at positive edge of signal "clk"
always @ (posedge clk) begin
[statements]
end
機密リストがない場合はどうなりますか?
always
ブロックは、シミュレーションの期間中、継続的に繰り返されます。感度リストは、特定のタイミング感覚をもたらします。つまり、感度リスト内のシグナルが変化するたびに、常にブロックがトリガーされます。 always ブロック内にタイミング制御ステートメントがない場合、ゼロ遅延の無限ループが原因でシミュレーションが停止します!
例
以下に示す例は、信号 clk の値を反転しようとする always ブロックです。ステートメントは、0 時間単位ごとに実行されます。したがって、ステートメントに遅延がないため、永久に実行されます。
// always block is started at time 0 units
// But when is it supposed to be repeated ?
// There is no time control, and hence it will stay and
// be repeated at 0 time units only. This continues
// in a loop and simulation will hang !
always clk = ~clk;
センシティビティ リストが空であっても、他の形式の時間遅延があるはずです。シミュレーション時間は、always
内の遅延ステートメントによって進められます 以下に示すように構築します。現在、時計の反転は 10 時間単位ごとに行われます。
always #10 clk = ~clk;
注: 明示的な遅延は論理ゲートに合成できません!
したがって、実際の Verilog 設計コードには常に機密リストが必要です。
シーケンシャル エレメントの設計例
以下に示すコードは、データ入力、クロック、およびアクティブ LOW リセットを受け入れる tff というモジュールを定義します。クロックの正のエッジで d が 1 であることが判明するたびに、出力が反転します。ここでは、always
ブロックは、clk のポジティブ エッジまたは rstn のネガティブ エッジのいずれかでトリガーされます。
クロックのポジティブ エッジで何が起こるか?
次のイベントは、クロックのポジティブ エッジで発生し、クロックのすべてのポジティブ エッジで繰り返されます。 <オール>
if
ブロックはアクティブ LOW リセット rstn の値をチェックします
module tff (input d,
clk,
rstn,
output reg q);
always @ (posedge clk or negedge rstn) begin
if (!rstn)
q <= 0;
else
if (d)
q <= ~q;
else
q <= q;
end
endmodule
リセットのネガティブ エッジで何が起こるか?
次のイベントは rstn のネガティブ エッジで発生し、そのようなすべての発生時に発生します。
<オール>if
ブロックは、アクティブ LOW リセット rstn の値をチェックします。信号の負のエッジでは、その値は 0 です。組み合わせ要素の設計例
always
ブロックは、組み合わせブロックの設計にも使用できます。たとえば、次のデジタル回路は、信号 o で特定の出力を提供する 3 つの異なる論理ゲートの組み合わせを表します。
以下に示すコードは module
です 4 つの入力ポートと、o と呼ばれる 1 つの出力ポートがあります。 always
ブロックは、感度リスト内のいずれかのシグナルの値が変化するたびにトリガーされます。出力信号は reg
型として宣言されています 手続き型ブロックで使用されているため、モジュール ポート リストに含まれています。手続き型ブロックで使用されるすべてのシグナルは、型 reg
として宣言する必要があります .
module combo ( input a,
input b,
input c,
input d,
output reg o);
always @ (a or b or c or d) begin
o <= ~((a & b) | (c^d));
end
endmodule
RHS の組み合わせ式が真になるたびに、信号 o が 1 になることを確認します。同様に、RHS が false の場合、o は 0 になります。
シミュレーション出力シミュレーション例のスライドショーはここをクリック!
Verilog