Verilog Essentials: Een beknopt overzicht
Alle behaviorale code wordt geschreven binnen module en endmodule. Wat je ook wilt ontwerpen, het gaat in een module blok. Het mag of mag geen poorten hebben - om signalen binnen te laten komen als input of te laten ontsnappen als output.
Module
De lege module in het voorbeeld heet testbench. Je kunt het noemen zoals je wilt, mits alfanumeriek en kan '_' bevatten.
module testbench; endmoduleBekijk een andere module. Het heeft een paar signalen (d, clk, rstb) als inputs en q als output.
module dff (input d, clk, rstb, output q); endmoduleDatatypes
Nu we gezien hebben hoe een module eruitziet, kijken we wat er in een module kan, via de testbench-module. Er zijn primair twee datatypes in Verilog:
- reg
- wire
reg datatype houdt waarden vast als een variabele, terwijl een wire analoog is aan een elektrische draad die continu gedreven moet worden. Meestal wordt wire gebruikt om tussen modules en andere signalen te verbinden.module testbench;
reg d; reg rst_b; reg clk; wire q;
endmoduleToewijzingen
Verilog heeft drie basale blokken:
always @ (voorwaarde) | altijd uitgevoerd wanneer voorwaarde voldaan is |
initial | wordt één keer uitgevoerd bij simulatiestart |
assign [LHS] = [RHS] | Waarde van LHS wordt bijgewerd wanneer RHS verandert |
Enkele regels om te onthouden:
regkan alleen ininitialenalwaysblokken toegewezen wordenwirekan alleen viaassignstatement een waarde krijgen- Als er meerdere statements in een initial/always blok zijn, moeten ze in
begin .. endgewrapt worden
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
endmoduleLet op uit het bovenstaande voorbeeld:
- Omdat er meerdere regels voor
initialblok zijn, worden begin en end gebruikt - Signalen d, rst_b, clk worden in initial-blok toegewezen, omdat ze type
regzijn - Code in initial-blok wordt uitgevoerd op 0ns, simulatiestart
- Omdat er geen voorwaarde is voor
alwaysblok, loopt het als oneindige lus in C - # stelt tijdsvertraging voor. #10 vertelt simulator tijd met 10 eenheden voort te schrijden.
clk = ~clk;toggelt de klokwaarde, en door #10 ervoor, toggelt klok elke 10 tijdseenheden.$finishis de manier om een simulatie te beëindigen. Hier loopt het 100 tijdseenheden en stopt.
Verilog
- Verilog beheersen: Complete tutorial voor digitale schakelingontwerp
- Verilog concatenatie beheersen: Een praktische gids
- Verilog-toewijzingen begrijpen: types, syntax en best practices
- Verilog Blocking vs. Non-Blocking: belangrijkste verschillen uitgelegd
- Verilog-functies beheersen voor efficiënt RTL-ontwerp
- Verilog Tasks begrijpen: Functions vs Tasks, Syntax en Gebruik
- Verilog Hiërarchische Referentie Scope: Naamconflicten in Modules en Blokken vermijden
- Verilog Clock Generator: Ontwerp & Implementatie Gids
- Verilog Math Functions beheersen voor efficiënt Hardware-ontwerp
- Verilog $timeformat beheersen: Precisie en Weergave-controle
- Verilog Timescales begrijpen en printen in elke Scope