Verilog - In een notendop
Alle gedragscode is geschreven in module en endmodule . Dus welk digitaal ontwerp je ook wilt maken, het past in een module blok. Het kan al dan niet poorten hebben gedefinieerd - laat signalen het blok binnenkomen als input of ontsnap aan het blok als output .
Module
De lege module in het onderstaande voorbeeld heet testbench . Je kunt het een naam geven die je wilt, behalve dat het alfanumeriek moet zijn en '_' mag bevatten.
module testbench;
endmodule
Laten we naar een andere module kijken. Het heeft een paar signalen (d, clk, rstb ) gedeclareerd als invoer en q gedeclareerd als een output.
module dff (input d,
clk,
rstb,
output q);
endmodule
Gegevenstypen
Nu we hebben gezien hoe een module eruitziet, laten we eens kijken wat er in een module kan worden geplaatst, door nogmaals naar de testbench-module te kijken. Er zijn hoofdzakelijk twee soorten datatypes in verilog:
- reg
- draad
reg datatype wordt gebruikt om waarden als een variabele vast te houden, terwijl een wire is gewoon analoog aan een elektrische draad, die continu moet worden aangedreven. Dus typisch wire wordt gebruikt om verbinding te maken tussen meerdere modules en andere signalen.
module testbench;
reg d;
reg rst_b;
reg clk;
wire q;
endmodule
Opdrachten
Verilog heeft drie basisblokken:
always @ (staat ) | altijd uitgevoerd als aan de voorwaarde is voldaan |
initial | wordt slechts één keer uitgevoerd, wanneer de simulatie begint |
assign [LHS] =[RHS] | Waarde van LHS wordt bijgewerkt wanneer RHS verandert |
Er zijn een paar regels om in gedachten te houden bij het schrijven van Verilog:
regkan alleen worden toegewezen aaninitialenalwaysblokkenwirekan alleen een waarde worden toegewezen viaassignverklaring- Als er meerdere uitspraken in een initiaal/altijd . staan blok, moeten ze worden ingepakt in
begin .. end
module testbench;
reg d;
reg rst_b;
reg clk;
wire q;
initial begin
d = 0;
rst_b = 0;
clk = 0;
#100 $finish;
end
always begin
#10 clk = ~clk;
end
endmodule
Opmerking het volgende uit het bovenstaande voorbeeld:
- Omdat er meerdere regels zijn voor
initialblok, begin en einde worden gebruikt - Signalen d, rst_b en clk worden toegewezen binnen een eerste blok, omdat ze van het type
regzijn - Code in het initiële blok wordt uitgevoerd op 0ns, d.w.z. start van simulatie
- Omdat er geen voorwaarde is voor de
alwaysblok, het zal lopen als een oneindige lus in C - # wordt gebruikt om tijdvertraging weer te geven. #10 vertelt de simulator om de simulatietijd met 10 eenheden te verlengen.
clk = ~clk;zal de waarde van klok veranderen, en omdat #10 voor het statement wordt geplaatst, wordt de klok na elke 10 tijdseenheden omgeschakeld.$finishis de manier om een simulatie te beëindigen. In dit geval zal het 100 tijdseenheden lopen en afsluiten.
Verilog