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:
reg
kan alleen worden toegewezen aaninitial
enalways
blokkenwire
kan alleen een waarde worden toegewezen viaassign
verklaring- 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
initial
blok, begin en einde worden gebruikt - Signalen d, rst_b en clk worden toegewezen binnen een eerste blok, omdat ze van het type
reg
zijn - Code in het initiële blok wordt uitgevoerd op 0ns, d.w.z. start van simulatie
- Omdat er geen voorwaarde is voor de
always
blok, 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.$finish
is de manier om een simulatie te beëindigen. In dit geval zal het 100 tijdseenheden lopen en afsluiten.
Verilog