I Verilog är alltid blocket ett av de processuella blocken. Påståenden i ett alltid-block exekveras sekventiellt.
Ett alltid block exekveras alltid, till skillnad från initiala block som endast körs en gång i början av simuleringen. Alltid-blocket bör ha en känslig lista eller en fördröjning kopplad till sig
Den känsliga listan är den som talar om för blocket alltid när kodblocket ska köras.
Syntax
De Verilog blockera alltid följande syntax
always @ (event) [statement] always @ (event) begin [multiple statements] end
Exempel
textstorlekar i latex
Symbolen @ efter reserverat ord alltid , indikerar att blocket kommer att utlösas på villkoret inom parentes efter symbolen @.
always @ (x or y or sel) begin m = 0; if (sel == 0) begin m = x; end else begin m = y; end end
I exemplet ovan beskriver vi en 2:1 mux, med ingången x och y. De detta är den valda ingången, och m är mux-utgången.
I vilken kombinationslogik som helst ändras utdata när indata ändras. När denna teori tillämpas på alltid block, måste koden inuti blocken alltid exekveras när indata- eller utdatavariablerna ändras.
OBS: Den kan driva reg och heltalsdatatyper men kan inte driva tråddatatyper.
Det finns två typer av känsliga listor i Verilog, till exempel:
maven installera
- Nivåkänslig (för kombinationskretsar).
- Kantkänslig (för flipflops).
Koden nedan är samma 2:1 mux, men utgången m är nu en flip-flop-utgång.
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></=>
Lista över behov av känslighet
Alltid-blocket upprepas kontinuerligt under en simulering. Känslighetslistan ger en viss känsla av timing, d.v.s. närhelst någon signal i känslighetslistan ändras, triggas alltid blocket.
Om det inte finns några tidsstyrningssatser inom ett alltid-block, kommer simuleringen att hänga på grund av en oändlig slinga med noll fördröjning.
Blockera till exempel alltid försök att invertera värdet på signalen clk. Satsen exekveras efter varje 0-tidsenhet. Därför körs det för alltid på grund av frånvaron av en försening i uttalandet.
// 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;
Om känslighetslistan är tom bör det finnas någon annan form av tidsfördröjning. Simuleringstiden förlängs av en fördröjningssats inom alltid-konstruktionen.
always #10 clk = ~clk;
Nu görs klockinversionen efter var tionde tidsenhet. Det är därför den riktiga Verilog designkoden alltid kräver en känslighetslista.
OBS: Explicita fördröjningar kan inte syntetiseras till logiska grindar.
Använder alltid block
Ett alltid-block kan användas för att realisera kombinations- eller sekventiella element. Ett sekventiellt element som flip flop blir aktivt när det förses med en klocka och återställs.
På liknande sätt blir ett kombinationsblock aktivt när ett av dess ingångsvärden ändras. Dessa hårdvarublock arbetar alla samtidigt oberoende av varandra. Kopplingen mellan var och en är det som avgör dataflödet.
Ett alltid blockering görs som en kontinuerlig process som triggas och utför någon åtgärd när en signal inom känslighetslistan blir aktiv.
I följande exempel exekveras alla satser inom alltid-blocket vid varje positiv kant av signalen clk
lista metoder java
// execute always block at the positive edge of signal 'clk' always @ (posedge clk) begin [statements] end
Sekventiell elementdesign
Koden nedan definierar en modul som kallas tff som accepterar datainmatning, klocka och aktiv-låg återställning. Här utlöses alltid blocket antingen vid den positiva kanten av clk eller den negativa kanten av rstn .
1. Den positiva kanten på klockan
Följande händelser inträffar vid den positiva kanten av klockan och upprepas för alla positiva kanten av klockan.
Steg 1: Först, if-satsen kontrollerar värdet för aktiv-låg återställning rstn .
- Om rstn är noll, då bör utgången q återställas till standardvärdet 0.
- Om rstn är ett, betyder det att återställningen inte tillämpas och bör följa standardbeteendet.
Steg 2: Om föregående steg är falskt, då
- Kontrollera värdet på d, och om det visar sig vara ett, invertera sedan värdet på q.
- Om d är 0, bibehåll värdet på q.
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></=>=>=>