In Verilog is het altijd-blok een van de procedurele blokken. Verklaringen binnen een Always-blok worden opeenvolgend uitgevoerd.
Een Always-blok wordt altijd uitgevoerd, in tegenstelling tot initiële blokken die aan het begin van de simulatie slechts één keer worden uitgevoerd. Het altijd-blok moet een gevoelige lijst of een daaraan gekoppelde vertraging hebben
statische functie in Java
De gevoelige lijst is degene die het Always-blok vertelt wanneer het codeblok moet worden uitgevoerd.
Syntaxis
De Verilog blokkeer altijd de volgende syntaxis
always @ (event) [statement] always @ (event) begin [multiple statements] end
Voorbeelden
Het symbool @ na gereserveerd woord altijd , geeft aan dat de blokkering wordt geactiveerd bij de voorwaarde tussen haakjes na symbool @.
always @ (x or y or sel) begin m = 0; if (sel == 0) begin m = x; end else begin m = y; end end
In het bovenstaande voorbeeld beschrijven we een 2:1 mux, met invoer x en y. De dit is de geselecteerde invoer, en M is de mux-uitvoer.
In elke combinatorische logica verandert de uitvoer wanneer de invoer verandert. Wanneer deze theorie wordt toegepast op Always-blokken, moet de code binnen Always-blokken worden uitgevoerd wanneer de invoer- of uitvoervariabelen veranderen.
OPMERKING: Het kan reg- en integer-gegevenstypen aansturen, maar geen draadgegevenstypen.
Er zijn twee soorten gevoelige lijsten in Verilog, zoals:
'kruskal's algoritme'
- Niveaugevoelig (voor combinatiecircuits).
- Randgevoelig (voor flip-flops).
De onderstaande code is dezelfde 2:1 mux, maar de uitvoer M is nu een flip-flop-uitgang.
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></=>
Behoefte aan gevoeligheidslijst
Het altijd-blok herhaalt zich continu tijdens een simulatie. De gevoeligheidslijst brengt een bepaald gevoel van timing met zich mee, dat wil zeggen dat wanneer een signaal in de gevoeligheidslijst verandert, het altijd-blok wordt geactiveerd.
Als er geen timingcontrole-instructies zijn binnen een altijd-blok, loopt de simulatie vast vanwege een oneindige lus met nulvertraging.
Blokkeer bijvoorbeeld altijd pogingen om de waarde van het signaal clk om te keren. De instructie wordt na elke 0-tijdseenheid uitgevoerd. Daarom wordt het voor altijd uitgevoerd vanwege het ontbreken van een vertraging in de instructie.
// 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;
Als de gevoeligheidslijst leeg is, zou er een andere vorm van tijdsvertraging moeten zijn. De simulatietijd wordt vooruitgeschoven door een delay-instructie binnen de altijd-constructie.
always #10 clk = ~clk;
Nu wordt de klok omgedraaid na elke 10 tijdseenheden. Daarom vereist de echte Verilog-ontwerpcode altijd een gevoeligheidslijst.
OPMERKING: Expliciete vertragingen kunnen niet in logische poorten worden gesynthetiseerd.
Gebruik van altijd blokkeren
Een altijd-blok kan worden gebruikt om combinatorische of opeenvolgende elementen te realiseren. Een sequentieel element zoals een flip-flop wordt actief wanneer het wordt voorzien van een klok en reset.
Op dezelfde manier wordt een combinatorisch blok actief wanneer een van zijn invoerwaarden verandert. Deze hardwareblokken werken allemaal gelijktijdig, onafhankelijk van elkaar. De verbinding tussen beide bepaalt de gegevensstroom.
Een altijd-blok wordt gemaakt als een continu proces dat wordt geactiveerd en een actie uitvoert wanneer een signaal binnen de gevoeligheidslijst actief wordt.
In het volgende voorbeeld worden alle instructies binnen het altijd-blok uitgevoerd op elke positieve flank van het signaal clk
git push-opdracht
// execute always block at the positive edge of signal 'clk' always @ (posedge clk) begin [statements] end
Sequentieel elementontwerp
De onderstaande code definieert een module genaamd tff die een data-invoer, klok en actief-laag-reset accepteert. Hier wordt het altijd-blok geactiveerd aan de positieve rand van de kl of de negatieve rand van eerste .
1. De positieve flank van de klok
De volgende gebeurtenissen vinden plaats aan de positieve flank van de klok en worden herhaald voor alle positieve flanken van de klok.
Stap 1: Ten eerste controleert de if-instructie de waarde van active-low reset eerste .
- Als eerste nul is, dan moet uitgang q worden teruggezet naar de standaardwaarde 0.
- Als eerste één is, betekent dit dat reset niet wordt toegepast en het standaardgedrag moet volgen.
Stap 2: Als de vorige stap onwaar is, dan
- Controleer de waarde van d, en als blijkt dat deze één is, keer dan de waarde van q om.
- Als d 0 is, behoud dan de waarde van 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></=>=>=>