In Verilog ist der Always-Block einer der prozeduralen Blöcke. Anweisungen innerhalb eines Always-Blocks werden nacheinander ausgeführt.
Ein Always-Block wird immer ausgeführt, im Gegensatz zu Initialblöcken, die nur einmal zu Beginn der Simulation ausgeführt werden. Dem Always-Block sollte eine vertrauliche Liste oder eine Verzögerung zugeordnet sein
Die vertrauliche Liste ist diejenige, die dem Always-Block mitteilt, wann der Codeblock ausgeführt werden soll.
Syntax
Der Verilog Blockieren Sie immer die folgende Syntax
always @ (event) [statement] always @ (event) begin [multiple statements] end
Beispiele
Das Symbol @ nach dem reservierten Wort stets , zeigt an, dass der Block ausgelöst wird bei die Bedingung in Klammern nach dem Symbol @.
always @ (x or y or sel) begin m = 0; if (sel == 0) begin m = x; end else begin m = y; end end
Im obigen Beispiel beschreiben wir einen 2:1-Mux mit den Eingängen x und y. Der Das ist der ausgewählte Eingang und M ist der Mux-Ausgang.
In jeder kombinatorischen Logik ändert sich die Ausgabe, wenn sich die Eingabe ändert. Wenn diese Theorie auf Always-Blöcke angewendet wird, muss der Code in Always-Blöcken immer dann ausgeführt werden, wenn sich die Eingabe- oder Ausgabevariablen ändern.
HINWEIS: Es kann die Datentypen „Reg“ und „Integer“ steuern, nicht jedoch die Datentypen „Wire“.
Es gibt zwei Arten von sensiblen Listen im Verilog, wie zum Beispiel:
- Pegelempfindlich (für Kombinationsschaltungen).
- Kantenempfindlich (für Flip-Flops).
Der folgende Code ist der gleiche 2:1-Mux, aber die Ausgabe M ist jetzt ein Flip-Flop-Ausgang.
k nächster Nachbar
always @ (posedge clk ) if (reset == 0) begin m <= 0; end else if (sel="=" 0) begin m <="x;" pre> <h4>NOTE: The always block is executed at some particular event. A sensitivity list defines the event.</h4> <h3>Sensitivity List</h3> <p>A sensitivity list is an expression that defines when the always block executed, and it is specified after the @ operator within the parentheses ( ). This list may contain either one or a group of signals whose value change will execute the always block.</p> <p>In the code shown below, all statements inside the always block executed whenever the value of signals x or y change.</p> <pre> // execute always block whenever value of 'x' or 'y' change always @ (x or y) begin [statements] end </pre> <p> <strong>Need of Sensitivity List</strong> </p> <p>The always block repeats continuously throughout a simulation. The sensitivity list brings a certain sense of timing, i.e., whenever any signal in the sensitivity list changes, the always block is triggered.</p> <p>If there are no timing control statements within an always block, the simulation will hang because of a zero-delay infinite loop.</p> <p>For example, always block attempts to invert the value of the signal clk. The statement is executed after every 0-time units. Hence, it executes forever because of the absence of a delay in the statement.</p> <pre> // always block 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 and it continues // in a loop and simulation will hang always clk = ~clk; </pre> <p>If the sensitivity list is empty, there should be some other form of time delay. Simulation time is advanced by a delay statement within the always construct.</p> <pre> always #10 clk = ~clk; </pre> <p>Now, the clock inversion is done after every 10-time units. That's why the real Verilog design code always requires a sensitivity list.</p> <h4>NOTE: Explicit delays are not synthesizable into logic gates.</h4> <h3>Uses of always block</h3> <p>An always block can be used to realize combinational or sequential elements. A sequential element like flip flop becomes active when it is provided with a clock and reset.</p> <p>Similarly, a combinational block becomes active when one of its input values change. These hardware blocks are all working concurrently independently of each other. The connection between each is what determines the flow of data.</p> <p>An always block is made as a continuous process that gets triggered and performs some action when a signal within the sensitivity list becomes active.</p> <p>In the following example, all statements within the always block executed at every positive edge of the signal clk</p> <pre> // execute always block at the positive edge of signal 'clk' always @ (posedge clk) begin [statements] end </pre> <h3>Sequential Element Design</h3> <p>The below code defines a module called <strong> <em>tff</em> </strong> that accepts a data input, clock, and active-low reset. Here, the always block is triggered either at the positive edge of the <strong> <em>clk</em> </strong> or the negative edge of <strong> <em>rstn</em> </strong> .</p> <p> <strong>1. The positive edge of the clock</strong> </p> <p>The following events happen at the positive edge of the clock and are repeated for all positive edge of the clock.</p> <p> <strong>Step 1:</strong> First, if statement checks the value of active-low reset <strong> <em>rstn</em> </strong> .</p> <ul> <li>If <strong> <em>rstn</em> </strong> is zero, then output q should be reset to the default value of 0.</li> <li>If <strong> <em>rstn</em> </strong> is one, then it means reset is not applied and should follow default behavior.</li> </ul> <p> <strong>Step 2:</strong> If the previous step is false, then</p> <ul> <li>Check the value of d, and if it is found to be one, then invert the value of q.</li> <li>If d is 0, then maintain value of q.</li> </ul> <pre> 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;" end endmodule pre> <p> <strong>2. Negative edge of reset</strong> </p> <p>The following events happen at the negative edge of <strong> <em>rstn</em> </strong> .</p> <p> <strong>Step 1:</strong> First, if statement checks the value of active-low reset <strong> <em>rstn</em> </strong> . At the negative edge of the signal, its value is 0.</p> <ul> <li>If the value of <strong> <em>rstn</em> </strong> is 0, then it means reset is applied, and output should be reset to the default value of 0.</li> <li>And if the value of <strong> <em>rstn</em> </strong> is 1, then it is not considered because the current event is a negative edge of the <strong> <em>rstn</em> </strong> .</li> </ul> <h3>Combinational Element Design</h3> <p>An always block can also be used in the design of combinational blocks.</p> <p>For example, the digital circuit below represents three different logic gates that provide a specific output at signal o.</p> <img src="//techcodeview.com/img/verilog-tutorial/39/verilog-always-block.webp" alt="Verilog Always Block"> <p>The code shown below is a module with four input ports and a single output port called o. The always block is triggered whenever any of the signals in the sensitivity list changes in value.</p> <p>The output signal is declared as type <strong> <em>reg</em> </strong> in the module port list because it is used in a procedural block. All signals used in a procedural block should be declared as type <strong> <em>reg</em> </strong> .</p> <pre> 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 < pre> <p>The signal o becomes 1 whenever the combinational expression on the RHS becomes true. Similarly, o becomes 0 when RHS is false.</p> <hr></=></pre></=></pre></=>
Bedarf an Sensitivitätsliste
Der Always-Block wird während einer Simulation kontinuierlich wiederholt. Die Sensitivitätsliste bringt ein gewisses Timing mit sich, d. h. wann immer sich ein Signal in der Sensitivitätsliste ändert, wird der Always-Block ausgelöst.
Wenn in einem Always-Block keine Zeitsteuerungsanweisungen vorhanden sind, bleibt die Simulation aufgrund einer Endlosschleife ohne Verzögerung hängen.
Jahr in Quartale
Blockieren Sie beispielsweise immer Versuche, den Wert des Signals clk zu invertieren. Die Anweisung wird nach jeweils 0-Zeiteinheiten ausgeführt. Daher wird die Ausführung aufgrund der fehlenden Verzögerung in der Anweisung für immer ausgeführt.
// always block 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 and it continues // in a loop and simulation will hang always clk = ~clk;
Wenn die Empfindlichkeitsliste leer ist, sollte es eine andere Form der Zeitverzögerung geben. Die Simulationszeit wird durch eine Verzögerungsanweisung innerhalb des Always-Konstrukts vorverlegt.
always #10 clk = ~clk;
Jetzt erfolgt die Taktumkehr alle 10 Zeiteinheiten. Aus diesem Grund erfordert der echte Verilog-Designcode immer eine Vertraulichkeitsliste.
HINWEIS: Explizite Verzögerungen können nicht in Logikgatter umgewandelt werden.
Verwendungsmöglichkeiten von Always Block
Mit einem Always-Block können kombinatorische oder sequentielle Elemente realisiert werden. Ein sequentielles Element wie ein Flip-Flop wird aktiv, wenn es mit einem Takt versehen und zurückgesetzt wird.
Ebenso wird ein Kombinationsblock aktiv, wenn sich einer seiner Eingangswerte ändert. Diese Hardwareblöcke arbeiten alle gleichzeitig und unabhängig voneinander. Die Verbindung zwischen jedem bestimmt den Datenfluss.
Ein Always-Block wird als kontinuierlicher Prozess erstellt, der ausgelöst wird und eine Aktion ausführt, wenn ein Signal in der Sensitivitätsliste aktiv wird.
Im folgenden Beispiel werden alle Anweisungen innerhalb des Always-Blocks bei jeder positiven Flanke des Signals clk ausgeführt
// execute always block at the positive edge of signal 'clk' always @ (posedge clk) begin [statements] end
Sequentielles Elementdesign
Der folgende Code definiert ein Modul namens tff das eine Dateneingabe, einen Takt und einen Active-Low-Reset akzeptiert. Dabei wird der Always-Block entweder bei der positiven Flanke des ausgelöst clk oder die negative Flanke von rstn .
1. Die positive Flanke der Uhr
Die folgenden Ereignisse passieren an der positiven Flanke des Takts und werden für alle positiven Flanken des Takts wiederholt.
Schritt 1: Zuerst überprüft die if-Anweisung den Wert des Active-Low-Resets rstn .
- Wenn rstn Null ist, sollte der Ausgang q auf den Standardwert 0 zurückgesetzt werden.
- Wenn rstn ist eins, dann bedeutet dies, dass das Zurücksetzen nicht angewendet wird und dem Standardverhalten folgen sollte.
Schritt 2: Wenn der vorherige Schritt falsch ist, dann
- Überprüfen Sie den Wert von d. Wenn sich herausstellt, dass er eins ist, invertieren Sie den Wert von q.
- Wenn d 0 ist, behalten Sie den Wert von q bei.
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;" end endmodule pre> <p> <strong>2. Negative edge of reset</strong> </p> <p>The following events happen at the negative edge of <strong> <em>rstn</em> </strong> .</p> <p> <strong>Step 1:</strong> First, if statement checks the value of active-low reset <strong> <em>rstn</em> </strong> . At the negative edge of the signal, its value is 0.</p> <ul> <li>If the value of <strong> <em>rstn</em> </strong> is 0, then it means reset is applied, and output should be reset to the default value of 0.</li> <li>And if the value of <strong> <em>rstn</em> </strong> is 1, then it is not considered because the current event is a negative edge of the <strong> <em>rstn</em> </strong> .</li> </ul> <h3>Combinational Element Design</h3> <p>An always block can also be used in the design of combinational blocks.</p> <p>For example, the digital circuit below represents three different logic gates that provide a specific output at signal o.</p> <img src="//techcodeview.com/img/verilog-tutorial/39/verilog-always-block.webp" alt="Verilog Always Block"> <p>The code shown below is a module with four input ports and a single output port called o. The always block is triggered whenever any of the signals in the sensitivity list changes in value.</p> <p>The output signal is declared as type <strong> <em>reg</em> </strong> in the module port list because it is used in a procedural block. All signals used in a procedural block should be declared as type <strong> <em>reg</em> </strong> .</p> <pre> 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 < pre> <p>The signal o becomes 1 whenever the combinational expression on the RHS becomes true. Similarly, o becomes 0 when RHS is false.</p> <hr></=></pre></=>=>=>